C 循环列表中具有相同值的节点

C 循环列表中具有相同值的节点,c,circular-list,C,Circular List,我有以下代码:(向阿明提供) 我尝试的是: /* 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, *TL

我有以下代码:(向阿明提供)

我尝试的是:

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

为什么它们是一样的

在此循环中,您永远不会创建新的
p
。您正在重复使用相同的
p
来存储
fscanf
的结果,然后使用指向
p
的指针来设置节点的
info
字段

while(fscanf(fi,"%i%i", &(p.x), &(p.y)) == 2)
 if ( InsForward(a, &p) == 0)   
   break;
这就是为什么所有指针都指向相同的
p
。这不是您想要的,因为:

  • 您的所有节点将指向与其
    info
    相同的
    p
  • 由于您正在创建这些节点的动态#,因此应使用
    malloc
    calloc
    等在堆上分配这些信息结构
  • 我假设
    p
    是一个带有
    x
    y
    字段的结构,这两个字段都是
    int
    s。你应该这样做。我将此结构称为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;
    }
    

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

    您要打印两次
    u->info
    。为什么你认为它们应该不同?循环结束时,我读了7个元素。不管我是否打印两次u,输出都是一样的。
    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;
    }