如何在链接列表中删除

时间:2015-11-06 06:48:29

标签: c

我有这个代码。它会删除数据,但必须逐个删除数据,向用户显示删除的内容。它必须从头到尾删除,并从头到尾删除。

#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 - - - 提前致谢

1 个答案:

答案 0 :(得分:0)

更简单的方法是将节点标记为“已删除”&#39;在列表中,必要时一次删除它们。您只需要添加一个额外的字段(例如&#39; int deleted&#39;)来修改您的结构。

编辑:

我错了,抱歉!

如果你想要从头到尾和从头到尾删除一个列表,那么你的列表必须双重链接,即每个节点必须有两个指针,其中有一个&#39; next&#39;指向下一个节点和一个&#39; prev&#39;指向上一个节点。否则,在两个方向上遍历列表都不是非常有效和方便。

此外,如果我们将某个节点标记为已删除&#39;但不是真的删除它。我们可以实施一个清晰的清单&#39;逐个节点清除列表的方法,不用担心我们可能搞乱指针,特别是在程序中使用列表时。