政务网站的建设,wordpress友情联机,制图软件有哪几种,子网站建设方案✅作者简介#xff1a;大家好#xff0c;我是橘橙黄又青#xff0c;一个想要与大家共同进步的男人#x1f609;#x1f609;
#x1f34e;个人主页#xff1a;橘橙黄又青-CSDN博客
目的#xff1a;学习双向带头链表的增#xff0c;删#xff0c;查#xff0c;销毁…
✅作者简介大家好我是橘橙黄又青一个想要与大家共同进步的男人
个人主页橘橙黄又青-CSDN博客
目的学习双向带头链表的增删查销毁。
1. 双向链表的结构 注意这⾥的“带头”跟前⾯我们说的“头节点”是两个概念实际前⾯的在单链表阶段称呼不严 谨但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点实际为“哨兵位”哨兵位节点不存储任何有效元素只是站在这⾥“放哨 的” 哨兵位”存在的意义 遍历循环链表避免死循环。
结构图解 代码 2. 双向链表的实现 双向链表的定义结构 链表空间申请节点和初始化 2.1哨兵位的申请 2.2带头双向链表打印
我们来分析分析 代码 这里补充一下为什么是传值因为临时拷贝一份打印就行不用打印链表。 2.3双向链表的头插 2.4双向链表的尾插
尾插一个val尾x的元素 2.5双向链表的头删 2.6双向链表的尾删 2.7双线链表的查找 2.8双向链表在指定位置插入 2.9双向链表删除指定位置节点 2.10 双向链表销毁 3.项目代码
Test.c
#includeList.h
void ListTest01() {//LTNode* plist NULL;//LTInit(plist);LTNode* plist LTInit();//尾插//LTPushBack(plist, 1);//LTPushBack(plist, 2);//LTPushBack(plist, 3);//LTPushBack(plist, 4);//LTPrint(plist);//头插LTPushFront(plist, 1);LTPushFront(plist, 2);LTPushFront(plist, 3);LTPushFront(plist, 4);LTPrint(plist); //4-3-2-1-////LTPopBack(plist);//LTPrint(plist);//LTPopBack(plist);//LTPrint(plist);//LTPopBack(plist);//LTPrint(plist);//LTPopBack(plist);//LTPrint(plist);//LTPopBack(plist);//LTPrint(plist);////头删//LTPopFront(plist);//LTPrint(plist);//LTPopFront(plist);//LTPrint(plist);//LTPopFront(plist);//LTPrint(plist);//LTPopFront(plist);//LTPrint(plist);//LTPopFront(plist);//LTPrint(plist);LTNode* findRet LTFind(plist, 3);/*if (findRet NULL) {printf(未找到\n);}else {printf(找到了\n);}*/在指定位置之后插入数据//LTInsert(findRet, 66); //4-3-2-1-66-//LTPrint(plist);//删除pos位置的节点LTErase(findRet);LTPrint(plist);LTDesTroy(plist);plist NULL;
}int main() {ListTest01();return 0;
}
List.h代码
#pragma once
#includestdio.h
#includestdlib.h
#includeassert.h//定义双向链表中节点的结构
typedef int LTDataType;
typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next;
}LTNode;//注意双向链表是带有哨兵位的插入数据之前链表中必须要先初始化一个哨兵位
//void LTInit(LTNode** pphead);
LTNode* LTInit();
//void LTDesTroy(LTNode** pphead);
void LTDesTroy(LTNode* phead); //推荐一级保持接口一致性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);List.c代码
#includeList.h
LTNode* LTBuyNode(LTDataType x) {LTNode* newnode (LTNode*)malloc(sizeof(LTNode));if (newnode NULL) {perror(malloc fail!);exit(1);}newnode-data x;newnode-next newnode-prev newnode;return newnode;
}
//void LTInit(LTNode** pphead) {
// *pphead (LTNode*)malloc(sizeof(LTNode));
// if (*pphead NULL) {
// perror(malloc fail!);
// exit(1);
// }
// (*pphead)-data -1;
// (*pphead)-next (*pphead)-prev *pphead;
//}//哨兵位不含数据。存在目的避免链表死循环
LTNode* LTInit() {LTNode* phead LTBuyNode(-1);return phead;
}//尾插
void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);//phead phead-prev(ptail) newnodenewnode-next phead;newnode-prev phead-prev;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;phead-next-prev newnode;phead-next newnode;
}//链表打印
void LTPrint(LTNode* phead) {//phead不能为空assert(phead);LTNode* pcur phead-next;while (pcur ! phead){printf(%d-, pcur-data);pcur pcur-next;}printf(\n);
}//尾删
void LTPopBack(LTNode* phead) {assert(phead);//链表为空只有一个哨兵位节点assert(phead-next ! phead);LTNode* del phead-prev;LTNode* prev del-prev;prev-next phead;phead-prev prev;free(del);del NULL;
}
//头删
void LTPopFront(LTNode* phead) {assert(phead);assert(phead-next ! phead);LTNode* del phead-next;LTNode* next del-next;//phead del nextnext-prev phead;phead-next next;free(del);del NULL;
}//查找
LTNode* LTFind(LTNode* phead, LTDataType x) {assert(phead);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;free(pos);pos NULL;
}//void LTDesTroy(LTNode** pphead) {
// assert(pphead);
// //哨兵位不能为空
// assert(*pphead);
//
// LTNode* pcur (*pphead)-next;
// while (pcur ! *pphead)
// {
// LTNode* next pcur-next;
// free(pcur);
// pcur next;
// }
// //链表中只有一个哨兵位
// free(*pphead);
// *pphead NULL;
//}//链表销毁
void LTDesTroy(LTNode* phead) {//哨兵位不能为空assert(phead);LTNode* pcur phead-next;while (pcur ! phead){LTNode* next pcur-next;free(pcur);pcur next;}//链表中只有一个哨兵位free(phead);phead NULL;
}
感谢观看都看到这里了点一个赞谢谢。