[英]Printing doubly linked list in C goes into infinite loop
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
我正在尝试学习双向链表。 我使用以下内容进行打印:
typedef struct Node{
int data;
struct Node* prev;
struct Node* next;
}node;
typedef struct List{
node *head;
}list;
node * createNode(int data) {
node * newNode = (node*)malloc(sizeof(node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
_Bool isEmpty(const list *L)
{
if (L->head == NULL)
return 1;
return 0;
}
_Bool insert(list *L, node *N) {
if(isEmpty(L)) {
L->head = N;
}
else{
L->head->prev = N;
N->next = L->head;
L->head = N;
}
if (L->head==N)
return 1;
return 0;
}
void _print(list *L){
node *temp=L->head;
while(temp!=NULL){
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main(int argc, char *argv[]){
list *L1=(list *)malloc(sizeof(list));
node *N1=createNode(3);
node *N2=createNode(1);
node *N3=createNode(5);
insert(L1, N3);
insert(L1, N2);
insert(L1, N1);
_print(L1);
}
作为参考,我的列表结构仅包含一个指针“head”,而我的节点结构包含下一个、上一个和数据。
它打印正确的数据但进入无限循环。
是什么原因?
问题是main
中的这一行:
list *L1=(list *)malloc(sizeof(list));
为list
分配 memory,但不对其进行初始化。
如果没有初始化, L1->head
的值可以是任何东西。 如果它碰巧不同于0
(即NULL
), insert
会将其解释为指向一个有效node
(实际上不是)。
结果是未定义的行为( UB ),这意味着任何事情都可能发生。 它可能看起来有效,它可能会崩溃,或者进入无限循环等。
为了修复它,您需要初始化L1
指向的list
。
您至少可以通过两种方式做到这一点:
calloc
替换对malloc
的调用,这也会将分配的 memory 清零: list* L1 = (list*)calloc(sizeof(list), 1);
malloc
之后添加显式初始化: list* L1 = (list*)malloc(sizeof(list)); L1->head = NULL; /* <--- initialization */
也可以加一个function来封装初始化。声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.