Несколько предложений, нет полного исправления.
Нет необходимости инициализировать ваши указатели в NULL, просто определите и инициализируйте за один шаг. Кроме того, не разыгрывайте void *, что malloc возвращает. C позволяет вам неявно разыгрывать туда-сюда указатели void; каждый актерский состав - это возможность для ошибки.
struct nod* trei = malloc(sizeof(struct nod));
struct nod* unu = malloc(sizeof(struct nod));
struct nod* doi = malloc(sizeof(struct nod));
Мне не ясно, что n
и p
требуют выделения. Я думаю, вы имеете в виду, что они указывают на выделенные узлы.
Вы можете использовать синтаксис c99 для инициализации ваших структур в одном выражении. Я думаю, что эта форма намного понятнее.
*unu = (struct nod) { .nr = 1, .next = doi };
*doi = (struct nod) { .nr = 2, .next = trei };
*trei = (struct nod) { .nr = 3, .next = NULL };
Сделайте себе одолжение и не вызывайте свою функцию читайте , если только вы
означает переопределить стандартную функцию read (2). Вы не
читая, вы сообщаете. Может быть, назвать это «печать».
Петля неловкая. Вы хотите
while(p != NULL )
{
printf("%d", p->nr);
p=p->next;
}
по двум причинам:
- для защиты от принятого
p
NULL
- для печати
trei
Когда p
указывает на trei
, p->next
равно NULL. Вы не хотите выходить
цикл тогда; Вы хотите напечатать trei
, назначить p = p->next
и
тест p
. Затем вы можете удалить printf("%d", p->nr);
после
цикл, как вы должны, потому что p
будет NULL. : -)
Я не вижу ничего плохого в вашей функции чтения, нет причин
это не будет печатать ваши данные. Я бы посыпал еще несколько печатных
операторы и звоните fflush (3) каждый раз, чтобы убедиться, что вы видите
их. Бьюсь об заклад, ваша программа не делает то, что вы думаете. Не для
волнуйтесь, хотя. Если вам нравится программирование, вы найдете это довольно
нормальный.