【发布时间】:2015-12-07 01:03:38
【问题描述】:
我正在尝试在 C 中创建一个链接列表,但我似乎无法弄清楚为什么我的光标不会转到下一个节点。我将当前节点设置为下一个节点,但是当我打印出光标地址时,它是相同的。我相信这导致我有一个无限循环,因为这是我的主要问题。我正在设置下一个指针:
orig_cursor = orig_cursor->next;
我的整个方法如下:
struct node* copyList()
{
if(!head)
return NULL;
struct node *head_copy = malloc(sizeof(struct node));
struct node *copy_cursor = head_copy;
struct node *orig_cursor = head;
head_copy->data = head->data;
head_copy->next = NULL;
if(orig_cursor->next)
{
while(orig_cursor)
{
copy_cursor->next = malloc(sizeof(struct node));
copy_cursor = copy_cursor->next;
printf("Original cursor pre-traversal = %d\n", orig_cursor->next);
orig_cursor = orig_cursor->next;
printf("Original cursor post-traversal = %d\n", orig_cursor->next);
copy_cursor->data = orig_cursor->data;
if(!orig_cursor->next)
{
copy_cursor->next = NULL;
break;
}
}
}
return head_copy;
}
我还使用以下 push() 函数将节点推送到列表中:
void push(int data)
{
if(!head)
{
head = malloc(sizeof(struct node));
head->data = data;
head->next = NULL;
return;
}
struct node *new_node = malloc(sizeof(struct node));
new_node->data = data;
new_node->next = head;
head = new_node;
}
【问题讨论】:
-
指针应该用
%p而不是%d打印。很可能您正在运行 64 位二进制文件,并且由于格式说明符不正确,您的指针值输出被截断。因此它只打印两个指针可能相同的前 32 位。或者,您的列表中有一个循环:-) -
感谢您提供有关 %p 的提示。但是,我的问题是我在这个列表中陷入了无限循环,我不知道为什么。
-
另外,我只是用 %p 测试了方法,指针值完全一样。
-
在这种情况下,您需要显示列表是如何构建的。当你到达这里时,问题已经出现了。另外,这个:
copy_cursor = copy_cursor->next;是错误的。您刚刚分配了copy_cursor,因此next字段包含垃圾。 -
好的,但是你需要展示
push函数以及它是如何被调用的。因为它似乎列表构造不正确。显示使用错误构造的列表并不能告诉我们为什么/如何生成不正确的列表。实际上,您确实需要提供Minimal Complete and Verifiable Example。否则只会来回询问所有相关信息。
标签: c linked-list nodes