1

ここで何が起こっているのかよくわかりません.Imがただのばかなのか、コンパイラの何かがおかしいのか.

以下のコードは、私の searchList 関数を呼び出した後、ユーザーからの入力を取得する必要がありますが、代わりに、プログラムは単に終了し、セグ フォールトさえ発生せず、文字通りただ終了します。ばかげたこと?

編集: searchNode は searchList です。タイプミスで申し訳ありません。

乾杯。

typedef struct List {
 char c;
 struct List *next;
}List;

List* insertNode(char c, List* t1);
List* addNode(void);
List* searchList(List *t1);

int main(void) {
  List *z = addNode();
  List *search_result;
  char s;
   while ( z != NULL) {
    printf("%c", z->c);
    z = z->next;
  }
  search_result = searchList(z);
return 0;
}

List *addNode(void) {
 List *head = (List*)calloc(1,sizeof(List));
 char c;
 while (( c = getchar()) != '.') {
  head = insertNode(c, head);
 }
 return head;
}

List *insertNode(char c, List* t1) {
 List *tail = (List*)calloc(1,sizeof(List));
 tail->c = c;
 tail->next = t1;
return tail;
}

List *searchList(List *t1) {
 char c;
 printf("Please enter a search term");
 scanf("%c", &c);
  while (t1 != NULL) {
   if (t1->c == c) {
   return t1;
  }
  t1 = t1->next;
 }
return 0;
}
4

2 に答える 2

1

への呼び出しsearchListは のときに行われzますNULL。したがって、すぐに戻ります。

while ( z != NULL) {
    printf("%c", z->c);
    z = z->next;
}
search_result = searchList(z);

が等しければ、whileループは終了します。zNULL

あなたの根本的な問題は、十分な変数がないことです。リストの先頭を指す変数と、リストを反復処理するときに使用する別の変数を維持する必要があります。

あなたも頭と尻尾を混同しているようです。テールという用語は、 であるノードを示すために使用されnextますNULLヘッドという用語は、リストのもう一方の端にあるノードを示します。

このコードには他にも多くの奇妙な点がありますが、それらすべてに対処したくはありません。なぜなら、あなたは 1 つの特定の問題について質問しただけであり、むしろこれは宿題だと思うからです。

于 2011-11-26T15:53:36.330 に答える
1

あなたのプログラムは を実行getcharし、scanfその後に実行します。の実行後もバッファにgetcharaがあり、それが読み取られます。'\n'scanf

文字を読み取った後、バッファから文字を読み取ることで、これを回避できます.

while (( c = getchar()) != '.') {
    head = insertNode(c, head);
}
while (getchar() != '\n');
于 2011-11-26T15:53:39.723 に答える