当前位置: 首页 > news >正文

制作企业网站步骤山东建设兵团网站

制作企业网站步骤,山东建设兵团网站,杭州企业网站建设 哪里好,wordpress 搜索模板双向链表 带头双向循环链表的实现1. 函数的声明2. 函数的实现3. 主函数测试 带头双向循环链表的实现 今天我们来实现一下带头双向循环链表,顾名思义,带头就是有哨兵位,哨兵位不是链表的头,它是连接头节点的一个节点,方…

双向链表

  • 带头双向循环链表的实现
    • 1. 函数的声明
    • 2. 函数的实现
    • 3. 主函数测试

带头双向循环链表的实现

今天我们来实现一下带头双向循环链表,顾名思义,带头就是有哨兵位,哨兵位不是链表的头,它是连接头节点的一个节点,方便操作链表而已;双向就是一个节点可以找到下一个节点,也可以找到上一个节点,所以每个节点应该有两个结构体指针;循环就是没有空指针,哨兵位的上一个节点是尾,尾的下一个节点是哨兵位;如下图为带头双向循环链表:

在这里插入图片描述

1. 函数的声明

以下是函数的声明部分,我们主要实现双向链表的增删查改功能;

		#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>//类型的命名typedef int LTDataType;//定义节点typedef struct ListNode{struct ListNode* prev;struct ListNode* next;LTDataType data;}LTNode;//初始化链表LTNode* ListInit();//打印链表void ListPrint(LTNode* phead);//判断是否是空链表bool IsEmpty(LTNode* phead);//尾插、头插、头删、尾删void ListPushBack(LTNode* phead, LTDataType x);void ListPushFront(LTNode* phead, LTDataType x);void ListPopFront(LTNode* phead);void ListPopBack(LTNode* phead);//查找LTNode* LTFindPos(LTNode* phead, LTDataType x);//在pos位置之前插入void LTInsertPos(LTNode* pos, LTDataType x);//删除pos位置void LTErasePos(LTNode* pos);//销毁void LTDestroy(LTNode* phead);

2. 函数的实现

为了防止创建新的节点的时候重复出现,我们将创建节点写成一个函数:

		LTNode* BuyListNode(int x){LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));assert(newnode);newnode->data = x;newnode->next = NULL;newnode->prev = NULL;return newnode;}

初始化节点,只需要一个哨兵位,它的next和prev都指向自己;

		LTNode* ListInit(){LTNode* phead = BuyListNode(-1);phead->next = phead;phead->prev = phead;return phead;}

打印链表的函数:

		void ListPrint(LTNode* phead){assert(phead);LTNode* cur = phead->next;printf("guard<==>");while (cur != phead){printf("%d<==>",cur->data);cur = cur->next;}printf("\n");}

由于头删尾删的时候不能是空链表,带头的链表的空链表相当于只有一个哨兵位,所以头删尾删的时候链表中不能只剩下哨兵位;

		bool IsEmpty(LTNode* phead){assert(phead);return phead->next == phead;}

尾插函数:

		void ListPushBack(LTNode* phead,LTDataType x){assert(phead);LTNode* newnode = BuyListNode(x);LTNode* tail = phead->prev;newnode->next = phead;tail->next = newnode;newnode->prev = tail;phead->prev = newnode;}

头插函数:

		void ListPushFront(LTNode* phead, LTDataType x){assert(phead);LTNode* newnode = BuyListNode(x);LTNode* next = phead->next;newnode->next = next;newnode->prev = phead;next->prev = newnode;phead->next = newnode;}

头删函数:

		void ListPopFront(LTNode* phead){assert(phead);assert(!IsEmpty(phead));LTNode* del = phead->next;LTNode* next = del->next;phead->next = next;next->prev = phead;free(del);}

尾删函数:

		void ListPopBack(LTNode* phead){assert(phead);assert(!IsEmpty(phead));LTNode* tail = phead->prev;LTNode* tailprev = tail->prev;tailprev->next = phead;phead->prev = tailprev;free(tail);}

查找某个节点的函数,返回找到的节点,否则返回空;

		LTNode* LTFindPos(LTNode* phead, LTDataType x){assert(phead);LTNode* cur = phead->next;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;}

在pos位置之前插入的插入函数:

		void LTInsertPos(LTNode* pos, LTDataType x){assert(pos);LTNode* newnode = BuyListNode(x);LTNode* ptr = pos->prev;ptr->next = newnode;newnode->next = pos;pos->prev = newnode;newnode->prev = ptr;}

删除pos位置的函数:

		void LTErasePos(LTNode* pos){assert(pos);assert(!IsEmpty(pos));LTNode* ptr = pos->prev;LTNode* next = pos->next;ptr->next = next;next->prev = ptr;free(pos);}

销毁链表的函数:

		void LTDestroy(LTNode* phead){assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);}

3. 主函数测试

		#include "List.h"int main(){LTNode* phead = ListInit();ListPushBack(phead, 1);ListPushBack(phead, 2);ListPushBack(phead, 3);ListPushBack(phead, 4);ListPushFront(phead, 10);ListPopBack(phead);ListPopFront(phead);LTNode* pos = LTFindPos(phead, 3);LTInsertPos(pos, 20);LTErasePos(pos);ListPrint(phead);LTDestroy(phead);return 0;}

以上就是带头双向循环链表的基本实现,感兴趣的伙伴可以自行尝试噢!!!

http://www.yayakq.cn/news/883263/

相关文章:

  • 阿里云上做网站山东德州网站建设
  • 秀设计网站网站制作从零开始
  • 网站建设 英语翻译烟台企业网站制作公司
  • 可视化建网站asp 个人网站
  • 常用wap网站开发工具 手机网站制亚马逊的网站建设分析
  • 专业的高端网站设计公司wordpress 论坛末班
  • 高手优化网站营销的五种理念
  • 包头网站建设平台广和泉州seo培训班
  • 做网站优化两年遇到的SEO常态自适应网站做多大尺寸的
  • 网站关键词从哪改厦门外贸网站制作
  • 做电子商务平台网站需要多少钱三明市住房与建设局网站
  • 搭建论坛网站使用的系统金融网站策划
  • 东莞资深网站建设设计网站手机app客户端
  • 国网公司网站邮箱格式怎么写
  • 公司网站建设意义做自适应网站对设计稿的要求
  • 网站下载下来怎么做后台凡科网站建设是免费的吗
  • 简述企业网站的建设过程小企业网站建设查询
  • 怎样做企业手机网站国内免费注册域名
  • 网站做自动群发百度搜录取公司名字大全免费查询
  • 做100个网站挂广告联盟做淘客网站需要多大的空间
  • dedecms后台程序已经安装完了怎么把自己的网站加进去?前端外包网站
  • 网站建站维护运营大连建设工程招聘信息网站
  • 门户网站建设总结技术外包
  • 哪里有营销型网站最新报价专业手机网站建设价格
  • 3D特效做首页的网站惠州网站制作网站
  • 免费自助建站网站一览阿里云 企业 网站
  • 2013年四川省泸州市技能竞赛网站建设样稿面试网站建设的问题
  • 深圳龙岗建设网站全立体网站建设
  • 保定网站优化ks免费刷粉网站推广
  • 网站3级目录可以做导航分类么九江网站开发公司