Узлы в круговом списке, имеющие одинаковое значение

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

 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 

Почему они такие же?!

1 ответ

Решение

В этом цикле вы никогда не создаете новый 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. Так как вы создаете динамический # этих узлов, вы должны разместить эти информационные структуры в куче с помощью malloc, calloc, так далее.

Я предполагаю p это структура с x а также y поле, оба из которых являются ints. Вы должны так что-то вроде этого. Я назову эту структуру 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;
}

Конечно, вам нужно будет добавить больше обработки ошибок и управления памятью по своему усмотрению.

Другие вопросы по тегам