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

scratch网站开发wordpress dz论坛

scratch网站开发,wordpress dz论坛,网站建设数据表设计 性别,新闻资讯专业翻译公司目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表#xff1a; 以返回值的形式初始化链表#xff1a; 2.2尾插 2.3打印 2.4头插 2.5尾删 2.6头删 2.7查找 2.8在指定位置之后插入数据​编辑 2.9删除pos节点 2.10销毁 3.整理代码 3.1…目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表  以返回值的形式初始化链表 2.2尾插 2.3打印 2.4头插 2.5尾删 2.6头删 2.7查找 2.8在指定位置之后插入数据​编辑 2.9删除pos节点 2.10销毁 3.整理代码 3.1 List.h 3.2 List.c 3.3 Test.c 1.双向链表的结构 带头链表里的头节点实际为“哨兵位”哨兵位节点不存储任何有效元素只是站在那里“放哨”。 “哨兵位”存在的意义 遍历循环链表避免死循环。 2.双向链表的实现 不带头节点的单链表为空链表的判条件headNULL因为head本来指向链表的第一个节点如果head为NULL说明链表没有节点为空链表。 而带头结点的单链表为空链表的判定条件head-nextNULL; 双向链表为空链表的判定条件链表中只剩下一个头结点。 2.1初始化 申请节点函数 LTNode* LTBuyNode(LTDataType x) {LTNode* node (LTNode*)malloc(sizeof(LTNode));if (node NULL){perror(malloc fail!);exit(1);}node-data x;node-next node-prev node;//自己指向自己return node; } 以参数的形式初始化链表  开始的时候创建一个空链表LTNode* plist NULL;我们要对空链表进行初始化保证让链表只有一个头结点哨兵位为我们后续插入操作做准备。由于要改变plist的指向所以传二级指针。 void LTInit(LTNode** pphead) {//给双向链表创建一个哨兵位*pphead LTBuyNode(-1);//哨兵位里面不需要有值为了调用申请节点函数传一个值-1好了 } 以返回值的形式初始化链表 初始化可以不传递二级指针以返回值的形式返回哨兵位调用完LTInit函数后plist指针接收其返回值LTNode* plist LTInit(); LTNode* LTInit() {LTNode* phead LTBuyNode(-1);return phead; } 2.2尾插 void LTPushBack(LTNode* phead, LTDataType x)//不改变哨兵位的地址传一级指针即可 {assert(phead);LTNode* newnode LTBuyNode(x);//phead phead-prev newnodenewnode-prev phead-prev;newnode-next phead;phead-prev-next newnode;phead-prev newnode;//注意这两行代码不能颠倒位置 } 2.3打印 void LTPrint(LTNode* phead) {LTNode* pcur phead-next;while (pcur ! phead){printf(%d-, pcur-data);pcur pcur-next;}printf(\n); } 2.4头插 void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);//phead newnode phead-nextnewnode-next phead-next;newnode-prev phead;newnode-next-prev newnode;phead-next newnode;//注意这两行代码不能颠倒位置 } 2.5尾删 void LTPopBack(LTNode* phead) {//链表必须有效且链表不能为空(只有一个哨兵位)assert(phead phead-next!phead);LTNode* del phead-prev;//phead del-prev deldel-prev-next phead;phead-prev del-prev;//删除del节点free(del);del NULL; }2.6头删 void LTPopFront(LTNode* phead) {assert(phead phead-next ! phead);LTNode* del phead-next;//phead del del-nextphead-next del-next;del-next-prev phead;//删除del节点free(del);del NULL; } 2.7查找 LTNode* LTFind(LTNode* phead, LTDataType x) {LTNode* pcur phead-next;while (pcur ! phead){if (pcur-data x){return pcur;}pcur pcur-next;}//没有找到return NULL; } 2.8在指定位置之后插入数据 void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode LTBuyNode(x);//pos newnode pos-nextnewnode-next pos-next;newnode-prev pos;pos-next-prev newnode;pos-next newnode; } 2.9删除pos节点 为了保持接口的一致性这里传的是一级指针对形参的修改不影响实参pos置为空不影响find , find此时是野指针所以调用完 LTERase 函数后要手动将find置为空findNULL; void LTErase(LTNode* pos) {assert(pos);// pos-prev pos pos-nextpos-next-prev pos-prev;pos-prev-next pos-next;//删除pos节点free(pos);pos NULL; }2.10销毁 同样为了保持接口的一致性这里也传一级指针对形参的修改不影响实参phead置为空不影响实参plist所以调用完 LTDesTroy 函数后要手动将plist置为空plistNULL; void LTDesTroy(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead){LTNode* next pcur-next;free(pcur);pcur next;}//此时pcur指向phead,而phead还没有被销毁free(phead);phead NULL; } 3.整理代码 3.1 List.h #pragma once #includestdio.h #includestdlib.h #includeassert.h//定义双向链表节点的结构 typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;struct ListNode* prev; }LTNode;//初始化 //void LTInit(LTNode** pphead);//以二级指针形式初始化 LTNode* LTInit();//以返回值形式初始化 //打印 void LTPrint(LTNode* phead); //尾插 void LTPushBack(LTNode* phead,LTDataType x); //头插 void LTPushFront(LTNode* phead, LTDataType x); //尾删 void LTPopBack(LTNode* phead); //头删 void LTPopFront(LTNode* phead); //查找 LTNode* LTFind(LTNode* phead, LTDataType x); //在pos位置之后插⼊数据 void LTInsert(LTNode* pos, LTDataType x); //删除pos节点 void LTErase(LTNode* pos); //销毁 void LTDesTroy(LTNode* phead); 3.2 List.c #includeList.h //申请节点 LTNode* LTBuyNode(LTDataType x) {LTNode* node (LTNode*)malloc(sizeof(LTNode));if (node NULL){perror(malloc fail!);exit(1);}node-data x;node-next node-prev node;//自己指向自己return node; }//初始化 //以返回值形式初始化 LTNode* LTInit() {LTNode* phead LTBuyNode(-1);return phead; }//以二级指针形式初始化 //void LTInit(LTNode** pphead) //{ // *pphead LTBuyNode(-1); //}//打印 void LTPrint(LTNode* phead) {LTNode* pcur phead-next;while (pcur ! phead){printf(%d-, pcur-data);pcur pcur-next;}printf(\n); }//尾插 void LTPushBack(LTNode* phead, LTDataType x)//不改变哨兵位的地址传一级指针即可 {assert(phead);LTNode* newnode LTBuyNode(x);//phead phead-prev newnodenewnode-prev phead-prev;newnode-next phead;phead-prev-next newnode;phead-prev newnode;//注意这两行代码不能颠倒位置 }//头插 void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);//phead newnode phead-nextnewnode-next phead-next;newnode-prev phead;newnode-next-prev newnode;phead-next newnode;//注意这两行代码不能颠倒位置 }//尾删 void LTPopBack(LTNode* phead) {//链表必须有效且链表不能为空(只有一个哨兵位)assert(phead phead-next!phead);LTNode* del phead-prev;//phead del-prev deldel-prev-next phead;phead-prev del-prev;//删除del节点free(del);del NULL; }//头删 void LTPopFront(LTNode* phead) {assert(phead phead-next ! phead);LTNode* del phead-next;//phead del del-nextphead-next del-next;del-next-prev phead;//删除del节点free(del);del NULL; }//查找 LTNode* LTFind(LTNode* phead, LTDataType x) {LTNode* pcur phead-next;while (pcur ! phead){if (pcur-data x){return pcur;}pcur pcur-next;}//没有找到return NULL; }//在pos位置之后插⼊数据 void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode LTBuyNode(x);//pos newnode pos-nextnewnode-next pos-next;newnode-prev pos;pos-next-prev newnode;pos-next newnode;}//删除pos节点 void LTErase(LTNode* pos) { assert(pos);// pos-prev pos pos-nextpos-next-prev pos-prev;pos-prev-next pos-next;//删除pos节点free(pos);pos NULL; }//销毁 void LTDesTroy(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead){LTNode* next pcur-next;free(pcur);pcur next;}//此时pcur指向phead,而phead还没有被销毁free(phead);phead NULL; } 3.3 Test.c #includeList.h void ListTest01() { //传二级指针形式初始化/*LTNode* plist NULL;LTInit(plist); *///以返回值形式初始化LTNode* plist LTInit();//尾插LTPushBack(plist, 1);LTPushBack(plist, 2); LTPushBack(plist, 3);LTPrint(plist);//打印//头插LTPushFront(plist,4); LTPushFront(plist,5); LTPrint(plist);//打印//尾删LTPopBack(plist);LTPrint(plist);//打印//头删LTPopFront(plist);LTPrint(plist);//打印//查找LTNode* find LTFind(plist,4);//删除pos节点LTErase(find);LTPrint(plist);//打印find NULL;//手动置空//销毁 LTDesTroy(plist);plist NULL;//手动置空 } int main() {ListTest01();return 0; }
http://www.dnsts.com.cn/news/145965.html

