Я написал программу на языке 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:
Можете ли вы помочь мне с этим?
Я рекомендую вам сначала попробовать это, используя карандаш и бумагу, прежде чем писать код. Используйте помеченные квадраты (или прямоугольники) для узлов и других переменных, а также заостренные стрелки для ссылок и указателей. Сотрите и перерисуйте стрелки, чтобы попытаться перевернуть список.
В качестве подсказки попробуйте представить список как стек. Добавьте узлы в начало списка, чтобы переместить их. Удалите узлы из головы, чтобы вытолкнуть их. Теперь перевернуть список на месте или путем создания нового списка очень просто.
ОТ: После того, как все заработает, не забудьте free()
каждый узел, чтобы избежать утечек памяти.
Основная проблема заключается в том, что вы переназначаете 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');
}
На ум приходят еще несколько реализаций. Хотя связанный список можно заставить работать, почему вы не использовали массив для хранения чисел?