Обмен местами элементов линейного списка С
Задача заключается в том, чтобы поменять первый и последний элементы списка местами. Не могу понять, почему первый элемент переносится в конец списка, а последний в начало не переносится. На тесте "1 2 3 4 5" программа выводит "2 3 4 5 1". Как переместить пятерку в начало линейного списка?
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
struct list
{
int el;
list *next;
};
int main()
{
setlocale(LC_ALL, "");
list *L, *r, *p = new list;
L = r = p = new list;
p = p->next = new list;
// Ввод списка
FILE *str;
fopen_s(&str, "C:\\Users\\forev\\Desktop\\tx.txt", "r");
int a = 0;
while (0 < fscanf_s(str, "%d", &a))
{
r->next = new list;
r = r->next;
r->el = a;
}
r->next = NULL;
fclose(str);
// Обработка
for (r = L->next; r->next != NULL;)
r = r->next;
p = r->next;
r->next = L->next;
p = L->next->next;
L->next = p;
r->next->next = NULL;
// Вывод списка
r = L;
printf("Измененный список: ");
for (r = r->next; r; r = r->next )
printf("%d ", r->el);
return 0;
}
Ответы (1 шт):
Автор решения: neon1ks
→ Ссылка
- У вас первый элемент списка пустой, что не очень хорошо.
- Изначальный указатель списка всегда должен указывать на первый элемент.
- Для облегчения понимания кода, со списками работают с помощью вспомогательных функций. И код ниже не является образцовым.
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
struct list
{
int el;
list *next;
};
int main()
{
setlocale(LC_ALL, "");
list* current;
list* first;
list* previous;
list * r = new list;
r->el = 0;
r->next = NULL;
// Ввод списка
FILE *str;
fopen_s(&str, "C:\\Users\\forev\\Desktop\\tx.txt", "r");
int a = 0;
int first_read = 1;
current = r;
while (0 < fscanf_s(str, "%d", &a))
{
if (first_read) {
r->el = a;
r->next = NULL;
first_read = 0;
current = r;
}
else {
current->next = new list;
current = current->next;
current->el = a;
current->next = NULL;
}
}
fclose(str);
printf("Считанный список: ");
for (current = r; current; current = current->next )
printf("%d ", current->el);
printf("\n");
// Обработка
previous = current = r;
while (current->next != NULL) {
previous = current;
current = current->next;
}
first = current;
first->next = r->next;
r->next = NULL;
previous->next = r;
r = first;
// Вывод списка
printf("Измененный список: ");
for (current = r; current; current = current->next )
printf("%d ", current->el);
printf("\n");
return 0;
}