2011-03-31 31 views
0

我正在做我的家庭作業,但我真的不知道如何刪除一個整數數據的節點我已經有一個代碼添加節點,我只需要刪除節點,或者你可以給我ATLEAST的算法它是這樣的如何刪除節點的任何整數數據

addnode(root,5); 
addnode(root,2); 
addnode(root,6); 
display(root); 
removenode(root,5); 
display(root); 
removenode(root,6);

做你們需要的代碼爲我的附加碼?但是我們的proff已經給了我們顯示節點顯示的代碼;

void display(struct node *head) 
{ 
    struct node *traverser; 
    traverser = head; 

    while(traverser!=NULL) 
    { 
      printf("%d\n",traverser->x); 
      traverser=traverser->next; 
    } 

}

struct node { int data; struct node *next };

雖然什麼呢traverser=traverser->next;

+0

你試圖爲你的'刪除()'代碼是什麼這麼遠? 'traverser = traverser-> next'會將'next'節點的位置存儲到'traverser'名字中 - 它遍歷列表。 – sarnold 2011-03-31 11:20:48

+0

是否要刪除具有整數值的節點?例如,如果有一個x = 5的節點,並且當用戶想要刪除該節點時,只需輸入5,那麼您必須刪除該節點。 – Badr 2011-03-31 11:23:26

+0

刪除那個節點 – 2011-03-31 12:22:13

回答

0

雖然一個問題一個問題有哪些呢橫移= traverser->未來;

它將指針設置爲隊列中的下一個元素。在您的while cicle中迭代,直到它到達空指針(隊列的末尾)。

(你沒有貼節點結構聲明,所以我只是猜測)

1

我假設你正在處理一個鏈表。這些通常是建立包含數據項和下面的名字(由此而得名)的鏈接:

struct node { 
     int data; 
     struct node *next; 
    } 

正如你所看到的鏈接是C的指針,應指向下一個條目。要開始遍歷一個列表,你通常會得到一個頭。 如果你想刪除的條目,您需要遍歷該列表,一旦你找到了你要刪除的條目,簡單地重新排列指針:

void removeEntry(int data, struct node *head) { 
     struct node *prev = NULL, *current = head; 
     while(current->data != data) { 
       prev = current; // current will always point to the entry in front of current 
       current = current->next; 
       if(current == NULL) // end of list and no match 
        return; 
     } 
     // now current is pointing to the entry you want to remove 
     // remove it just by rearrangeing pointers 
     prev->next = current->next;  
     free(current); // I assume you malloc'ed the memory 
    } 

注:請注意,我省略了錯誤檢查這裏。此外,有時頭是一個固定的項目,其中沒有數據存儲(在我的情況下工作),有時頭可以包含數據本身(在這種情況下,你需要檢查你想刪除的元素是否是第一個元素,並重新鏈接頭相應)

+0

uhmm請問這是什麼意思?當前=當前 - >下一個;? – 2011-03-31 12:00:35

+0

如何重新連接或重新連接磁頭? :| – 2011-03-31 12:13:22

+0

對不起,沒有更多的細節,但你可能想看看這裏http://cslibrary.stanford.edu/103/我不能告訴你C和指針是如何工作的,) – Chris 2011-03-31 12:27:12

0

next字段是鏈接列表中的關鍵字。每個元素都有一個後繼,就是鏈接列表。所以,當你遍歷列表時,你從第一個元素head開始,並從一個元素移動到下一個元素,直到沒有下一個元素。

要刪除條目,您需要遍歷列表直到找到該條目。然後,將前一個條目的next變量設置爲下一個條目。這樣,該元素將從列表中刪除。

1

1) 可以刪除類似(考慮頭鏈表節點不是虛擬節點即頭還包含數據)...

int flag=0; 
if(head->data==data_todel) head=head->next; //if head contains the data 
    ptr=head; 
    while(ptr->next!=NULL && flag==0) 
    { 
    if(ptr->next->data!=data_todel) 
     ptr=ptr->next;  
    else 
     { 
     flag=1; 
     break; 
     } 
    } 
if(flag) ptr->next=ptr->next->next; 

你需要使用兩個指針,以釋放已刪除節點。

2)

 

+------+-------+  +------+-------+ 
| data1| next |  | data2| next | 
+------+-------+  +------+-------+ 
    ^  |   ^
    |  |    | 
    |  +--------------+ 
+---------+ 
|traverser| 
+---------+ 

after traverser=traverser->next 

+------+-------+  +------+-------+ 
| data1| next |  | data2| next | 
+------+-------+  +------+-------+ 
      |   ^ ^
      |    |  | 
      +--------------+  | 
            | 
           +---------+ 
           |traverser| 
           +---------+ 
that means it is assigning the address of of the next node currently pointed by traverser.