1

不太确定这里发生了什么,无论我只是一个傻瓜还是编译器有点奇怪。

下面的代码应该,在调用我的 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是什么时候发出zNULL。因此它立即返回。

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

当等于while时循环终止。zNULL

您的根本问题是您没有足够的变量。您需要维护一个指向列表开头的变量,以及在迭代列表时使用的另一个变量。

你似乎也混淆了头部和尾部。术语tail用于表示为 的next节点NULL。术语head表示列表另一端的节点。

这段代码中还有很多其他奇怪的地方,但我不想全部解决,因为您只询问了一个特定问题,而我怀疑这是家庭作业。

于 2011-11-26T15:53:36.330 回答
1

您的程序执行getchar, 和scanf之后。执行后,缓冲区中getchar仍然有 a '\n',这就是scanf读取的内容。

在读取字符后,您可以通过从缓冲区读取字符来解决此问题.

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