2013-08-29 130 views
0

我的代碼適用於鏈接列表開始處的元素,但不適用於中間或末尾的元素。感謝你的幫助!從雙向鏈表中刪除一個元素

void remove(){ 
    if (!head) 
     printf("\nNo nodes to delete. List is empty."); 
    else{ 
     int n; 
     struct node* help = head; 
     printf("Enter an element to delete: "); 
     scanf("%d", &n); 
     if(head->data == n){ 
      help-> next->prev = 0; 
      head = help -> next; 
     } else{ 
      while(help -> next){ 
       if(help -> data == n){ 
        help -> next -> prev = help -> prev; 
        help -> prev -> next = help -> next; 
       } 
       else help = help -> next; 
      } 
     } 
    } 
} 
+0

爲什麼'n'不能作爲'remove()'的參數? –

+0

@意義 - 爲什麼人們總是挑選代碼而不是回答提出的問題?你的問題與被問到的問題無關,並且發佈的代碼很可能被簡化爲發佈到SO - 而不是由提問者爲實際項目編寫的方式。 – xaxxon

+0

@shail給了我們具體的例子,說明它的失敗會有幫助,因爲你的代碼有很多問題,並且很難全部指出它們,而無需爲你重寫代碼(這不應該在SO上完成) – xaxxon

回答

1

首先,使用NULL不爲0來表示NULL。在C中,你需要。在C++中它是可選的,但是您標記了問題C.

help-> next->prev = 0; 

您從不檢查是否有第二個元素。如果列表只包含一個元素,則會失敗 - 所以它甚至不會始終用於第一個元素。

 while(help -> next){ 
      if(help -> data == n){ 

這將阻止你曾經刪除最後一個元素,因爲你停止尋找在名單一旦你(但你處理前)的最後一個元素。但是,即使你不這樣做,下一行:

   help -> next -> prev = help -> prev; 
       help -> prev -> next = help -> next; 

將導致你崩潰,如果這是最後一個,因爲它沒有檢查到有層出不窮的元素。

此外,箭頭->之前和之後的空格是非常罕見的。我建議不要再那樣做了。

+0

感謝您指出這些問題。我會盡力糾正我的代碼。 – Shail

+0

我是否應該添加一個if條件(只有在next不爲null時才執行)以執行help-> next-> prev = NULL ;?此外,我應該改變我的條件而(幫助)?我無法弄清楚如何改變while循環內的代碼。 – Shail

+0

@ Shail yes。會有很多的條件 – xaxxon

0
struct node *head, *tail; //global head & tail 

int delete_item() { 
    int del_data = 0; 
    struct node *item = head, *tmp; 
    scanf("%d", &del_data); 
    while(item){ 
     if(item->data == del_data){ 
      tmp = item; 
      if(item->next){ 
       //it's not tail 
       item->next->prev = item->prev; 
      } 
      else { 
       //it's tail 
       tail = item->prev; 
       if(tail) 
        tail->next = NULL; 
      } 
      if(item->prev){ 
       //it's not head 
       item->prev->next = item->next; 
      } 
      else { 
       //it's head 
       head = item->next; 
       if(head) 
        head->prev = NULL; 
      } 
      //free memory 
      free(tmp); 
     } 
     //move forward 
     item = item->next; 
    } 
return 0; 
} 
+2

做人們爲他們做作業是皺起了眉頭。 – xaxxon

+1

如果他會試着理解這段代碼,那麼一切都會好的。別那麼卑鄙。 – someuser