2015-06-01 21 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是一樣的頭。這讓我們統一處理頭元素和所有其他元素。