不确定这里发生了什么,无论我是傻瓜还是编译器奇怪的东西。
下面的代码应该在调用我的searchList函数后,从用户那里获取输入,但是程序只是终止,甚至不是seg faulting,它实际上只是结束。有点傻吗?
编辑: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;
}
答案 0 :(得分:1)
当searchList
为z
时,您致电NULL
。因此它会立即返回。
while ( z != NULL) {
printf("%c", z->c);
z = z->next;
}
search_result = searchList(z);
当while
等于z
时,NULL
循环终止。
您的根本问题是您没有足够的变量。您需要维护一个变量以指向列表的开头,并在迭代列表时使用另一个变量。
你似乎也混淆了头尾。术语 tail 用于表示next
为NULL
的节点。术语 head 表示列表另一端的节点。
这段代码还有很多其他的奇怪之处,但我不想全部解决这些问题,因为你只询问了一个特定的问题而我怀疑这是作业。
答案 1 :(得分:1)
您的程序执行getchar
,然后执行scanf
。执行getchar
后,缓冲区中仍然有'\n'
,这就是scanf
读取的内容。
在阅读.
字符后,您可以通过读取缓冲区中的字符来解决此问题:
while (( c = getchar()) != '.') {
head = insertNode(c, head);
}
while (getchar() != '\n');