2013-03-29 37 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

相關問題