Перевернутый список целых чисел не распечатывается для моей программы обратного связанного списка

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

Вот код, который я использовал:

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

struct node {
        int value;
        struct node* next;
};

struct node* create_node(int value) {
        struct node* new_node = (struct node*)malloc(sizeof(struct node));
        if (new_node == NULL) {
                printf("Error allocating memory.\n");
                exit(1);
        }
        new_node->value = value;
        new_node->next = NULL;
        return new_node;
}

void insert_node_end (struct node** head, int value) {
        struct node* new_node = create_node(value);
        if (*head == NULL) {
                *head = new_node;
        } else {
                struct node* current = *head;
                while (current->next != NULL) {
                        current = current->next;
                }
                current->next = new_node;
        }
}

struct node* reverse_list(struct node* head) {
        struct node* prev = NULL;
        struct node* current = head;
        struct node* next = NULL;

        while (current != NULL) {
                next = current->next;
                current->next = prev;
                prev = current;
                current = next;
        }

        return prev;
}

int main() {
        struct node* head = NULL;
        int value;

        printf("Enter a list of integers. Press ctrl-d to finish.\n");
        while (scanf("%d", &value) != EOF) {
                insert_node_end(&head, value);
        }

        printf("Data entered in the list:\n");
        while (head != NULL) {
                printf("%d ", head->value);
                head = head->next;
        }
        printf("\n");

        head = reverse_list(head);

        printf("List in reverse order:\n");
        while (head != NULL) {
                printf("%d ", head->value);
                head = head->next;
        }
        printf("\n");

        return 0;
}

Вот что должно произойти:

Enter a list of integers. Press ctrl-d to finish.
7
6
5
Data entered in the list:
7 6 5 
List in reverse order:
5 6 7

За исключением того, что эта программа не распечатывает список в обратном порядке, а оставляет его пустым, как показано ниже.

Enter a list of integers. Press ctrl-d to finish.
7
6
5
Data entered in the list:
7 6 5 
List in reverse order:

Можете ли вы помочь мне с этим?

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

wallyk 06.07.2024 03:05

Я рекомендую вам сначала попробовать это, используя карандаш и бумагу, прежде чем писать код. Используйте помеченные квадраты (или прямоугольники) для узлов и других переменных, а также заостренные стрелки для ссылок и указателей. Сотрите и перерисуйте стрелки, чтобы попытаться перевернуть список.

Some programmer dude 06.07.2024 03:08

В качестве подсказки попробуйте представить список как стек. Добавьте узлы в начало списка, чтобы переместить их. Удалите узлы из головы, чтобы вытолкнуть их. Теперь перевернуть список на месте или путем создания нового списка очень просто.

Some programmer dude 06.07.2024 03:10

ОТ: После того, как все заработает, не забудьте free() каждый узел, чтобы избежать утечек памяти.

Fe2O3 06.07.2024 05:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема заключается в том, что вы переназначаете head в своей функции main и теряете представление о том, где начинается список. После этого цикла head будет NULL:

while (head != NULL) {
    printf("%d ", head->value);
    head = head->next;
}

Используйте временную переменную, чтобы распечатать значения в обоих циклах в main:

for(struct node *curr = head; curr; curr = curr->next) {
    printf("%d ", curr->value);
}

...или напишите функцию для печати списка и вызовите ее:

void print_list(struct node *head) {
    for(; head; head = head->next) {
        printf("%d ", head->value);
    }
    putchar('\n');
}

Демо

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