2015-11-06 100 views
-5

我有這段代碼。它會刪除數據,但它必須逐個刪除顯示用戶刪除內容的數據。它必須從頭到尾和頭尾刪除。如何在鏈接列表中刪除

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

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

int addnode(node *head, char c){ 
    node *temp; 
     temp = (node *) malloc(sizeof(node)); 
     temp->data=c; 
     temp->next=head->next; 
     head->next=temp; 
     return 0; 
} 

int deletenode(node *head){ 
    struct node *x; 
    node *prev = head; 
    while(prev->next != NULL && prev->next != x) 
     prev = prev->next; 

    if(prev->next==NULL) 
    return; 
     prev->next=prev->next->next; 
    free(x); 
    return; 
} 

int main(void){ 

    node head, *current; 
    head.next=NULL; 
    addnode(&head, 'a'); 
    addnode(&head, 'b'); 
    addnode(&head, 'c'); 

    current=head.next; 

    while(1){ 
     printf("%c", current->data); 
     if(current->next == '\0') break; 
     current=current->next; 
    } 

    printf("-%c", deletenode(&head)); 
    printf("-%c", deletenode(&head)); 
    printf("-%c", deletenode(&head)); 

return 0; 
} 

我的代碼只打印: C B A - - - 預先感謝

+0

'deletenode'不返回任何內容。它甚至編譯? –

+0

您的程序編譯時會發出警告。你正在聲明一個你沒有在任何地方定義的結構節點(應該是節點或結構_node) – Guillaume

+1

什麼是你想要問的實際? 噢 - ''deletenode'函數中的''x似乎沒有初始化... – Matso

回答

0

一個簡單的方法是標記列表中的「已刪除」的一個節點,並一氣呵成刪除它們在必要時。你只需要通過添加一個額外的字段來修改你的結構(例如'int deleted')。

編輯:

我在這裏錯了,對不起!

如果您想要從頭到尾刪除一個列表並尾對頭,那麼您的列表最好是雙向鏈接的,即每個節點必須有兩個指針,其中'next'指向下一個節點並且'prev '指向前一個節點。否則,在兩個方向上遍歷列表都不是非常有效和方便。

另外,如果我們將一個節點標記爲「已刪除」,但並未真正刪除它。我們可以實現一個清除列表的方法,它通過節點逐個清除列表,而不用擔心我們可能弄亂指針,特別是當程序中使用列表時。

+0

而且什麼時候會是_necessary_呢? – Matso

+0

當程序被終止,中斷或其他。 – Tamtam2016