【问题标题】:Deleting nodes in linked list when strings match [duplicate]当字符串匹配时删除链表中的节点[重复]
【发布时间】:2013-05-06 00:04:42
【问题描述】:

您好,我正在开发一个链表 - 基于结构的项目,我想请你们帮忙。 当一个字符串是结构数据字符串的一部分时,我必须从我的链表中删除一个节点。

到目前为止,我已经想出了这个。我能够使用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;
}
}

我不必只删除一个节点,还可以移动下一个节点,因此它们之间没有间隙。 我试图尽可能多地解释一切。谢谢!

【问题讨论】:

  • 尝试使用调试器。

标签: c


【解决方案1】:

它失败的原因是因为你做了以下代码序列:

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 不再有效。

【讨论】:

    【解决方案2】:

    我真的希望这不是一个真正的项目。你有一个buffer overflow 挂在那里,等待发生。

    因为这是一个家庭作业,我会告诉你使用调试器,就像@Mitch Wheat 建议的那样。但也请记住,如果您使用母语(不是英语)编写代码,The People From The Internet 将很难关注并提供帮助。

    幸运的是,有些人会喜欢这里的@Marc Claesen。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2014-12-06
      • 1970-01-01
      • 2021-11-12
      • 2019-01-01
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多