Разработать функцию создания односвязного списка с обратным расположением элементов - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д