2011-11-23 28 views
0

我有一個鏈接列表和一個setter函數。替換鏈接列表中的節點值

struct my_struct { 
    int value; 
    int type; 
    char *name; 
    struct my_struct *next; 
}; 

struct my_struct *setValue(struct my_struct *s, char *name, int b) { 
    if(s!=NULL) { 
     while(s != NULL) { 
      if(strcmp(s->name,name) == 0) { 
       s->value = b; 
      } 
      s=s->next; 
     } 
     return s; 
    } 
    return NULL; 
} 

這裏,name是搜索關鍵字,b是s-> value的新值。爲什麼s-> value不能改變?在這個功能之後,輸出很奇怪。我無法理解,發生了什麼事。

+0

爲什麼此函數返回始終爲NULL的指針?它應該返回什麼? – wildplasser

回答

2

您需要測試與strcmp相等的字符串,如下所示。在你的代碼中,你正在測試兩個指針是否相等[related post]

#include <string.h> 

if(strcmp(s->name, name) == 0) { // if both strings are equal 
    s->value = b; 
} 

您的return語句的位置很有趣。您正在返回最後一個被更改的項目的地址,這可能是不希望的。

按@Matthew艾斯林的評論,你的循環更改爲以下:

while(s != NULL) { 
    ... 
} 

如果您正在設置根節點到函數的返回值,s永遠是NULL後循環鏈表,因此該函數將始終返回NULL

+0

謝謝蒂姆,它的工作。但「s-> value = b」不是。 – miqbal

+0

我根據你對strcmp的回答編輯了這個問題。但問題,s->價值不能改變。 – miqbal

+0

我在名爲p的列表中添加了四個節點。然後我調用setValue(struct my_struct * p,「name_here」,new_value)。我再次顯示列表。但最近添加的是在列表中。和列表的長度是1. – miqbal

1
  • 像蒂姆·字符串比較說明
  • 你在你的while循環比較的下一個狀態,然後處理當前的狀態。即您無法更改列表中最後一個條目的值,因爲您在設置新值之前中止了while循環。
+0

我不明白第二個。 – miqbal

+1

's-> next!= NULL'應該是's!= NULL'。目前,您的循環遍歷除最後一個之外的每個節點。 –

+0

@Matt:是的,你是對的。但仍然s->值不能改變。 – miqbal

0

你已經得到了有關循環的幫助,所以我會嘗試留下什麼。

你確定s-> name和name有正確分配的內存嗎?並且兩者的長度相同並正確結束。 strcmp()函數說明了所有這一切都是真實的,以給出equal響應,以及分配的內存和任何響應的空終止。

如果您有有趣的結果,可能有某處存在內存泄漏。嘗試strncmp與最大字符數進行比較,看看會發生什麼。