Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KURSOVAYa-1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
341.79 Кб
Скачать

Инициализация дцс:

Инициализация списка предназначена для создания корневого узла списка, у которого поля указателей на следующий и предыдущий узлы указывают на сам создаваемый узел.

Рисунок 2 - Инициализация ДЦС

Программная реализация:

struct list * init(int a) { // а- значение первого узла

  struct list *lst;

  // выделение памяти под корень списка

  lst = (struct list*)malloc(sizeof(struct list));

  lst->field = a;

  lst->next = lst; // указатель на следующий узел

  lst->prev = lst; // указатель на предыдущий узел

return(lst); }

Добавление узла в дцс:

Функция добавления узла в ДЦС аналогична функции для ДЛС и принимает два аргумента:

  • Указатель на узел, после которого происходит добавление

  • Данные для добавляемого узла.

Процедуру добавления узла можно отобразить следующей схемой:

Рисунок 3 - Добавление узла в ДЦС

Добавление узла в ДЦС включает в себя следующие этапы:

  • создание узла добавляемого элемента и заполнение его поля данных;

  • переустановка указателя "следующий" узла, предшествующего добавляемому, на добавляемый узел;

  • переустановка указателя "предыдущий" узла, следующего за добавляемым, на добавляемый узел;

  • установка указателя "следующий" добавляемого узла на следующий узел (тот, на который указывал предшествующий узел);

  • установка указателя "предыдущий" добавляемого узла на узел, предшествующий добавляемому (узел, переданный в функцию).

Для циклического списка предыдущий узел любого узла существует, поэтому нет необходимости проверки предыдущего элемента на нулевое значение.

Таким образом, функция добавления узла в ДЦС имеет вид:

struct list * addelem(list *lst, int number) {

struct list *temp, *p;

temp = (struct list*)malloc(sizeof(list));

p = lst->next; // сохранение указателя на следующий узел

lst->next = temp; // предыдущий узел указывает на создаваемый

temp->field = number; // сохранение поля данных добавляемого узла

temp->next = p; // созданный узел указывает на следующий узел

temp->prev = lst; // созданный узел указывает на предыдущий узел

p->prev = temp;

return(temp); }

Удаление узла дцс:

В качестве аргументов функции удаления узла ДЦС передается указатель на удаляемый узел. Поскольку узел списка имеет поле указателя на предыдущий узел, нет необходимости передавать указатель на корень списка.

Функция возвращает указатель на узел, следующий за удаляемым.

Удаление узла может быть представлено следующей схемой:

Рисунок 4 - Удаление узла ДЦС

Удаление узла ДЦС включает в себя следующие этапы:

  • установка указателя "следующий" предыдущего узла на узел, следующий за удаляемым;

  • установка указателя "предыдущий" следующего узла на узел, предшествующий удаляемому;

  • освобождение памяти удаляемого узла.

struct list * deletelem(list *lst) {

  struct list *prev, *next;

  prev = lst->prev; // узел, предшествующий lst

  next = lst->next; // узел, следующий за lst

  prev->next = lst->next; // переставляем указатель

  next->prev = lst->prev; // переставляем указатель

  free(lst); // освобождаем память удаляемого элемента

return(temp); }

Вывод элементов дцс:

Функция вывода элементов ДЦС аналогична функции для ОЦС. В качестве аргумента в функцию вывода элементов передается указатель на корень списка. Функция осуществляет последовательный обход всех узлов с выводом их значений.

void listprint(list *lst) {

  struct list *p;

  p = lst;

  do {

    printf("%d ",p->field); // вывод значения элемента p

    p = p->next; // переход к следующему узлу

  } while(p != lst); // условие окончания обхода }

Для ДЦС также можно вызвать функцию вывода элементов списка в обратном порядке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]