Переписать лист в обратном порядке - 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;
}

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

  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
Похожие ответы