2015-06-01 19 views
0

我写这个函数删除链表的元素:按一定标准

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

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

+4

什么是'filetolist'? – mtijanic

+0

“我应该如何将字符串传递给函数” - 它看起来像你应该问“我应该将哪个'List'指针传递给函数,这个警告不是随机的。 – WhozCraig

回答

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是一样的头。这让我们统一处理头元素和所有其他元素。