0


【数据结构与算法】—— * 循环链表 *


存储结构示意图

优点 : 能够通过任意结点遍历整个链表结构


初始化循环链表

1,循环链表的结点

  1. typedef struct CircularNode {
  2. ElementType date; //数据域
  3. struct CircularNode* next; //指向下一个结点的指针域
  4. }CircularNode;

2,循环链表结构

  1. typedef struct CircularLinkList {
  2. CircularNode* next; //指向第一个结点的头指针,头指针
  3. int length;
  4. }CircularLinkList;

循环链表的插入

需要考虑两种情况

  1. 插入的链表长度为 0 node -> next = node;
  2. **插入的链表长度不为0 node -> next = clList -> next lastNode -> next = node **

首位置

代码实现


其他位置


代码实现(总)

  1. void InsertCircularLinkList(CircularLinkList* clList, int pos, ElementType element)
  2. {
  3. //创建一个空节点
  4. CircularLinkList* node = (CircularLinkList*)malloc(sizeof(CircularLinkList));
  5. node->date = element;
  6. node->next = NULL;
  7. if (pos == 1) {
  8. node->next = clList->next;
  9. if (!node->next) {
  10. //如果插入的链表长度为0
  11. node->next = node;
  12. }
  13. else {
  14. //如果长度不为0,就要找到链表的最后一个结点并改变其指针域
  15. CircularLinkList* lastNode = clList->next;
  16. for (int i = 1; i < clList->length; i++)
  17. {
  18. lastNode = lastNode->next;
  19. }
  20. clList->next = node;
  21. clList->length++;
  22. }
  23. return;
  24. }
  25. //插入的不是第一个结点
  26. CircularLinkList* currNode = clList->next;
  27. for (int i = 1; i < pos - 1; i++)
  28. currNode = currNode->next;
  29. if (currNode) {
  30. node->next = currNode->next;
  31. currNode->next = node;
  32. clList->length++;
  33. if (pos == clList->length) {
  34. node->next = clList->next;
  35. }
  36. }
  37. }

循环链表的删除

1,操作的为第一个元素

代码实现


2,操作元素不为第一个元素

代码实现


代码实现(总)

  1. ElementType DeleteCircularLinkList(CircularLinkList* clList, int pos)
  2. {
  3. ElementType element;
  4. element.id = -999;
  5. if (pos == 1) {
  6. CircularLinkList* node = clList->next;
  7. if (node) {
  8. //找到最后一个结点,改变其指针域的指向
  9. CircularLinkList* lastNode = clList->next;
  10. for (int i = 1; i < clList->length; i++) {
  11. lastNode = lastNode->next;
  12. }
  13. clList->next = node->next;
  14. lastNode->next = clList->next;
  15. free(node);
  16. clList->length--;
  17. }
  18. return;
  19. }
  20. CircularLinkList* preNode;
  21. CircularLinkList* node = clList->next;
  22. for (int i = 1; node && i < pos; i++) {
  23. preNode = node;
  24. node = node->next;
  25. }
  26. if (node) {
  27. element = node->date;
  28. preNode->next = node->next;
  29. free(node);
  30. clList->length--;
  31. }
  32. return element;
  33. }

循环链表的常见操作

已知 P 结点是循环链表的中间结点,通过该节点遍历循环链表

代码实现

  1. CircularNode* GetCircularLinkListNode(CircularLinkList* clList, ELementType element)
  2. {
  3. CircularNode* node = clList->next;
  4. if (!node) return NULL;
  5. do {
  6. if (element.id == node->date.id && strcmp(element.name, node->date.name) == 0) {
  7. return node;
  8. }
  9. } while (node == clList->next);
  10. return NULL;
  11. }


本文转载自: https://blog.csdn.net/forever_bryant/article/details/122149301
版权归原作者 玄澈_ 所有, 如有侵权,请联系我们删除。

“【数据结构与算法】&mdash;&mdash; * 循环链表 *”的评论:

还没有评论