私はプログラムに取り組んでいます。その結果、最終的にはアヒルのガチガチの模様がシミュレートされます。私が問題を読んだとき、循環リンクされたリストは私に向かって飛び出しました。私は一般的にリンクされたリストを使用することで非常に新しいですが。印刷しようとしている間に循環リンクされたリストがクラッシュする
プログラムがノードを作成して割り当てているようですが、それらを印刷しようとするとクラッシュします。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[20];
struct jimmysFriend *next;
} jimmysFriend;
jimmysFriend *createNode();
void populateList(jimmysFriend *bestFriend, int numberOfFriends);
//void duckDuckBoot();
void printList(jimmysFriend *bestFriend);
int main(void) {
int i;
int cases;
int numberOfFriends;
scanf("%d", &cases);
for (i = 0; i < cases; i++) {
scanf("%d", &numberOfFriends);
jimmysFriend *bestFriend; //head
bestFriend = NULL;
populateList(bestFriend, numberOfFriends);
printList(bestFriend);
}
return 0;
}
void populateList(jimmysFriend *bestFriend, int numberOfFriends) {
int i; //Where I actually create the circular list.
jimmysFriend *aFriend;
for (i = 0; i < numberOfFriends; i++) {
aFriend = createNode();
if (bestFriend == NULL) {
bestFriend = aFriend;
aFriend->next = aFriend;
} else
if (bestFriend != NULL) {
jimmysFriend *temptr;
aFriend->next = bestFriend;
temptr = bestFriend;
while (temptr->next != bestFriend) {
temptr = temptr->next;
}
temptr->next = aFriend;
}
}
}
jimmysFriend *createNode() { //Creates a node
jimmysFriend *aFriend;
aFriend = malloc(sizeof(jimmysFriend));
if (aFriend != NULL) {
scanf("%s", aFriend->name);
}
return aFriend;
}
void printList(jimmysFriend *bestFriend) { //Problem area?
jimmysFriend *temptr;
temptr = bestFriend;
while (temptr->next != bestFriend) {
printf("%s\n", temptr->name);
temptr = temptr->next;
}
}
明白な問題の1つは、リンクされたリストに1つのアイテムしか含まれていない場合です。その場合、 'populateList'は' bestFriend = aFriend; 'と' aFriend-> next = aFriend; 'を設定します。つまり、 'printList'の' while'ループは何も印刷せずに終了します。一般的には、whileループは、リストより少ないエントリを1つ印刷します。 – user3386109
@ user3386109あなたの言うことが意味を見るのは、リストに 'printList'の1つの項目しか含まれていないかどうかをチェックするif文を持っていることです。 – Jude
1) 'typedef struct' - >' typedef struct jimmysFriends' 2) 'aFriend = malloc(sizeof(jimmysFriend));' - > 'aFriend =(jimmysFriend *)malloc(sizeof(jimmysFriend)); ' – DimChtz