2013-03-29 33 views
0

我有以下代码:(礼貌阿明)节点在循环列表具有相同值

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

您正在打印'u-> info'两次。你为什么认为他们应该有所不同? – tom

+0

循环结束,我读了7个元素。如果我打印两次并不重要,输出是一样的。 – SpaceNecron

回答

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堆这些信息结构等

我认为p是与xy领域的结构,无论是其中有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; 
} 

当然,您需要添加更多错误处理和内存管理,只要您认为合适。

+0

它终于工作了,谢谢很多人! – SpaceNecron

相关问题