1

次のコードがあります。

int InsForward (TL2 p, void* x){
 /* Inserta a node a step forward from the supplied p*/
 TL2 h = (TL2)calloc(1,sizeof(TCel2));
 if (!h)
      return 0;
h->pre = p->pre;
h->nxt= p;
p->pre = h;
p->pre->nxt = h;
h->info = x;   
return 1;

}

センチネルが既に割り当てられている循環リストに新しいノードを追加するにはどうすればよいですか? ノードが割り当てられているがリンクが壊れているため、何時間も悩まされていました。センチネルを除いて、それぞれに同じデータ値が表示されますが、これは問題ありません。

私が試したこと:

 /* TCel a, int p, FILE fi*/
 while(fscanf(fi,"%i%i", &(p.x), &(p.y)) == 2)
  if ( InsForward(a, &p) == 0)   
       break;    

構造体:

 typedef struct cel2
 { 
   struct cel2 *pre, *nxt;  
   void* info;              
 } TCel2, *TL2;

LE: コードを更新して、チェックするために次のように書きました: /* TL2 u*/

for (u = a->nxt; u != a; u = u->nxt)
       printf("%i %i\n", u->info, u->info);

はい、情報は無効ですが、セルが異なるかどうかは興味がありました...いいえだと思います:

  2686632 2686632 2686632 2686632 2686632 2686632  

ここで何が起こっているのですか?!

4

2 に答える 2

1

私の理解に欠陥があるかもしれませんが、これは次のようにすべきだと思います。

h->pre = p->nxt;
p->nxt = h;
h->nxt = p;

これにより、基本的に循環リストが作成されます。p が循環リストの最初のノードであり、h が最後のノードであると仮定します。

于 2013-03-29T20:12:56.120 に答える
1

あなたのコードは

int InsForward (TL2 p, void* x){
     /* Inserta a node a step forward from the supplied p*/
     TL2 h = (TL2)calloc(1,sizeof(TCel2));
     if (!h)
        return 0;
    h->pre = p;        //sets h previous to point to p
    h->nxt= p->nxt;    //sets h next to point to where p was pointing ( sentinel )
    p->nxt->prv = h;   //sets the sentinel previous to point to h
    p->nxt = h;        //sets the p next to point to h
    h->info = x;   
return 1;

これにより、 p とセンチネルの間に h が挿入されます

于 2013-03-29T20:14:37.347 に答える