c - 从 C 中的列表中删除

标签 c pointers linked-list singly-linked-list

基本上我必须从链表中删除某个项目。 此代码有效:

void delete_(Item client){
    link s=head,r;
    if(head->item==client){
        r=head;
        head=head->next;
        free(r);
    }
    else{
        while(s->next!=NULL){
            if(s->next->item==client){
                r=s->next;
                s->next=s->next->next;
                free(r);
            }
            else
                s=s->next;
        }
    }
}

现在我尝试使用带有 2 个指针的 for 来减少和压缩代码,但我不知道如何让它工作。 这是代码:

void delete_(Item client){
    link x,r,p;
    for(x=head;x!=NULL;p=x,x=x->next){
        if(x->item==client){
            r=x;
            p->next=x->next;
            free(r);
        }
    }
}

最佳答案

有两点错误:

  • 如果第一个元素是需要删除的项目,则该项目的前一个不存在,代码 p->next = ... 不是正确的操作。你应该改变列表的头部,这是正确的行为。
  • 当你删除当前项目(free(r))时,所以如果你调用 x=x->next 你的程序可能会崩溃。删除之前必须备份 x->next。你的 for 循环需要改变

关于c - 从 C 中的列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33972616/

相关文章:

c - 输出是如何变成 '10' 的?

c - C中的*(a[1])和*(*a+1)有什么区别?

c - 指向存储的特定内存地址的指针

java - 更新链表

java - LinkedList getFirstElement 和 getLastElement 方法

c - 如何打印超过 300 行?

c - 这段c代码有什么问题?

c - 如何重现 __builtin___memset_chk

c - 函数调用是内存屏障吗?

Python;链表和遍历!