2012-11-12 113 views
0

請我需要幫助。我的家庭作業有問題。鏈接列表刪除正在刪除錯誤的節點

這個作業很簡單。創建一個列表(1,2,3)並通過創建一個函數delnode刪除中間的數字。但它必須使用功能free()

現在,我使用鏈表方法創建了列表(1,2,3)。我想刪除數字2,但它不起作用。它應該與(1,3)一起出來,但它與(2,3)一起出來。

#include <stdio.h> 
#include <stdlib.h> 


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

typedef struct node node; 

//prototype function 
node* allocateMemory(void); 
node* insertNode(node*); 
void delnode(node*); 

int main(){ 
    int i,num; 
    node* entr = allocateMemory(); 
    node* p = NULL; 

    entr->number = 1; 
    entr->next = NULL; 

    num = 3; 

    for(i=1;i<num;i++){ 
     if(!p){ 
      p=insertNode(entr); 
     }else{ 
      p=insertNode(p); 
     } 

     p->number = i+1; 
    } 

    while(entr){ 
     if(entr->number == 2){ 
      entr->number == NULL; 
      break; 
     } 
     entr=entr->next; 
    } 

    while(entr){ 
     printf("%d\n",entr->number); 
     entr=entr->next; 
    } 

    return 0; 
} 

node* insertNode(node* current){ 
    node* newNode = allocateMemory(); 
    current->next = newNode; 
    newNode->next = NULL; 
    return newNode; 
} 


void delnode(node* current){ 
    node* temp = allocateMemory(); 
    temp = current->next->next; 
    free(current->next); 
    current = temp; 
    free(temp); 
    return ; 
} 

node* allocateMemory(void){ 
    return (node*)malloc(sizeof(node)); 
} 
+1

你試圖實現一個鏈表。 – Aesthete

+0

告訴我們你真正想要完成的事情,然後我們可以嘗試找到正確的方法。 – 0x90

+0

感謝你們的評論,我已經編輯過它。 ^^ – edisonthk

回答

2

好吧,這個功能delnode是各種搞砸了。當您嘗試刪除節點時,不需要分配更多內存。您需要將連接到之前的下一個,並刪除當前的

| prev |  | current |  | next | 
|------|  |---------|  |------| 
    /\    X    /\ 
    ||    X    || 
    |================================| 

它應該看起來更像這樣。

void delnode(node* current) 
{ 
    node* next = current->next; 
    // Now we need to find the node previous to this. 
    node* prev = entr; // From the start. 
    while(prev->next != current) { prev = prev->next; }; 
    free(current); // delete the current node. 
    prev->next = next; // Link the previous node to the next in the list. 
} 

如果你想添加三個節點,你需要改變你的循環。

node* current = entr; 
for(i=0;i<3;i++) 
{ 
    int newCount = current->number++; // Increment count. 
    current = insertNode(current); // Returns the new node. 
    current->number = newCount; // Assign new count. 
} 

如果你想與number2的刪除節點:

node* idx = entr; 
while(idx) 
{ 
    if(idx->number == 2) { delnode(idx); break; } // Delete node and break. 
    idx = idx->next; // Else, go to next node. 
} 
+0

不幸的是,它沒有在代碼snap:|中被調用 – amit

+0

@amit - 啊,我什至沒有注意到!他們仍然很好,所以我會放棄它。 – Aesthete

+0

非常感謝您!!!是的,它的工作原理和感謝您的解釋。它讓我很容易理解。 ^^ – edisonthk

4

的一些問題:

(1)要創建原始列表是[2,3],而不是[1,2,3] - 你的循環迭代對於i = 1,I = 2 - 在每次插入我+ 1 - 造成[2,3]
(2)您的刪除沒有做任何事情:

while(entr){ 
    if(entr->number == 2){ 
     entr->number == NULL; 
     break; 
    } 
    entr=entr->next; 
} 

注意entr->number == NULL僅僅是一個布爾值評估,而不是分配 - 因爲您使用operator==

(注意它會失敗operator=爲好,因爲你不希望分配NULL的價值 - 你真正想要做的是指定一個節點next場)

附:
這個數據結構的術語是一個Linked List,而不是一個「線性列表」