2013-05-06 28 views
-1

您好,我正在處理一個鏈接列表 - 基於結構的項目,我正在問你們一些幫助。 當一個字符串是來自結構數據的字符串的一部分時,我必須從我的鏈接列表中刪除一個節點。當字符串匹配時刪除鏈接列表中的節點

到目前爲止,我已經想出了這個。我能夠使用strstr()來查找兩個字符串中的匹配項,但是在它顯示字符串#1在字符串#2中後,整個程序就會下降。

void zmaz(STUFF *p_akt, STUFF *p_prv, STUFF *p_vymaz){ 
char meno_autor[100]; 
scanf("%s", meno_autor); 
while(p_akt!=NULL) { 
    if(strstr(p_akt->autori,meno_autor)!=NULL){ 
     printf("string %s is in %s\n", meno_autor, p_akt->autori); 

     p_vymaz=p_akt; 
     if (p_prv == p_vymaz){ //deleting the first node 
      p_prv = p_prv->p_dalsi; 
     } 

     else { 
      p_akt = p_prv; 
      while (p_akt->p_dalsi != p_vymaz) p_akt = p_akt->p_dalsi; 
      p_akt->p_dalsi = p_vymaz->p_dalsi; 
     } 
     free((void*)p_vymaz); 
    } 
p_akt=p_akt->p_dalsi; 
} 
} 

我不必只刪除一個節點,但也移動下一個節點,所以他們之間沒有任何差距。 我試圖儘可能多地解釋一切。謝謝!

+0

嘗試使用調試器。 – 2013-05-06 00:05:38

回答

0

失敗的原因是因爲你讓下面的代碼序列:通過分配p_vymaz到p_akt然後釋放p_vymaz

while(){ 
    if(){ 
     ... 
     p_vymaz=p_akt; 
     ... 
     free((void*)p_vymaz); 
    } 
    p_akt=p_akt->p_dalsi; 
} 

你已經自由p_akt。因此,p_akt->p_dalsi不再有效。

0

我真的希望這不是一個真正的項目。你有一個buffer overflow掛在那裏,等待發生。

由於這是一項家庭作業,我會告訴你使用一個調試器,就像@Mitch Wheat建議的那樣。但是請記住,如果你在母語中編寫代碼,這不是英語,那麼對於互聯網上的人來說,將很難遵循它並提供幫助。

幸運的是,有些人會像@Marc Claesen在這裏。