2012-10-11 94 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; 
} 

這是假設你的新節點將是新的頭,而不是新的尾巴。