質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

540閲覧

キーボードから入力された名前に対応するノード をリストから削除して一覧表示

yuma1919

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/03/04 13:24

編集2023/03/06 13:45

実現したいこと

c言語で循環・重連結リストの問題をしているのですがエラーは出ないのですが適切に動作しません。
循環・重連結リストから特定のデータを削除したリストの一覧を表示させているのですが全て最後のリストの要素になってしまいます。

前提

ここに質問の内容を詳しく書いてください。
c言語で循環・重連結リストの問題をしているのですがエラーは出ないのですが適切に動作しません。
循環・重連結リストから特定のデータを削除したリストの一覧を表示させているのですが全て最後のリストの要素になってしまいます。

ソースコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct __Soccercheck
{
char name[256];
int Ranking ;
int Uniform ;
int age ;
int Number ;
int Games ;
struct __Soccercheck *next;
struct __Soccercheck *prev;
} Soccercheck;

int main(void)
{
Soccercheck *dommy = (Soccercheck *)malloc(sizeof(Soccercheck));
Soccercheck *head = dommy;
Soccercheck *tail = dommy;
dommy->next = dommy;
dommy->prev = dommy;

Soccercheck *x = malloc(sizeof(Soccercheck));
strcpy(x->name, "モハメド・サラー");
x->Ranking = 1;
x->Uniform = 11;
x->age = 29;
x->Number = 23;
x->Games = 35;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ソン・フンミン");
x->Ranking = 1;
x->Uniform= 7;
x->age = 29;
x->Number = 23;
x->Games = 35;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "クリスティアーノ・ロナウド");
x->Ranking = 3;
x->Uniform= 7;
x->age = 37;
x->Number = 18;
x->Games = 30;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ハリー・ケーン");
x->Ranking = 4;
x->Uniform = 10;
x->age = 28;
x->Number = 17;
x->Games = 37;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "サディオ・マネ");
x->Ranking = 5;
x->Uniform = 10;
x->age = 30;
x->Number = 16;
x->Games = 34;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ディエゴ・ジョッタ");
x->Ranking = 6;
x->Uniform = 20;
x->age = 25;
x->Number = 15;
x->Games = 35;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ケヴィン・デ・ブライネ");
x->Ranking = 6;
x->Uniform = 17;
x->age = 30;
x->Number = 15;
x->Games = 30;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ジェイミー・ヴァーディ");
x->Ranking = 6;
x->Uniform= 9;
x->age = 35;
x->Number = 15;
x->Games = 25;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ウィルフリード・ザハ");
x->Ranking = 9;
x->Uniform =11 ;
x->age = 29;
x->Number = 14;
x->Games = 33;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

x = malloc(sizeof(Soccercheck));
strcpy(x->name, "ラヒム・スターリング");
x->Ranking = 10;
x->Uniform = 7;
x->age = 27;
x->Number = 13;
x->Games = 30;

x->next = tail->next;
x->prev = tail;
tail->next->prev = x;
tail->next = x;
tail = tail->next;
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);

char name[10000];
printf("\n誰のデータを削除しますか?: ");
scanf("%[^\n]%*c", name);
printf("%sさんのデータを削除します。\n", name);
Soccercheck *tmp = head->next;

while (1)
{
if (strcmp(tmp->name, name) == 0)
{
tmp->prev->next = tmp->next;
tmp->next->prev = tmp->prev;
free(tmp);
break;
}
tmp = tmp->next;

if (tmp == head) { printf("\n%sさんのデータは見つかりませんでした。", name); break; }

}

tmp = head->next;
while (1)
{
printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games);
tmp = tmp->next;
if (tmp == head)
break;
}

return 0;
}

試したこと

補足情報(FW/ツールのバージョンなど)

c言語
VScode

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/03/04 15:23

c と c++ は違う言語ですので、タグは c だけで良いと思います。 コードの提示はコードのマークダウンをご利用ください。 マークダウンに付きましてはヘルプを参照してください。
yuma1919

2023/03/06 13:44

コメントご指摘ありがとうございます! コメントに気づくのが遅くなって申し訳ありません。 違う言語だったのですね。知識が浅く申し訳ありませんでした。
guest

回答1

0

ベストアンサー

全て最後のリストの要素になってしまいます。

tmp->name, tmp->Ranking, ... ではなく、
tail->name, tail->Ranking, ... を表示しているからですね。

同じコードの繰り返しが酷いと思いませんか?
同じコードは一つの関数にまとめましょう。

C

1Soccercheck *append(Soccercheck *tail, 2 const char *name, int rank, int uni, int age, int num, int game) 3{ 4 Soccercheck *x = malloc(sizeof(Soccercheck)); 5 strcpy(x->name, name); 6 x->Ranking = rank; 7 x->Uniform = uni; 8 x->age = age; 9 x->Number = num; 10 x->Games = game; 11 12 x->next = tail->next; 13 x->prev = tail; 14 tail->next->prev = x; 15 tail->next = x; 16 tail = tail->next; 17 printf("選手名%s, サッカープレミアリーグ得点ランキング%d, 背番号%d, 年齢%d, ゴール数%d, 出場試合数%d\n", tail->name, tail->Ranking, tail->Uniform, tail->age, tail->Number, tail->Games); 18 19 return tail; 20} 21 22int main(void) 23{ 24 Soccercheck *dommy = (Soccercheck *)malloc(sizeof(Soccercheck)); 25 Soccercheck *head = dommy; 26 Soccercheck *tail = dommy; 27 dommy->next = dommy; 28 dommy->prev = dommy; 29 30 tail = append(tail, "モハメド・サラー", 1, 11, 29, 23, 35); 31 tail = append(tail, "ソン・フンミン", 1, 7, 29, 23, 35); 32 tail = append(tail, "クリスティアーノ・ロナウド", 3, 7, 37, 18, 30); 33 tail = append(tail, "ハリー・ケーン", 4, 10, 28, 17, 37); 34 tail = append(tail, "サディオ・マネ", 5, 10, 30, 16, 34); 35 tail = append(tail, "ディエゴ・ジョッタ", 6, 20, 25, 15, 35); 36 tail = append(tail, "ケヴィン・デ・ブライネ", 6, 17, 30, 15, 30); 37 tail = append(tail, "ジェイミー・ヴァーディ", 6, 9, 35, 15, 25); 38 tail = append(tail, "ウィルフリード・ザハ", 9, 11, 29, 14, 33); 39 tail = append(tail, "ラヒム・スターリング", 10, 7, 27, 13, 30); 40}

投稿2023/03/05 01:51

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問