• 售前

  • 售后

热门帖子
入门百科

双向链表的实现

[复制链接]
加菲猫419 显示全部楼层 发表于 2022-1-16 07:57:02 |阅读模式 打印 上一主题 下一主题
不逐一先容了 直接上代码
目次
初始化
创建结点
打印链表
头插
尾插
头删
尾删
定向插入(分前后)
查找
删除
修改
初始化

  1. <code>struct ListNode* InitDlist()//双向链表的初识化
  2. {
  3.         struct ListNode* pHead=BuyDList(0);
  4.         pHead->next = pHead;
  5.         pHead->prev = pHead;
  6.         return pHead;
  7. }
复制代码

创建结点

  1. <code>struct ListNode* BuyDList(DlistType x)//创建新结点
  2. {
  3.         struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
  4.         newnode->prev = NULL;
  5.         newnode->next = NULL;
  6.         newnode->val = x;
  7.         return newnode;
  8. }
复制代码

打印链表

  1. <code>void printDlist(struct ListNode* head)//打印
  2. {
  3.         struct ListNode* next = head->next;
  4.         while (next != head)
  5.         {
  6.                 printf("%d->", next->val);
  7.                 next = next->next;
  8.         }
  9.         printf("over\n");
  10. }
复制代码


头插

  1. <code>
  2. void PushFront(struct ListNode* head, DlistType x)//头插
  3. {
  4.         struct ListNode* newnode = BuyDList(x);//创建新结点
  5.         struct ListNode* first = head->next;//保存除哨兵位的第一个存有数据的结点
  6.         newnode->next =first;//四步操作让新节点插入原链表 两个方向都是双向 方向要变换四次
  7.         newnode->prev = head;
  8.         head->next = newnode;
  9.         first->prev = newnode;
  10.        
  11. }
复制代码

头删

  1. <code>void PopBack(struct ListNode* head)//尾删
  2. {
  3.         assert(head);
  4.         assert(head->next!=head);
  5.         struct ListNode* tail = head->prev;
  6.         struct ListNode* tailprev = tail->prev;
  7.         free(tail);
  8.         tailprev->next = head;
  9.         head->prev = tailprev;
  10. }
复制代码


尾插

  1. <code>
  2. void PushFront(struct ListNode* head, DlistType x)//头插
  3. {
  4.         struct ListNode* newnode = BuyDList(x);//创建新结点
  5.         struct ListNode* first = head->next;//保存除哨兵位的第一个存有数据的结点
  6.         newnode->next =first;//四步操作让新节点插入原链表 两个方向都是双向 方向要变换四次
  7.         newnode->prev = head;
  8.         head->next = newnode;
  9.         first->prev = newnode;
  10.        
  11. }
复制代码

尾删

  1. <code>void PopBack(struct ListNode* head)//尾删
  2. {
  3.         assert(head);
  4.         assert(head->next!=head);
  5.         struct ListNode* tail = head->prev;
  6.         struct ListNode* tailprev = tail->prev;
  7.         free(tail);
  8.         tailprev->next = head;
  9.         head->prev = tailprev;
  10. }
复制代码
定向插入(前)

  1. <code>void DListInsertFront(struct ListNode* head, DlistType x, DlistType k)//指定位置前插
  2. {
  3.         assert(head);
  4.         struct ListNode* insert = FindNode(head, x);
  5.         if (insert)
  6.         {
  7.                 struct ListNode* newnode = BuyDList(k);
  8.                 struct ListNode* prev = insert->prev;
  9.        
  10.                 prev->next = newnode;
  11.                 newnode->prev = prev;
  12.                 newnode->next = insert;
  13.                 insert->prev = newnode;
  14.         }
  15. }
复制代码
定向插入(后)

  1. <code>void DListInsertBehind(struct ListNode* head, DlistType x, DlistType k)//指定位置后插
  2. {
  3.         assert(head);
  4.         struct ListNode* insert = FindNode(head, x);
  5.         if (insert)
  6.         {
  7.                 struct ListNode* newnode = BuyDList(k);
  8.                 struct ListNode* next = insert->next;
  9.                         newnode->val = k;
  10.                 newnode->next = next;
  11.                 next->prev = newnode;
  12.                 newnode->prev = insert;
  13.                 insert->next = newnode;
  14.         }
  15. }
复制代码
删除

  1. <code>void DListErase(struct ListNode* head, DlistType x)//删除指定结点
  2. {
  3.         assert(head);
  4.         assert(head->next != head);
  5.         struct ListNode* erase = FindNode(head, x);
  6.         if (erase)
  7.         {
  8.                 struct ListNode* next = erase->next;
  9.                 struct ListNode* prev = erase->prev;
  10.                 free(erase);
  11.                 next->prev = prev;
  12.                 prev->next = next;
  13.         }
  14. }
复制代码
修改

  1. <code>void DListModify(struct ListNode* head, DlistType x, DlistType k)
  2. {
  3.         assert(head);
  4.         struct ListNode* modify = FindNode(head, x);
  5.         modify->val = k;
  6. }
复制代码



 
 
 
 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作