2013-03-29 1 views
1

У меня есть следующий код:Добавление узлов в круговом списке

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->pre; 
h->nxt= p; 
p->pre = h; 
p->pre->nxt = 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; 

LE: Я обновил код, и написал это, чтобы проверить это: /* TL2 и */

for (u = a->nxt; u != a; u = u->nxt) 
     printf("%i %i\n", u->info, u->info); 

Да, информация недействительна, но мне было любопытно, если бы ячейки были разными ... Я полагаю, нет:

2686632 2686632 2686632 2686632 2686632 2686632 

Что здесь происходит ?!

ответ

1

Ваш код должен быть

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; 

Это вставляет ч между р и дозорных

+0

Спасибо, обновил свой пост, кажется, работает в настоящее время ссылки, но информация одинакова в каждой клетке? ? – SpaceNecron

+0

@SpaceNecron Вы печатаете указатели с '% i' вместо'% p'. Что такое 'urm'? Лучше всего задать новый вопрос * вместо того, чтобы обновлять этот вопрос и создавать беспорядок. – 2013-03-29 20:29:19

+0

Сделал это, спасибо – SpaceNecron

1

может быть, мое понимание недостатков, но я считаю, что это должно быть:

h->pre = p->nxt; 
p->nxt = h; 
h->nxt = p; 

Это по существу делает циклический список. Предполагая, что p является первым узлом в круговом списке, а h является последним узлом.

 Смежные вопросы

  • Нет связанных вопросов^_^