Узлы в круговом списке, имеющие одинаковое значение
У меня есть следующий код:(любезно предоставлено Армином)
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
, Это будет не то, что вы хотите, потому что:
- Все ваши узлы будут указывать на то же
p
как ихinfo
, - Так как вы создаете динамический # этих узлов, вы должны разместить эти информационные структуры в куче с помощью
malloc
,calloc
, так далее.
Я предполагаю p
это структура с x
а также y
поле, оба из которых являются 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;
}
Конечно, вам нужно будет добавить больше обработки ошибок и управления памятью по своему усмотрению.