Почему узлы не добавляются правильно и почему они печатаются в обратном порядке? (односвязный список) - PullRequest
2 голосов
/ 25 апреля 2019

решаемые

Проблема также может быть решена путем копирования заголовка в другую переменную после добавления новых узлов. Более логичным решением было бы сделать, как говорится в ответе.



Я занимаюсь простой реализацией связанного списка, хотел также изучить указатели. почему мой код не добавляет узлы должным образом?

typedef struct Node{

    int info;

    struct Node* next;

}Node;

void createList(Node** node, int info){

        *node = calloc(1, sizeof(Node));
        (*node)->info = info;
        (*node)->next = NULL;

}
Node* newNode(int info)
{
    Node* newNode;
    newNode = calloc(1, sizeof(Node));
    newNode->info = info;
    newNode->next = NULL;

    return newNode;
}

void addNode(Node** node, int info){
    int adaugat = 0;


    if(*node == NULL){

        createList(node, info);
        adaugat = 1; 
    }

    if(adaugat == 0)
    {
        Node **aux = node;
        while((*aux)->next != NULL)
        {
            *aux = (*aux)->next;
        }
        (*aux)->next = newNode(info);
        adaugat = 1;
    }

}
void printList(Node* node){
    int i = 1;
    Node* aux;
    aux = node;
    while(aux != NULL)
    {
        printf("%d_[%d]--",i, aux->info );
        i++;
        aux = aux->next;
    }
}
int main(int argc, char const *argv[])
{
    Node *nod = NULL;
    int key = 5;

    createList(&nod, key);

    addNode(&nod, 5);
    addNode(&nod, 3);
    addNode(&nod, 4);
    addNode(&nod, 1);

    printList(nod);

    return 0;
}

Я попытался переключиться с помощью указателей и входов вызова функций в main (), но все, что я получил, было больше предупреждений и ошибок. Вывод здесь из main () равен 1_[4]--2_[1]--, когда он должен был быть

1_[5]--2_[3]--3_[4]--4_[1]--

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

В этом фрагменте функции addNode

if(adaugat == 0)
    {
        Node **aux = node;
        while((*aux)->next != NULL)
        {
            *aux = (*aux)->next;
        }
        (*aux)->next = newNode(info);
        adaugat = 1;
    }

точнее в строке *aux = (*aux)->next; вы перемещаете список в то же время, когда вы проходите по нему из-за Node ** aux. Следовательно, он всегда будет выглядеть так, как будто ваш список состоит из двух элементов.

Если вы хотите добавить элемент в конец списка, вы должны пройти по списку без его изменения, то есть

if(adaugat == 0)
    {
        Node *aux = *node;
        while(aux->next != NULL)
        {
            aux = aux->next;
        }
        aux->next = newNode(info);
        adaugat = 1;
    }
1 голос
/ 25 апреля 2019

Проблема заключается в следующем блоке кода

    if(adaugat == 0)
    {
        Node **aux = node;
        while((*aux)->next != NULL)
        {
            *aux = (*aux)->next;
        }
        (*aux)->next = newNode(info);
        adaugat = 1;
    }

Переменная node не получает разыменования, и использование двойного указателя здесь не требуется. Изменение этой части на следующее даст вам желаемый результат ...


    if(adaugat == 0)
    {
        Node *aux = *node;
        while(aux->next != NULL)
        {
            aux = aux->next;
        }
        aux->next = newNode(info);
        adaugat = 1;
    }

Надеюсь, это поможет.

...