2013-05-06 25 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在这里。