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