c - 从双向链表中删除元素

标签 c pointers logic structure doubly-linked-list

我的代码适用于链表开头的元素,但不适用于中间或末尾的元素。感谢您的帮助!

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;
            }
        }
    }   
}

最佳答案

首先,使用 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;

如果它是最后一个,将会导致你崩溃,因为它不会检查后面是否还有另一个元素。

此外,箭头 -> 前后的空格也很少见。我建议不要再这样做了。

关于c - 从双向链表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506897/

相关文章:

c - OpenAcc 归并排序程序中的浮点异常

使用指针算术编码字符串长度函数

c - 我可以改变指针的功能吗?

algorithm - 删除链表中的循环

c - Makefile 中的 Posix Semaphore 编译错误

C中的字符读取

list - Prolog - 如何返回每个元素仅出现一次的列表?

PHP 运行时或逻辑异常?

c - 1 = 假和 0 = 真?

c - "No rule to make target ` install 使用 make install 时出现 `"错误