1

我正在尝试构建我的第一个链表,并且在阅读了基本介绍后,我完成了以下操作。首先,声明一个链表节点为:

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;
}

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

4

4 回答 4

2

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

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;

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

于 2012-10-11T21:36:54.070 回答
1

好吧,问题出在最后一行:您只是覆盖了旧错误节点中的数据

您可能需要的是全局可访问头(指向第一个节点的指针),而不是第一个节点本身。这样,您的列表中就不需要虚假条目。

(请注意,您的代码不是线程安全的。)

代码:

errorNode* pGlobalErrorList = NULL;

// in errorListWrite
newNode->next = pGlobalErrorList;
pGlobalErrorList = newNode;
于 2012-10-11T21:34:40.077 回答
1

您的 head (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; 
} 

这一切都假设您的新节点将成为列表的新头,而不是新的尾。

于 2012-10-11T21:44:08.647 回答
0

errorList 应该是指向第一个节点(不是第一个节点)的指针

您还需要知道这将被修改的最后一个节点是什么列表的头部不会被修改,只有当您想从列表的开头移动时才会使用它。

于 2012-10-11T21:34:05.793 回答