相关文章:

  • 在国外做盗版电影网站专业网络营销
  • 织梦做的网站快照被攻击福田建网站公司
  • 网站的类型网站建设报价单 excel
  • 西安做的好的网站公司辅助设计软件有哪些
  • 怎么调网站兼容性网络推广公司盈利模式
  • 郑州做外贸网站购物网站首页分成几个模块
  • seo站长工具推广平台wordpress如何还原
  • 教育网站集约化建设中国铁建一体化平台登录
  • 沈阳高端网站建设wordpress 模板 字体大小
  • 做ic销售的各种网站建站及推广
  • 资产负债表在哪个网站可以做建设网站地图
  • 东西湖网站建设公司房产网站方案
  • 上海空灵网站设计番禺人才网上
  • 三亚 网站建设农业网站开发
  • 建设网站要电脑才能吗天门网页设计
  • 小城建设的网站WordPress顶部登陆代码
  • 广州网站的建设淘宝优化
  • 网站建设制作设计营销公司四川如何在亚马逊做公司网站
  • 用divid做网站代码百度竞价登录入口
  • wordpress如何控制内容图片大小深圳seo网站优化公司
  • 做网站如何来钱桂林 网站建站
  • 荆州大气网站建设价格如何做好网络维护工作
  • 机构改革 住房与城乡建设厅网站可以加速网页的加速器
  • 数据中心网站模板最好看的2018中文在线观看
  • 网站 工作室创建网站花钱吗
  • 网站联系方式要素中华建筑网校
  • 成都网站建设前十大型网站建设 教程
  • 广告制作公司名字系统优化大师下载
  • 静态企业网站模板毕业设计医院网站设计怎么做
  • 西安跨境电商平台网站网站建设 成功案例