c - 将节点添加到全局链表

标签 c linked-list global

我正在尝试构建我的第一个链表,并阅读了 basic简介,做了以下工作。首先声明一个链表节点为:

struct errorNode {
    uint8 error;
    struct errorNode* next;
};

其次,全局定义第一个节点为:

struct errorNode errorList = {0, NULL};

这样做是为了让构成我当前项目的每个库都可以将错误插入到一个公共(public)列表中。执行此操作的函数是:

void errorListWrite(uint8 error) {
    struct errorNode* newNode = malloc(sizeof(struct errorNode));

    newNode->error = error;

    newNode->next = &errorList;
    errorList = *newNode;
}

虽然编译没有错误,但它没有按预期运行。我认为问题出在列表写入函数的最后两个语句上,但我不确定。对于我做错了什么的提示将不胜感激。

最佳答案

问题是您创建了一个循环列表。

newNode->next = &errorList;

因此 newNode 链接到全局节点。

errorList = *newNode;

这等同于errorList.error = newNode->error; errorList.next = newNode->next;. 所以现在 errorList 链接到全局节点。糟糕。

您可以改为在列表中的全局节点之后插入新节点:

newNode->next = errorList.next;
errorList.next = newNode;

这是假设您完全想要一个全局节点。如果你不这样做,那么你可以从 struct errorNode *errorList = 0; 开始,然后像这样添加一个新节点:

newNode->next = errorList;
errorList = newNode;

当你开始使用列表时,你的列表遍历可能看起来有点不同。使用全局指向节点的指针,您将从指向第一个节点的指针开始,您必须在使用前检查是否为空。对于全局节点,您将从一个确实存在的节点开始,但其下一个指针可能为空。

关于c - 将节点添加到全局链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12848765/

相关文章:

c - 针对特定处理器的优化

java - Java 中克隆列表元素

c++ - 删除 LinkedList 中的前面元素会产生垃圾

Python:局部变量神秘地更新全局变量

c - bsearch 和搜索范围?

c - 这个数组的长度是多少? c语言

java - 将集合(ArrayList)添加到ConcurrentQueue

node.js - 如何使用全局/通用node_modules代替本地node_modules?

javascript - 带参数的函数中的全局变量

c - 使用程序集访问数组中的元素