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;
}