2017-05-28 168 views
0

我正在使用鏈接列表編寫一個簡單的字典程序。我想搜索詞典中的一個詞並刪除它。我已經編寫了代碼,但我認爲這是更耗時間的,因爲我運行循環兩次,第一次搜索節點並記下位置,第二次刪除它。從鏈接列表中搜索並刪除一個節點

struct node{ 
    char word[20]; 
    char meaning[5][100]; 
    struct node *next; 
}; 

void del(struct node *head, char *word) 
{ 
    int found = 0, position = 0, i; 
    struct node *temp = head; 
    while(temp != NULL) 
    { 
    if(strcmp(temp->word, word) == 0) 
    { 
     found = 1; 
     break; 
    } 
    temp = temp->next; 
    position++; 
    } 
    if(found == 1) 
    { 
     temp = head; 
     if(position == 0) 
     { 
      head = temp->next; 
      free(temp); 
     } 
     for(i = 0; i < position-1; i++) 
      temp = temp->next; 
     struct node *temp2 = temp->next; 
     temp->next = temp2->next; 
     free(temp2); 
     printf("Word deleted..\n"); 
    } 
    else printf("Word not found!\n"); 
} 

是否有任何替代方法來優化程序?

+1

當您運行搜索循環時,還臨時存儲您正在檢查的當前節點的父節點。找到要刪除的節點時,只需將其父節點的下一個指針設置爲即將刪除的節點,然後刪除該節點。 –

+0

我如何獲得前一個節點地址? – surjit

+0

你需要儘快刪除這個詞,只要你找到它。 –

回答

1

你只需要像這樣合併兩個週期,下面是一個代碼示例。

struct node{ 
    char word[20]; 
    char meaning[5][100]; 
    struct node *next; 
}; 

struct node *del(struct node *head, char *word) 
{int found = 0, position = 0, i; 
    struct node *temp = head; 
    struct node *prev = NULL; 
    /*You should avoid breaks because they decrease legibility*/ 
    while(temp != NULL) 
    { 

    if(strcmp(temp->word, word) == 0) 
    { 
     if(prev == NULL){ /*If the node is the head*/ 
      head = head->next; 
      free(temp); 
      return head; 
     }else{ 
      prev->next = temp->next; 
      free(temp); 
      return head; 
     } 
    } 
    prev = temp; 
    temp = temp->next; 
    } 

} 
+0

我很確定它應該是'prev-> next = temp-> next'而不是'prev = temp-> next' –

+0

代碼不會刪除節點。而是用一些垃圾值改變這個詞,並且其含義保持不變。 – surjit

+0

在使用'del()'之前,該列表具有'word = go','meaning = something'。使用'del()'列表後顯示'word = x5','意義=東西'。它取代了一些垃圾值的詞我猜 – surjit