2026.3.22数据结构 单循环链表

发布时间:2026/5/19 16:16:32

2026.3.22数据结构 单循环链表 Circle_List.h#pragma once/*单循环链表1.单链表只要让其尾结点的next不再指向NULL 而是指向头部那就变成了单循环链表即带辅助结点的单循环链表*/typedef int ELEMTYPE ;typedef struct CNode {ELEMTYPE data;struct CNode* next;}CNode,PCNode;//1.初始化函数void Init_LinkList(CNode* plist);//2.购买新节点CNode* BuyNode(ELEMTYPE val);//3.头插bool Insert_head(CNode* plist, ELEMTYPE val);//4.尾插bool Insert_tail(CNode* plist, ELEMTYPE val);//5.按位置插bool Insert_pos(CNode* plist, ELEMTYPE val, int pos);//6.头删bool Delete_head(CNode* plist);//7.尾删bool Delete_tail(CNode* plist);//8.按位置删bool Delete_pos(CNode* plist,int pos);//9.删除这个值出现的第一次bool Delete_val_First(CNode* plist, ELEMTYPE val);//10.删除这个值出现的所有次bool Delete_val_All(CNode* plist, ELEMTYPE val);//11.判空bool IsEmpty(CNode* plist);//12.获取长度int Get_Length(CNode* plist);//13.销毁1void Destroy1(CNode* plist);//14.销毁2void Destroy(CNode* plist);//15.查找CNode* Search(CNode* plist, ELEMTYPE val);//16打印void Show(CNode* plist);Circle_List.cpp#includeCircle_List.h#includestdio.h#includeassert.h#includestdlib.h//1.初始化函数void Init_LinkList(CNode* plist) {assert(plist ! NULL);plist-next plist;//辅助接点初始状态下指向自己}//2.购买新节点CNode* BuyNode(ELEMTYPE val) {CNode* pnewnode (CNode*) malloc(1 * sizeof(CNode));assert(pnewnode ! NULL);if (pnewnode NULL) {return NULL;}pnewnode-data val;pnewnode-next NULL;return pnewnode;}//3.头插bool Insert_head(CNode* plist, ELEMTYPE val) {//1.购买一个新节点CNode* pnewnode BuyNode(val);//2.找到合适的插入位置相当于要找到插入在谁的后面用指针p指向CNode* p plist;//3.修改指针域实现pnewnode插入在p结点后面pnewnode-next p-next;p-next pnewnode;return true;/*CNode*pnewnodeBuyNode(val);assert(plist ! NULL pnewnode!NULL);if (plist NULL || pnewnodeNULL) {return false;}pnewnode-nextplist-next;plist-next pnewnode;return true;*/}//4.尾插bool Insert_tail(CNode* plist, ELEMTYPE val) {//1.购买一个新节点CNode* pnewnode BuyNode(val);//2.找到合适的插入位置相当于要找到插入在谁的后面用指针p指向,相当于把NULL换成了plistCNode* p plist;for (; p-next ! plist; p p-next) {}//3.修改指针域实现pnewnode插入在p结点后面pnewnode-next p-next;p-next pnewnode;return true;/*CNode* pnewnode BuyNode(val);assert(plist ! NULL);if (plist NULL) {return false;}CNode* p plist;for (; p-next ! plist; p p-next) {//假设已经构建完成循环链表相当于把NULL换成了plist}p-next pnewnode;pnewnode-next plist;return true;*/}//5.按位置插bool Insert_pos(CNode* plist, ELEMTYPE val, int pos) {assert(pos 0 pos Get_Length(plist));//1.购买一个新节点CNode* pnewnode BuyNode(val);//2.找到合适的插入位置相当于要找到插入在谁的后面CNode* p plist;for (int i 0; i pos; i) {p p-next;}//3.修改指针域pnewnode-next p-next;p-next pnewnode;return true;/*CNode* pnewnode BuyNode(val);assert(plist ! NULL pnewnode!NULL);if (plist NULL || pnewnodeNULL) {return false;}assert(pos 0 pos Get_Length(plist));CNode* p plist;for (int i 0; i pos; i) {p p-next;}pnewnode-next p-next;p-next pnewnode;return true;*/}//6.头删bool Delete_head(CNode* plist) {//先保证后面的能连接上在保证本家的删除//0.判空if (IsEmpty(plist)) {return false;}//1.找到待删除结点指针q指向CNode* q plist-next;//2.找到待删除结点的上家用指针p指向CNode* p plist;//3.跨越指向释放p-next q-next;free(q);q NULL;return true;/*assert(plist ! NULL);if (plist NULL) {return false;}if (IsEmpty(plist)) {return false;}CNode* q plist-next;CNode* p plist;p-next q-next;free(q);q NULL;return true;*/}//7.尾删bool Delete_tail(CNode* plist) {//0.判空if (IsEmpty(plist)) {return false;}//1.找到待删除结点指针q指向CNode* q plist;for (; q-next ! plist; q q-next);;//2.找到待删除结点的上家用指针p指向CNode* p plist;for (; p-next ! q; p p-next);//3.跨越指向释放p-next q-next;free(q);q NULL;return true;/*assert(plist ! NULL);if (plist NULL) {return false;}if (IsEmpty(plist)) {return false;}CNode* q plist;for (; q-next ! plist; q q-next);;CNode* p plist;for (; p-next ! q; p p-next);p-next q-next;q-next NULL;free(q);q NULL;return true;*/}//8.按位置删bool Delete_pos(CNode* plist, int pos) {assert(pos 0 pos Get_Length(plist));//0.判空if (IsEmpty(plist)) {return false;}//1.找到合适的插入位置的上家用指针p指向CNode* p plist;for (int i 0; i pos; i) {p p-next;}//2.直接给q赋值CNode* q p-next;//3.跨越指向外加释放p-next q-next;free(q);q NULL;return true;/*assert(plist ! NULL);if (plist NULL) {return false;}assert(pos 0 pos Get_Length(plist));if (IsEmpty(plist)) {return false;}CNode* p plist;for (int i 0; i pos; i) {p p-next;}CNode* q p-next;p-next q-next;free(q);q NULL;return true;*/}//9.删除这个值出现的第一次bool Delete_val_First(CNode* plist, ELEMTYPE val) {CNode*qSearch(plist, val);if (q NULL) {return false;}CNode* p p-next;for (; p-next ! q; p p-next) {}p-next q-next;free(q);return true;/*assert(plist ! NULL);//没过脑子if (plist NULL) {return false;}if (IsEmpty(plist)) {return false;}CNode* p plist-next;for (; p! plist; p p-next) {if (p-next Search(plist, val)) {CNode* q p-next;p-next q-next;free(q);return true;}}return false;*/}//10.删除这个值出现的所有次bool Delete_val_All(CNode* plist, ELEMTYPE val) {CNode* p plist;CNode* q plist-next;while (q ! plist) {if (q-data val) {p-next q-next;free(q);q p-next;}else {p p-next;q q-next;}}return true;}//11.判空bool IsEmpty(CNode* plist) {assert(plist ! NULL);return plist-next plist;}//12.获取长度int Get_Length(CNode* plist) {int sum 0;for (CNode* p plist-next; p! plist; p p-next) {sum;}return sum;/*assert(plist ! NULL);if (plist NULL) {return false;}int sum 0;for (CNode* p plist; p-next ! plist; p p-next) {sum;}return sum;*/}//13.销毁1void Destroy1(CNode* plist) {//借助辅助结点 无线头删while (!IsEmpty(plist)) {Delete_head(plist);}}//14.销毁2void Destory(CNode * plist) {//不借助辅结点 用两个指针相互配合来逐步销毁所有节点//assertCNode* p plist-next;CNode* q NULL;while (p ! plist) {q p-next;free(p);p q;}plist-next plist;}//15.查找CNode* Search(CNode* plist, ELEMTYPE val) {for (CNode* p plist-next; p ! plist; p p-next) {if (val p-data) {return p;}}return NULL;/*assert(plist ! NULL);CNode* p plist-next;while (p! plist) {if (p-data val) {return p;}p p-next;}return NULL;*/}//16打印void Show(CNode* plist) {for (CNode* p plist-next; p ! plist; p p-next) {printf(%d , p-data);}printf(\n);}

相关新闻