我对C相当陌生,但我的老师要求我实现一个链表。
当我在Repl中运行以下代码时。如果它工作,但是当我在windows上使用gcc在我的机器上运行它时,它不会退出while循环。
任何想法?
#include <stdio.h>
#include <stdlib.h>
struct node *newNode(int);
void llAppend(int);
void llPrint(void);
struct node {
int data;
struct node *next;
};
struct node *ll;
int main(void) {
llAppend(2);
llAppend(3);
llPrint();
}
struct node *newNode(int data) {
struct node *tmp;
tmp = malloc(sizeof (struct node));
tmp->data = data;
return tmp;
}
void llAppend(int data) {
struct node *tmp;
if (ll == NULL) {
ll = newNode(data);
return;
}
tmp = ll;
while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = newNode(data);
}
void llPrint(void) {
struct node *tmp;
tmp = ll;
while (tmp != NULL) {
printf("%dn", tmp->data);
tmp = tmp->next;
}
}
不退出while循环。什么好主意吗?
问题是你没有在newNode()
中初始化tmp->next
。因此,在while
循环中,您的代码在试图检查tmp->next
时访问未初始化的内存。
当我在Repl中运行解决方案。如果一切正常的话。
这是出于运气。当您访问未初始化的内存时,不知道会发生什么。有可能tmp->next
恰好是NULL
,所以代码在这种情况下工作。
如何解决?
您需要将newNode()
中的tmp->next
设置为NULL
,如下所示:
tmp->next = NULL;
同时,始终检查malloc
的返回值,以确保它不是NULL
。
修正版:
struct node *newNode(int data) {
struct node *tmp;
tmp = malloc(sizeof (struct node));
if (tmp == NULL) {
exit(EXIT_FAILURE);
}
tmp->data = data;
tmp->next = NULL;
return tmp;
}
另外,考虑使用valgrind
和gdb
,它们是功能强大的工具,可以帮助您调试这样的事情。
注:您的main
函数缺少return
语句—添加return EXIT_SUCCESS;
在newNode()
中不初始化next
成员。它可以是任何值,不一定是NULL
。