IT评测·应用市场-qidao123.com技术社区

标题: 26考研——线性表_ 线性表的链式体现_双循环链表(2) [打印本页]

作者: 兜兜零元    时间: 2025-4-3 15:37
标题: 26考研——线性表_ 线性表的链式体现_双循环链表(2)
408答疑


  

三、 线性表的链式体现

双循环链表

单链表与双链表的比较

单链表的特点


双链表的特点




双链表上根本操作的实现

双链表的插入操作




双链表的删除操作




双链表的代码实操

定义结点


  1. typedef struct DCListNode {
  2.     ElemType data;          // 数据域
  3.     struct DCListNode *prev; // 前驱指针
  4.     struct DCListNode *next; // 后继指针
  5. } DCListNode, *DCLinkList;
复制代码
创建一个结点


  1. DCListNode* buyNode(ElemType x) {
  2.     DCListNode *s = (DCListNode*)malloc(sizeof(DCListNode));
  3.     s->data = x;
  4.     return s;
  5. }
复制代码
带头结点的双链表初始化


  1. void initDCList(DCListNode **head) {
  2.     *head = (DCListNode*)malloc(sizeof(DCListNode));
  3.     (*head)->prev = *head;
  4.     (*head)->next = *head;
  5. }
复制代码
创建双链表


  1. void createDCList(DCLinkList DCL, ElemType ar[], int n) {
  2.     DCListNode *p = DCL;
  3.     for (int i = 0; i < n; ++i) {
  4.         DCListNode *s = (DCListNode*)malloc(sizeof(DCListNode));
  5.         s->data = ar[i];
  6.         s->prev = p->prev;
  7.         s->next = p;
  8.         p->prev->next = s;
  9.         p->prev = s;
  10.     }
  11. }
复制代码
打印双链表


  1. void printDCList(DCLinkList DCL) {
  2.     DCListNode *p = DCL->next;
  3.     while (p != DCL) {
  4.         printf("%d-->", p->data);
  5.         p = p->next;
  6.     }
  7.     printf("Over.\n");
  8. }
复制代码
查找结点


  1. DCListNode* findDCNode(DCLinkList DCL, ElemType key) {
  2.     DCListNode *p = DCL->next;
  3.     while (p != DCL && p->data != key)
  4.         p = p->next;
  5.     if (p != DCL)
  6.         return p; // 找到了节点
  7.     return NULL;  // 没有找到节点
  8. }
复制代码
插入结点

在指定节点后插入新节点


  1. void insertDCNodeBack(DCLinkList DCL, DCListNode *pos, ElemType x) {
  2.     DCListNode *s = buyNode(x);
  3.     s->prev = pos;
  4.     s->next = pos->next;
  5.     s->next->prev = s;
  6.     s->prev->next = s;
  7. }
复制代码
在指定节点前插入新节点


  1. void insertDCNodeFront(DCLinkList DCL, DCListNode *pos, ElemType x) {
  2.     DCListNode *s = buyNode(x);
  3.     s->prev = pos->prev;
  4.     s->next = pos;
  5.     s->next->prev = s;
  6.     s->prev->next = s;
  7. }
复制代码
删除结点


  1. void deleteDCNode(DCLinkList DCL, ElemType key) {
  2.     DCListNode *p = findDCNode(DCL, key);
  3.     if (p == NULL)
  4.         return; // 删除失败
  5.     p->prev->next = p->next;
  6.     p->next->prev = p->prev;
  7.     free(p);
  8. }
复制代码
反转链表


  1. void reverseDCList(DCLinkList DCL) {
  2.     DCListNode *p = DCL->next;
  3.     DCListNode *q = p->next;
  4.     p->next = DCL;
  5.     DCL->prev = p;
  6.     while (q != DCL) {
  7.         p = q;
  8.         q = q->next;
  9.         p->next = DCL->next;
  10.         p->prev = DCL;
  11.         p->prev->next = p;
  12.         p->next->prev = p;
  13.     }
  14. }
复制代码
排序链表


  1. void sortDCList(DCLinkList DCL) {
  2.     DCListNode *p = DCL->next;
  3.     DCListNode *q = p->next;
  4.     p->next = DCL;
  5.     DCL->prev = p;
  6.     while (q != DCL) {
  7.         p = q;
  8.         q = q->next;
  9.         DCListNode *cur = DCL->next;
  10.         while (cur != DCL && p->data > cur->data)
  11.             cur = cur->next;
  12.         p->next = cur;
  13.         p->prev = cur->prev;
  14.         p->prev->next = p;
  15.         p->next->prev = p;
  16.     }
  17. }
复制代码
循环链表

循环单链表




操作形貌


操作特点


循环双链表




链表的分类



五、参考资料

鲍鱼科技课件

b站免费王道课后题解说:

网课全程班:

26王道考研书


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4