0

我有以下代码:(由 Armin 提供)

 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. 您的所有节点都将指向与它们相同pinfo.
  2. 由于您正在创建这些节点的动态 #,因此您应该在堆上分配这些信息结构malloc,calloc等。

我假设p是一个带有xandy字段的结构,这两个字段都是ints。你应该这样。我称之为 struct tuple_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 回答