我有以下代码:(由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
为什么它们一样?!
答案 0 :(得分:2)
在此循环中,您永远不会创建新的p
。您正在重复使用相同的p
来存储fscanf
的结果,然后使用指向p
的指针来设置节点的info
字段。
while(fscanf(fi,"%i%i", &(p.x), &(p.y)) == 2)
if ( InsForward(a, &p) == 0)
break;
这就是为什么所有指针最终都指向同一个p
。这不是你想要的,因为:
p
相同的info
。malloc
,calloc
等在堆上分配这些信息结构。我认为p
是一个包含x
和y
字段的结构,两者都是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;
}
当然,您需要根据需要添加更多错误处理和内存管理。