2012-04-16 45 views
0

好吧我一直在這個工作了幾個小時,現在無法找出我的問題。我有一個雙鏈表,當我嘗試向它添加一個新節點時,它將更改鏈表中的所有值。鏈接列表添加節點更改所有節點值而不是隻有一個

現在這就是我:

void createSub(sibs *root, char *name, int size) { 

    if(root->subSibs == NULL) { 
      root->subSibs = (sibs *)malloc(sizeof(sibs)); 
      root->subSibs->name = name; 
      root->subSibs->time_stamp = createTimeStamp(); 
      root->subSibs->nextSib = NULL; 
    } 

    sibs *temp = root->subSibs; 
    if(temp != NULL) { 
    while(temp->nextSib != NULL) 
      temp = temp->nextSib; 
    } 
    sibs *t = (sibs *)malloc(sizeof(sibs)); 

    t->name = name; 
    t->time_stamp = createTimeStamp(); 
    t->nextSib = NULL; 

    if(temp != NULL) 
      temp->nextSib = t; 

    printf("root->subSibs->name = %s\n", root->subSibs->name); 
    (root->numSub)++; 

}

這可能不是完美考慮到我已經改變了100萬次。有人能告訴我我在這裏做錯了嗎?

root是我正在使用的根節點,而subSibs是指向鏈接列表的指針。我正在做的是向root->subSibs指向的鏈接列表中的每個節點添加名稱和時間戳。

我出去的是:

createSub(root, name1, size); 

打印:

root->subSibs1: name1; 

createSub(root, name2, size); 

打印:

root->subSibs1: name2; 
root->subSibs2: name2; 

等等

它可能會有些真的真的愚蠢的錯誤,但任何幫助會b令人驚歎。我一直在努力幾個小時,只需要有人告訴我爲什麼它會改變名稱。

另外,如果我做strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->name打印垃圾,然後root->subSibs2->name打印正確的名稱,然後root->subSibs3->name打印垃圾(同subSibs1->name)等等...

+0

是否有一個其他塊錯過後初始如果? – 2012-04-16 08:55:02

回答

3
t->name = name; 

您正在複製指針。相反,你可能想複製的記憶:

t->name = strdup(name); 

或者:

t->name = malloc(strlen(name) + 1); 
strcpy(t->name, name); 
+0

謝謝。我知道這會是這樣一個愚蠢的錯誤。我花費的時間和小時我完全忘記了strdup,(顯然)不是mallocing t-> name;我很欣賞快速反應! – eric 2012-04-16 08:43:22

+0

@eric使用這些解決方案中的一個**。 'strdup'本身調用'malloc'。並記住'免費'。 – cnicutar 2012-04-16 08:44:09

1

沒有更多的信息(如你如何調用該函數),我想,你有一個緩衝區(可能是一個字符數組)並且您每次撥打createSubs時都將地址傳遞給同一緩衝區。這將使您創建的每個節點都指向相同的緩衝區,該緩衝區將始終包含輸入的最後一個字符串。

1

在你的節點中,的名字是char *。換句話說,它可以指向一些任意的內存位置。首先它具有一些垃圾價值,所以它從程序員的角度來看並沒有指向任何東西,也不能用來存儲價值 - 這就是你所做的。

現在,如果我們分配一部分內存足夠大,以存儲參數指向的字符串char * name,我們可以讓您的節點名稱指向它。一旦你這樣做,你可以複製參數名稱*節點名稱*

相關問題