圆形列表中的节点具有相同的值

时间:2013-03-29 20:36:23

标签: c circular-list

我有以下代码:(由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 

为什么它们一样?!

1 个答案:

答案 0 :(得分: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. 由于您要创建这些节点的动态#,您应该使用malloccalloc等在堆上分配这些信息结构。
  3. 我认为p是一个包含xy字段的结构,两者都是int个。你应该这样做。我将这个结构称为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;
    }
    

    当然,您需要根据需要添加更多错误处理和内存管理。