2012-10-11 57 views
1

我正在尝试构建我的第一个链接列表,并已阅读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; 
} 

虽然此编译没有错误,但它不能正常工作。我认为问题是列表写入函数的最后两条语句,但我不确定。对于我做错什么的暗示将会非常感激。

回答

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。对于全局节点,您将从一个肯定存在的节点开始,但其下一个指针可能为空。

+0

...并且其错误代码始终为0 – Vlad

0

errorList应该是一个指针

你也需要知道什么是最后一个节点,这将被修改 链表的头不会被修改第一个节点(不是第一个节点),它将被使用只有当你想从列表开始旅行时。

1

那么,问题是与最后一行:你只是覆盖旧的错误节点中的数据

您可能需要的是让头部(指向第一个节点的指针)全局可访问,而不是第一个节点本身。这样你不需要在你的列表中伪造一个条目。

(但是要注意,你的代码是不是线程安全的。)

代码:

errorNode* pGlobalErrorList = NULL; 

// in errorListWrite 
newNode->next = pGlobalErrorList; 
pGlobalErrorList = newNode; 
1

你的头(errorList)应该是一个指针,除非你有需要的节点与0值的初始入口应该被初始化为NULL:

struct errorNode* errorList = NULL; 

那么你的功能需要重新分配errorList正确。

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

    newNode->error = error; 
    newNode->next = errorList; 

    errorList = newNode; 
} 

这是假设你的新节点将是新的头,而不是新的尾巴。