2013-05-06 84 views
0

我在這裏遇到一些小問題。刪除單個鏈表中字符串中子字符串的出現C

我必須編寫一個單獨鏈接列表的東西,從現在開始我就沒有任何問題了。我堅持在鏈接列表中作者名稱中的函數調用之後給出的子字符串出現的刪除。

節目片段:

void list_delete_element(kniha_t* inode) 
{ 
    kniha_t *actualnode = inode; 
    kniha_t *prevnode = NULL; 
    kniha_t *tempnode = NULL; 

    uchar_t needle[100]; 
    uchar_t haystack[100]; 
    ushort_t occur = 0; 

    scanf("%s", &needle); 
    lower_string(needle); 
    while(actualnode != NULL) 
    { 
     copy_string(haystack, actualnode->autori); 
     lower_string(haystack); 
     if(search_string(haystack, needle)) 
     { 
      occur++; 
      if (NULL != prevnode) 
      { 
       prevnode->next = actualnode->next; 
      } 
      else 
      { 
       inode = actualnode->next; 
      } 
      tempnode = actualnode; 
      actualnode = actualnode->next; 
      free(tempnode); 
      tempnode = NULL; 
     } 
     else 
     { 
      prevnode = actualnode; 
      actualnode = actualnode->next; 
     } 
    } 
    printf("Deleted sa %hu nodes\n", occur); 
} 


和東西,我必須加載它,忽略---:
http://pastebin.com/NPvEr3y6

的問題是,工程(:d)。直到我掃過所有的事件。

例如:
當我輸入pra時,它必須刪除所有包含「pra」的節點。它的功能就像一個魅力......但是當我只鍵入「p」時,它告訴我,所有的X事件都被釋放了,但它們留在緩衝區中,因爲我可以再次打印整個列表!


我會非常感謝,誰能給我一些建議。

回答

1

您的list_delete_element應採取kniha_t**,以便您可以刪除頭節點和修剪鏈接列表。使用當前的代碼,您刪除節點,但其他功能不知道,因爲inode沒有更改。

您,您可以更新您的代碼

void list_delete_element(kniha_t* *inode) 
{ 
    kniha_t *actualnode = *inode; 
    ... 
     if (NULL != prevnode) 
     { 
      prevnode->next = actualnode->next; 
     } 
     else 
     { 
      *inode = actualnode->next; 
     } 
    ... 
} 
+0

很多許多甚至更多的感謝隊友!它像一個魅力! – Citrus 2013-05-06 10:14:21

+1

@LászlóCitrusNagy,歡迎光臨! – Rohan 2013-05-06 10:23:25

1

這樣的說法:

tempnode = NULL; 

什麼都不做,實際上,因爲你永遠不會做任何事情tempnode除了分配和釋放馬上。

+0

謝謝你,刪除,但對刪除功能的行爲沒有任何影響:/ – Citrus 2013-05-06 10:09:20

+1

你是對的 - 它應該已經是一個註釋。抱歉。 – Elazar 2013-05-06 10:11:58

+0

沒有問題的人;)你仍然給我看那條線是無用的。謝謝你 – Citrus 2013-05-06 10:16:35