你好我正在研究一个链表 - 基于结构的项目,我要求你们帮忙。 当一个字符串是struct data的字符串的一部分时,我必须从链表中删除一个节点。
到目前为止,我已经想出了这个。我能够使用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 :(得分:0)
失败的原因是因为你制作了以下代码序列:
while(){
if(){
...
p_vymaz=p_akt;
...
free((void*)p_vymaz);
}
p_akt=p_akt->p_dalsi;
}
您通过将p_vymaz分配给p_akt然后释放p_vymaz来释放p_akt。因此,p_akt->p_dalsi
不再有效。
答案 1 :(得分:0)
我真的希望这不是一个真正的项目。你有buffer overflow挂在那里等待发生。
由于这是一个家庭作业,我会告诉你使用调试器,如@Mitch Wheat建议的那样。但是请记住,如果你在母语中写代码,而不是英语,那么互联网上的人们就很难跟上它并提供帮助。
幸运的是,有人会像@Marc Claesen这样。