Переписать лист в обратном порядке - C (СИ)
Формулировка задачи:
Дан лист, написать программу реверс лист(Обратный порядок).
Решение задачи: «Переписать лист в обратном порядке»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> struct node { struct node* next; int val; }; typedef struct { struct node* head, *tail; } slist; void slist_init(slist* lst); void slist_reverse(slist* lst); int slist_add(slist* lst, int val); void slist_clear(slist* lst); void slist_print(FILE* _out, slist* lst); int main(void){ int i; slist lst; slist_init(&lst); for(i = 0; i < 10; ++i) slist_add(&lst, i); slist_print(stdout, &lst); slist_reverse(&lst); slist_print(stdout, &lst); slist_clear(&lst); getchar(); return 0; } //переворачивание списка void slist_reverse(slist* lst){ struct node* q, *p = lst->head, *h = NULL, *t = NULL; while(p != NULL){ q = p; p = p->next; if(h == NULL) h = t = q; else { q->next = h; h = q; } } t->next = NULL; lst->head = h; lst->tail = t; } //добавление int slist_add(slist* lst, int val){ struct node* p = (struct node*)malloc(sizeof(struct node)); if(p == NULL) return 0; p->val = val; p->next = NULL; if(lst->head == NULL) lst->head = lst->tail = p; else lst->tail = lst->tail->next = p; return 1; } //удаление void slist_clear(slist* lst){ struct node* t; while(lst->head != NULL){ t = lst->head; lst->head = lst->head->next; free(t); } lst->tail = NULL; } //печать void slist_print(FILE* _out, slist* lst){ const struct node* p = lst->head; while(p != NULL){ fprintf(_out, "%d ", p->val); p = p->next; } fputc('\n', _out); } void slist_init(slist* lst){ lst->head = lst->tail = NULL; }
Объяснение кода листинга программы
- Структура данных, используемая в программе, - это связанный список (slist).
- Список содержит элементы типа struct node, каждый из которых содержит значение int и указатель на следующий элемент списка.
- Функция slist_reverse() переворачивает порядок элементов в списке.
- Алгоритм переворачивания списка следующий:
- Создается новый указатель q, который будет следовать за текущим элементом списка p.
- Пока p не равен NULL, происходит следующее:
- q становится новым указателем на текущий элемент списка.
- p обновляется на следующий элемент списка.
- Если список пуст, то создается новый элемент списка и добавляется в начало списка.
- Если список не пуст, то текущий элемент списка добавляется в конец списка.
- В конце списка устанавливается указатель на NULL.
- Обновляется head списка, чтобы указывать на новый первый элемент списка.
- Обновляется tail списка, чтобы указывать на новый последний элемент списка.
- Функция slist_add() добавляет новый элемент в список.
- Алгоритм добавления элемента в список следующий:
- Выделяется память под новый элемент списка.
- Новый элемент списка инициализируется значением val.
- Устанавливается указатель next нового элемента списка в NULL.
- Если список пуст, то новый элемент становится первым элементом списка.
- Если список не пуст, то новый элемент добавляется в конец списка.
- Функция slist_clear() очищает список, освобождая память, занятую каждым элементом списка.
- Функция slist_print() печатает список на стандартный вывод.
- Алгоритм печати списка следующий:
- Инициализируется указатель p на первый элемент списка.
- Пока p не равен NULL, происходит следующее:
- Выводится значение элемента списка, на которое указывает указатель p.
- Указатель p обновляется на следующий элемент списка.
- Функция slist_init() инициализирует список.
- Алгоритм инициализации списка следующий:
- Устанавливается head списка в NULL.
- Устанавливается tail списка в NULL.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д