我正在尝试构建我的第一个链接列表,并且已阅读basic介绍,已完成以下操作。首先,将链表节点声明为:
struct errorNode {
uint8 error;
struct errorNode* next;
};
其次,将第一个节点全局定义为:
struct errorNode errorList = {0, NULL};
这样做是为了允许组成我当前项目的每个库将错误插入到公共列表中。执行此操作的功能是:
void errorListWrite(uint8 error) {
struct errorNode* newNode = malloc(sizeof(struct errorNode));
newNode->error = error;
newNode->next = &errorList;
errorList = *newNode;
}
虽然这个编译没有错误,但它没有按预期运行。我问题是列表写入函数的最后两个语句,但我不确定。我非常感谢你对我所做错的提示。
答案 0 :(得分:1)
好吧,问题在于最后一行:您只是覆盖旧错误节点中的数据!
您可能需要的是全局访问头部(指向第一个节点的指针),而不是第一个节点本身。这样,您的列表中就不需要伪造条目。
(请注意,您的代码不是线程安全的。)
代码:
errorNode* pGlobalErrorList = NULL;
// in errorListWrite
newNode->next = pGlobalErrorList;
pGlobalErrorList = newNode;
答案 1 :(得分:1)
问题在于您创建了一个循环列表。
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;
当您使用该列表时,您的列表遍历可能会略有不同。使用全局指针到节点,您将从指向第一个节点的指针开始,在使用之前必须检查null。对于全局节点,您将从一个明确存在的节点开始,但其下一个指针可能为空。
答案 2 :(得分:1)
你的头(errorList)应该是一个指针,应该初始化为NULL,除非你需要一个值为0的节点的初始条目:
struct errorNode* errorList = NULL;
然后你的函数需要正确地重新分配errorList。
void errorListWrite(uint8 error) {
struct errorNode* newNode = malloc(sizeof(struct errorNode));
newNode->error = error;
newNode->next = errorList;
errorList = newNode;
}
这是假设您的新节点将成为列表的新头部,而不是新尾部。
答案 3 :(得分:0)
errorList应该是指向第一个节点(不是第一个节点)的指针
您还需要知道将要修改的最后一个节点是什么 列表的头部不会被修改,只有当你想从列表的开头旅行时才会使用它。