【问题标题】:C linked list head pointing to itself?C链表头指向自己?
【发布时间】:2016-11-13 22:31:16
【问题描述】:

这是我的 addNode 方法的代码 sn-p。出于某种原因,我的头节点指向自身。每当我尝试打印出链表的内容时,我得到的只是我头脑中的内容。

我已经知道链表,但我正在测试是否可以使用直接结构而不是它们的指针在链表中使用。

struct Node{
    char* data;
    struct Node* next;
};

// Global variables
int numberOfElements = 0;
struct Node* head = NULL;

void addNode(char* inputString){
    struct Node newNode;
    newNode.data = inputString;
    if(numberOfElements != 0){
        newNode.next = head;
    }
    else{
        newNode.next = NULL;
    }
    head = &newNode;
    numberOfElements++;
}

附:如果无法从这里推断出错误,那么我猜错误在我的代码中的其他地方。如果是这样,我也可以把它放在这里。

谢谢

【问题讨论】:

  • 您的struct Node 没有.string 属性。这甚至可以编译吗?
  • 我的错,一个错字。

标签: c linked-list nodes


【解决方案1】:
  • 首先,您的代码声明了一个局部变量newNode 并尝试将其包含到列表中。

    局部变量在函数退出时被销毁。当addNode 退出时,newNode 会发生这种情况。您的列表最终处于无效状态 - 您的 head 最终指向无处。这就是导致您正在观察的行为的原因。 (当您尝试将其打印出来时,该行为肯定是未定义的。)

    您必须在动态内存中分配您的节点对象,以确保它们“永远”存在或只要您希望它们存在。

  • 其次,您的节点添加逻辑过于复杂。看来您总是计划在列表的开头添加一个新节点。在这种情况下,新节点的next 字段应该始终设置为指向前一个head。整个ifnewNode.next = NULL 分支是完全没有必要的。

【讨论】:

  • 哦,谢谢,这完全有道理。但是对于第二点,如果我不做newNode.next = NULL,那不是问题吗?假设我只有 1 个元素,在这种情况下,newNode.next 可能有垃圾值,如果我不将其设为 NULL?
  • @lufork:在修改head之前,您必须始终无条件地设置newNode.next = head;。这样你就永远不会在newNode.next 上有垃圾值。最初head 为空(空列表),这意味着在第一次添加时,上面的内容将等同于newNode.next = NULL;。 IE。它就像你的版本一样工作,只是没有所有不必要的分支。你的整个if 相当于一个newNode.next = head;
猜你喜欢
  • 2021-11-19
  • 2013-04-22
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多