実現したいこと
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
回答1件
あなたの回答
tips
プレビュー