【问题标题】:Linked List cursor won't go to the next node链接列表光标不会转到下一个节点
【发布时间】: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


【解决方案1】:

尝试使用

struct node * new_node = malloc(sizeof(struct node));

【讨论】:

  • 强制转换 malloc 的返回值是不必要的,因为 void 指针被隐式转换,事实上,这很糟糕,因为它可能隐藏了忘记包含 stdlib.h 的事实。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多