【问题标题】:Delete element of linked list by a certain criterion按一定标准删除链表的元素
【发布时间】:2015-06-01 15:58:49
【问题描述】:

我写了这个函数:

List* delPaintingCode(List* head, char *code)
{
    List *p,*q;

    for(p=head;p!=NULL;q=p,p=p->next)
    {
        if(!strcmp(code,p->code))
        {
            if (p==head)
            {
                q=head;
                head=p->next;
                free(q);
            }
            else
            {
                q->next=p->next;
                free(p);
                p=q;
            }
        }
    }
    return head;
}

当我在另一个函数中调用它时:

void delpainting()
{ 
    char code[50];
    printf("code ");
    scanf("%s",code);

    List *head=NULL;

    head=delPaintingCode(filetolist,code);
}

程序因此崩溃。我有一个警告:passing argument 1 of delPaintingCode from incompatible pointer type

那么我应该如何将字符串传递给函数呢?

【问题讨论】:

  • 什么是filetolist
  • “我应该如何将字符串传递给函数” - 看起来你应该问“我应该将什么作为指向函数的 List 指针传递。该警告不存在随机机会。

标签: c


【解决方案1】:

导致崩溃的逻辑问题在于代码的if (p==head) 分支:当您删除初始元素时,您释放head 而不更新p。这会导致在下一次迭代中取消引用已释放的指针。

您可以通过在其next 中引入带有head 的假节点并返回next 来解决此问题,如下所示:

List fake;
fake.next = head;
// This loop always looks ahead by one element, i.e. at p->next.
for(List *p = &fake ; p->next != NULL ; p = p->next) {
    if(strcmp(code, p->next->code)) {
        continue;
    }
    List *q = p->next;
    p->next = q->next;
    free(q);
}
return fake.next;

这种方法也适用于初始元素,因为我们在列表中添加了一个假头,所以第一次p->next 与头相同。这让我们可以统一处理 head 元素和所有其他元素。

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多