我正在尝试构建我的第一个链表,并阅读了 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/