Связанный список начинающих - PullRequest
0 голосов
/ 24 января 2019

Я только начал изучать Связанный список, и у меня возникли проблемы с созданием функции, которая будет читать мой связанный список.Когда я выбираю функцию чтения из переключателя, она гаснет и ничего не происходит (если бы я поместил код в main (), это сработало бы).Что я делаю не так?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct nod
{
    int nr;
    struct nod *next;
} nod;

int read(struct nod *p)
{
    while(p->next != NULL )
    {
        printf("%d", p->nr);
        p=p->next;
    }

    printf("%d", p->nr);
}

int main()
{
    struct nod* trei = NULL;
    struct nod* unu = NULL;
    struct nod* doi = NULL;
    struct nod* p = NULL;
    struct nod* n = NULL;
    unu = (struct nod*)malloc(sizeof(struct nod));
    doi = (struct nod*)malloc(sizeof(struct nod));
    trei = (struct nod*)malloc(sizeof(struct nod));
    p = (struct nod*)malloc(sizeof(struct nod));
    n = (struct nod*)malloc(sizeof(struct nod));
    unu->nr = 1;
    unu->next = doi;
    doi->nr = 2;
    doi->next = trei;
    trei->nr = 3;
    trei->next = NULL;
    p = unu;
    int meniu = 0;
    while(1)
    {
        printf("1. Read list");
        scanf("%d", meniu);
        switch(meniu)
        {
        case(2):
            read(p);
            break;
        }
    }
    printf("%d", p->nr);
}

1 Ответ

0 голосов
/ 24 января 2019

Несколько предложений, нет полного исправления.

Нет необходимости инициализировать ваши указатели в 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;
}

по двум причинам:

  1. для защиты от принятого p NULL
  2. для печати trei

Когда p указывает на trei, p->next равно NULL. Вы не хотите выходить цикл тогда; Вы хотите напечатать trei, назначить p = p->next и тест p. Затем вы можете удалить printf("%d", p->nr); после цикл, как вы должны, потому что p будет NULL. : -)

Я не вижу ничего плохого в вашей функции чтения, нет причин это не будет печатать ваши данные. Я бы посыпал еще несколько печатных операторы и звоните fflush (3) каждый раз, чтобы убедиться, что вы видите их. Бьюсь об заклад, ваша программа не делает то, что вы думаете. Не для волнуйтесь, хотя. Если вам нравится программирование, вы найдете это довольно нормальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...