0

私は次のコードを持っています:(アーミンの礼儀)

 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;

私が試したこと:

/* 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;

だから私はそれをチェックしました:

 /* TL2 u*/

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

はい、情報は無効ですが、アドレスが異なる場合は興味がありました...いいえだと思います:

 0028FEA8 0028FEA8 0028FEA8 0028FEA8 0028FEA8 0028FEA8 

なぜ同じなの?!

4

1 に答える 1

2

このループでは、新しい を作成することはありませんp。同じものを再利用してpの結果を保存fscanfし、ポインタを使用してノードのフィールドpを設定しています。info

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

そのため、すべてのポインターが同じp. これはあなたが望むものではないでしょう:

  1. すべてのノードはp、それらのinfo.
  2. mallocこれらのノードの動的な # を作成しているため、これらの情報構造体を、callocなどでヒープに割り当てる必要があります。

はandフィールドpを持つ構造体であり、どちらもsであると想定しています。代わりに、このようなものにする必要があります。これを struct と呼びます。xyinttuple_t

while(true) {
 tuple_t *p = malloc(sizeof(tuple_t));
 int f = fscanf(fi,"%i%i", &(p->x), &(p->y));
 if (f != 2 || InsForward(a, p) == 0) {
   break;
}

もちろん、必要に応じてエラー処理とメモリ管理を追加する必要があります。

于 2013-03-29T20:59:57.350 に答える