作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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
>。一旦该函数返回,您将使用超出范围的本地地址,这是未定义的行为。相反,请使用 malloc
或 calloc
为 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/
我是一名优秀的程序员,十分优秀!