3

我知道这被回答了很多次,但我就是不知道出了什么问题。

我有一个结构

typedef struct zaznam{
   char kategoria[53];
   char znacka[53];
   char predajca[103];
   double cena;
   int rok;
   char stav[203];
   struct zaznam *next;
   }ZAZNAM;

我想以这种方式删除第一个节点。

for(prev = act = prvy; act!=NULL; prev=act, act=act->next){
    if((strstr(act->znacka,vyber)!=NULL)){

    if(act->znacka==prvy->znacka){ 
    //if "znacka" of the actual node is equal to the first

        prev=prvy->next; //in "previous" is pointer to the second node
        free((void *)act); //free first node
        prvy=prev; //first node = previous 
    }
    else{ //this works
        prev->next=act->next;
        free((void *)act);
        act=prev;
    }

它适用于一切,但不适用于第一个节点。

4

3 回答 3

1

好吧,你一开始就违反了你自己的不变量prev->next == actfor (prev = act = prvy;... 第二,这act->znacka==prvy->znacka应该是act==prvy找出你是否在链的开头,否则它会混淆人们。

我可能会尝试act==prev通过添加act=prev;第一种情况来重新建立你开始(但错误的)不变量(即)。也许它会起作用。

于 2012-12-01T19:00:33.977 回答
0

在我看来,当您继续进行-loop的下一次迭代时,您删除了未正确分配prev指向下一个节点的第一个节点。for例如,在您if检查您是否在第一个节点的第一个语句中,您执行以下操作:

prev=prvy->next; //in "previous" is pointer to the second node
free((void *)act); //free first node
prvy=prev; //first node = previous

这确实释放了第一个节点,但是,立即在您的for-loop 中分配actprev这里:

for(prev = act = prvy; act!=NULL; prev=act, act=act->next)

由于释放内存实际上并不会擦除内存的内容,因此您可以继续处理列表的其余部分,就好像第一个节点没有被释放一样。实际上使用像这样的释放指针是未定义的行为,所以任何事情都可能发生(即你可能会崩溃,等等......在这种情况下看起来你不是)。

尝试将您的代码更改为以下内容:

for(prev = act = prvy; act!=NULL;)
{
    if((strstr(act->znacka,vyber)!=NULL))
    {
        if(act==prvy)
        { 
            //we're at the first node
            ZAZNAM* temp=act->next; 
            free((void *)act); //free first node
            prev=act=prvy=temp; //re-establish starting condition
        }
        else
        {   
            prev->next=act->next;
            free((void *)act);
            act=prev->next;
        }
    }
    else
    {
        //iterate here because if you delete the first node, you don't want
        //to start iterating like would happen if you kept iteration in the
        //for-loop declaration
        prev=act;
        act=act->next;
    }
}
于 2012-12-01T18:34:38.510 回答
0

为什么你有一个循环。删除列表中的第一个条目只是一个问题

tmp = head->next
delete head
head = tmp
于 2015-08-24T22:12:11.913 回答