Переписать лист в обратном порядке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дан лист, написать программу реверс лист(Обратный порядок).

Решение задачи: «Переписать лист в обратном порядке»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. struct node {
  5.     struct node* next;
  6.     int val;
  7. };
  8.  
  9. typedef struct {
  10.     struct node* head, *tail;
  11. } slist;
  12.  
  13. void slist_init(slist* lst);
  14. void slist_reverse(slist* lst);
  15. int  slist_add(slist* lst, int val);
  16. void slist_clear(slist* lst);
  17. void slist_print(FILE* _out, slist* lst);
  18.  
  19. int main(void){
  20.     int i;
  21.     slist lst;
  22.     slist_init(&lst);
  23.     for(i = 0; i < 10; ++i)
  24.         slist_add(&lst, i);
  25.  
  26.     slist_print(stdout, &lst);
  27.     slist_reverse(&lst);
  28.     slist_print(stdout, &lst);
  29.     slist_clear(&lst);
  30.     getchar();
  31.     return 0;
  32. }
  33.  
  34. //переворачивание списка
  35. void slist_reverse(slist* lst){
  36.     struct node* q, *p = lst->head, *h = NULL, *t = NULL;
  37.     while(p != NULL){
  38.         q = p;
  39.         p = p->next;
  40.  
  41.         if(h == NULL)
  42.             h = t = q;
  43.         else {
  44.             q->next = h;
  45.             h = q;
  46.         }
  47.     }
  48.     t->next = NULL;
  49.     lst->head = h;
  50.     lst->tail = t;
  51. }
  52.  
  53. //добавление
  54. int slist_add(slist* lst, int val){
  55.     struct node* p = (struct node*)malloc(sizeof(struct node));
  56.     if(p == NULL)
  57.         return 0;
  58.  
  59.     p->val  = val;
  60.     p->next = NULL;
  61.     if(lst->head == NULL)
  62.         lst->head = lst->tail = p;
  63.     else
  64.         lst->tail = lst->tail->next = p;
  65.     return 1;
  66. }
  67.  
  68. //удаление
  69. void slist_clear(slist* lst){
  70.     struct node* t;
  71.     while(lst->head != NULL){
  72.         t = lst->head;
  73.         lst->head = lst->head->next;
  74.         free(t);
  75.     }
  76.     lst->tail = NULL;
  77. }
  78.  
  79. //печать
  80. void slist_print(FILE* _out, slist* lst){
  81.     const struct node* p = lst->head;
  82.     while(p != NULL){
  83.         fprintf(_out, "%d ", p->val);
  84.         p = p->next;
  85.     }
  86.     fputc('\n', _out);
  87. }
  88.  
  89. void slist_init(slist* lst){
  90.     lst->head = lst->tail = NULL;
  91. }

Объяснение кода листинга программы

  1. Структура данных, используемая в программе, - это связанный список (slist).
  2. Список содержит элементы типа struct node, каждый из которых содержит значение int и указатель на следующий элемент списка.
  3. Функция slist_reverse() переворачивает порядок элементов в списке.
  4. Алгоритм переворачивания списка следующий:
    • Создается новый указатель q, который будет следовать за текущим элементом списка p.
    • Пока p не равен NULL, происходит следующее:
      • q становится новым указателем на текущий элемент списка.
      • p обновляется на следующий элемент списка.
      • Если список пуст, то создается новый элемент списка и добавляется в начало списка.
      • Если список не пуст, то текущий элемент списка добавляется в конец списка.
    • В конце списка устанавливается указатель на NULL.
    • Обновляется head списка, чтобы указывать на новый первый элемент списка.
    • Обновляется tail списка, чтобы указывать на новый последний элемент списка.
  5. Функция slist_add() добавляет новый элемент в список.
  6. Алгоритм добавления элемента в список следующий:
    • Выделяется память под новый элемент списка.
    • Новый элемент списка инициализируется значением val.
    • Устанавливается указатель next нового элемента списка в NULL.
    • Если список пуст, то новый элемент становится первым элементом списка.
    • Если список не пуст, то новый элемент добавляется в конец списка.
  7. Функция slist_clear() очищает список, освобождая память, занятую каждым элементом списка.
  8. Функция slist_print() печатает список на стандартный вывод.
  9. Алгоритм печати списка следующий:
    • Инициализируется указатель p на первый элемент списка.
    • Пока p не равен NULL, происходит следующее:
      • Выводится значение элемента списка, на которое указывает указатель p.
      • Указатель p обновляется на следующий элемент списка.
  10. Функция slist_init() инициализирует список.
  11. Алгоритм инициализации списка следующий:
    • Устанавливается head списка в NULL.
    • Устанавливается tail списка в NULL.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы