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 == actをすでに最初から破っています:for (prev = act = prvy;... 第二に、これact->znacka==prvy->znackaact==prvyあなたがチェーンの最初にいるかどうかを調べるためのもので、そうでなければ人々を混乱させます.

そして、最初のケースact==prevに追加することで、 (しかし間違った) 不変式 (つまり ) を開始することを再確立しようとするでしょう。act=prev;多分それはうまくいくでしょう。

于 2012-12-01T19:00:33.977 に答える
0

なぜあなたはループを持っていますか。リストの最初のエントリを削除するのは簡単なことです

tmp = head->next
delete head
head = tmp
于 2015-08-24T22:12:11.913 に答える
0

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 でここに割り当てactますprev

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 に答える