Разработать функцию создания односвязного списка с обратным расположением элементов - C (СИ)
Формулировка задачи:
Нужно написать функцию. Вот само задание:
Разработать подалгоритм (функцию) создания односвязного списка с обратным расположением элементов по отношению к полученному списку, но без элемента, условный номер которого с начала полученного списка передан. Результат выполнения передать вызывающей функции.
Вообщем пробовал сформировать список с конца из элементов другого списка, без элемента номер которого получен, но в итоге окончательно запутался.
Вообщем вот вся программа(функция из задания new_list)
Функция не работает. Для ясности: res в функции это указатель на начало второго списка.
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef struct line
{
char d[30];
struct line*next;
}LIST;
LIST input_kb(LIST *head_1, int n)
{
char name[30];
int i;
LIST *new_1;
//puts("Введите количество элементов");
//scanf("%d", &n);
fflush(stdin);
head_1=NULL;
getchar();
for(i=0;i<n;i++)
{
puts("Введите строку");
gets(name);
new_1=(LIST*)malloc(sizeof(LIST));
strcpy(new_1->d,name);
new_1->next=head_1;
head_1=new_1;
}
printf("\n");
puts("Введенный список");
for(i=0;i<n;i++)
{
printf("%s \n", new_1->d);
new_1=new_1->next;
}
return *head_1;
}
LIST new_list(int n, LIST *head_1)
{
LIST *res,*cur,*cur1;
int i,x=1,y=1;
if(head_1!=NULL||head_1->next!=NULL)
{
for(i=0,cur=head_1;cur->next!=NULL;cur=cur->next)
{
i++;
}
res=cur;
i=i-n;
y=i;
for(;cur->next!=head_1;cur=cur->next)
{
for(cur1=head_1;cur1->next!=cur;cur1=cur1->next)
{
x++;
}
if(i==y-x)
{
cur->next=cur1;
}
}
return *res;
}
//else
//{
// return NULL;
//}
}
int main()
{
int n, i, k;
LIST *head_1, *new_1;
puts("Введите количество элементов");
scanf("%d", &n);
//head_1=
input_kb(*&head_1, n);
puts("Введите номер элемента");
scanf("%d", &k);
new_list(n, *&head_1);
puts("Результат");
for(i=0;i<n;i++)
{
printf("%s \n", new_1->d);
new_1=new_1->next;
}
}Решение задачи: «Разработать функцию создания односвязного списка с обратным расположением элементов»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
typedef struct list {
int data;
struct list * next;
} list_t;
list_t * push_front_list(list_t * list, int data) {
list_t * newList = malloc(sizeof(*newList));
newList->data = data;
newList->next = list;
return newList;
}
void free_list(list_t * list) {
while (list != NULL) {
list_t * tmp = list;
list = list->next;
free(tmp);
}
}
void print_list(list_t const* list) {
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
}
list_t * new_list(list_t const* oldList, size_t excluded) {
list_t * newList = NULL;
size_t i = 0;
while (i++ != excluded && oldList != NULL) {
newList = push_front_list(newList, oldList->data);
oldList = oldList->next;
}
if(oldList != NULL) {
oldList = oldList->next;
}
while (oldList != NULL) {
newList = push_front_list(newList, oldList->data);
oldList = oldList->next;
}
return newList;
}
int main() {
list_t * oldOne = NULL;
list_t * newOne = NULL;
size_t const excluded = 5;
size_t i;
for (i = 0; i != 10; ++i) {
oldOne = push_front_list(oldOne, (int)i);
}
printf("oldOne: ");
print_list(oldOne);
printf("\n");
newOne = new_list(oldOne, excluded);
printf("newOne: ");
print_list(newOne);
printf("\n");
free_list(oldOne);
free_list(newOne);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
В данном коде представлена реализация односвязного списка, который в данном случае используется для хранения чисел в обратном порядке. Список начинается с NULL-указателя, то есть пуст.
- Функция
push_front_listдобавляет новый элемент в начало списка. Входные параметры: указатель на голову списка (list), данные, которые необходимо добавить в список (data). Выходной параметр: новый указатель на голову списка (newList). Вложенный цикл продолжает добавлять элементы до тех пор, пока не встретитNULL(конец списка). После чего добавляет новый элемент и обновляет указатель на голову списка. Важно отметить, чтоdataпередается в функцию без изменений, поэтому она не выполняет никаких дополнительных операций с этим параметром. - Функция
free_listосвобождает память, выделенную под списком. Входной параметр: указатель на голову списка (list). Выполняет вложенный цикл, который проходит по всем элементам списка, начиная с головы, и освобождает память, выделенную под каждым элементом. - Функция
print_listвыводит на экран все элементы списка. Входной параметр: указатель на голову списка (list). Выполняет вложенный цикл, который проходит по всем элементам списка, начиная с головы, и выводит значение каждого элемента. - Функция
new_listсоздает новый список, содержащий все элементы исходного списка в обратном порядке. Входные параметры: указатель на голову исходного списка (oldList), количество элементов, которые необходимо исключить из нового списка (excluded). Выходной параметр: указатель на голову нового списка (newList). Создает новый список, инициализируя его NULL. Затем выполняет два вложенных цикла. Первый цикл добавляет элементы в новый список до тех пор, пока не встретитNULL(конец списка) или не достигнет указанного количества элементов для исключения. Второй цикл продолжает добавлять элементы в новый список до тех пор, пока не встретитNULL(конец списка). Важно отметить, что в данной реализации список создается путем добавления элементов в начало списка, что не является эффективным способом работы со списками. - В функции
mainсоздается исходный список из 10 элементов и выводится на экран. Затем создается новый список, содержащий все элементы исходного списка в обратном порядке, и также выводится на экран. После чего оба списка освобождаются с помощью функцииfree_list. В конце программы возвращается код успехаEXIT_SUCCESS.