gpt4 book ai didi

c - 遍历双向链表永远运行(尽管有明显的 NULL 终止符)

转载 作者:行者123 更新时间:2023-11-30 18:21:21 27 4
gpt4 key购买 nike

我的 C 双向链表实现似乎无法正常工作。我担心这可能是由于我对 C 中指针的粗略了解(来自对解释语言的无知)。当我运行此代码时,似乎 print_list() 会永远运行,即使它应该next 字段为 NULL 终止.

#include<stdio.h>

typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;

void print_list(Node* head) {
Node* cursor = head;
while(cursor != NULL) {
printf("data: %d\n", cursor->data);
cursor = cursor->next;
}
}

void push_node(Node* head, int data) {
Node node = {data, NULL, NULL};
Node* cursor = head;
while(cursor->next != NULL) {
cursor = cursor->next;
}
cursor->next = &node;
node.prev = cursor;
}

int main() {
Node root = {0, NULL, NULL};
push_node(&root, 1);
push_node(&root, 2);
print_list(&root);
return 0;
}

我做错了什么?任何帮助将不胜感激。

最佳答案

您的代码不起作用,因为 Node node = { data, NULL, NULL }; 创建了一个作用域为函数 push_node 的局部变量 node >。一旦该函数返回,您将使用超出范围的本地地址,这是未定义的行为。相反,请使用 malloccalloc 为 Node 分配空间。

此外,当 head 指针为 NULL 时,您的 push_node 函数无法正确处理这种情况。有几个修复程序可以解决此问题。一种方法是检查 NULL,如果是,则返回新指针作为新的 head

此外,您应该编写一个函数来在完成后删除列表。

Node *push_node(Node* head, int data) 
{
Node *node = malloc(sizeof(*node));
node->data = data;
node->prev = node->next = NULL;
Node* cursor = head;
if (cursor == NULL)
{
head = node;
}
else
{
while(cursor->next != NULL) {
cursor = cursor->next;
}
cursor->next = node;
node->prev = cursor;
}
return head;
}

void free_list(Node *head) {
if(head != NULL)
{
Node *next = head->next;
free(head);
head = next;
}
}

int main() {
Node *root = NULL;
root = push_node(root, 1);
root = push_node(root, 2);
print_list(root);
free_list(root);
return 0;
}

关于c - 遍历双向链表永远运行(尽管有明显的 NULL 终止符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com