Lila25mila
8 апреля 2019 г. 13:44

Типы связанного списка - односвязные, двусвязные и круговой

Существует три распространенных типа связанного списка.

  • Единственный связанный список
  • Двусвязный список
  • Круговой связанный список

Единственный связанный список

Это самый распространенный. Каждый узел имеет данные и указатель на следующий узел.

Где адрес первого узла специальное имя, называемое HEAD.
На последний узел в связанном списке указывает NULL.

Узел представлен как:

  1. struct node {
  2. int data;
  3. struct node *next;
  4. }

Трехэлементный односвязный список может быть создан как:

  1. /* Инициализируем узлы */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6.  
  7. /* Выделяем память */
  8. one = malloc(sizeof(struct node));
  9. two = malloc(sizeof(struct node));
  10. three = malloc(sizeof(struct node));
  11.  
  12. /* Назначаем значения данных */
  13. one->data = 1;
  14. two->data = 2;
  15. three->data = 3;
  16.  
  17. /* Соединяем узлы */
  18. one->next = two;
  19. two->next = three;
  20. three->next = NULL;
  21.  
  22. /* Сохраняем адрес первого узла в голове */
  23. head = one;
Двусвязный список

Мы добавляем указатель на предыдущий узел в двусвязном списке. Таким образом, мы можем идти в любом направлении: вперед (next) или назад (prev).

Узел представлен как:

  1. struct node {
  2. int data;
  3. struct node *next;
  4. struct node *prev;
  5. }

Двусвязный список из трех участников может быть создан как:

  1. /* Инициализируем узлы */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6.  
  7. /* Выделяем память */
  8. one = malloc(sizeof(struct node));
  9. two = malloc(sizeof(struct node));
  10. three = malloc(sizeof(struct node));
  11.  
  12. /* Назначаем значения данных */
  13. one->data = 1;
  14. two->data = 2;
  15. three->data = 3;
  16.  
  17. /* Соединяем узлы */
  18. one->next = two;
  19. one->prev = NULL;
  20.  
  21. two->next = three;
  22. two->prev = one;
  23.  
  24. three->next = NULL;
  25. three->prev = two;
  26.  
  27. /* Сохраняем адрес первого узла в голове */
  28. head = one;
Круговой связанный список

Круговой связанный список - это вариант связанного списка, в котором последний элемент связан с первым элементом. Это образует круговую петлю.

Круговой связанный список может быть либо односвязным, либо двусвязным.

  • Для односвязного списка указатель next последнего элемента указывает на первый элемент;
  • В двусвязном списке указатель prev первого элемента также указывает на последний элемент.

Круговой односвязный список из трех членов может быть создан как:

  1. /* Инициализируем узлы */
  2. struct node *head;
  3. struct node *one = NULL;
  4. struct node *two = NULL;
  5. struct node *three = NULL;
  6.  
  7. /* Выделяем память */
  8. one = malloc(sizeof(struct node));
  9. two = malloc(sizeof(struct node));
  10. three = malloc(sizeof(struct node));
  11.  
  12. /* Назначаем значения данных */
  13. one->data = 1;
  14. two->data = 2;
  15. three->data = 3;
  16.  
  17. /* Соединяем узлы */
  18. one->next = two;
  19. two->next = three;
  20. three->next = one;
  21.  
  22. /* Сохраняем адрес первого узла в голове */
  23. head = one;

По статье задано0вопрос(ов)

1

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • Evgenii Legotckoi
    16 апреля 2025 г. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…