<强>循环双向链表如下图所示:强>
代码如下:
<代码> # include & lt; stdio.h> # include & lt; malloc.h> # include & lt; stdlib.h> typedef结构节点 { int数据; 结构节点*下; 结构节点*之前; * PNode}节点; 空白ControlLinkList (PNode PHead);//控制函数 PNode CreateLinkList(无效);//构造双向循环链表 int PositionLinkList (PNode PHead);//正向遍历 空白ReverseLinkList (PNode PHead);//逆向遍历 空白InsertLinkList (PNode PHead, int pos, int len);//插入某节点 空白DeleteLinkList (PNode PHead, int pos);//删除某节点 空白FindDLinkList (PNode PHead, int pos);//查询某节点 空白ReleaseLinkList (PNode PHead);//释放链表 空白ReversesLinkList (PNode人了);//反转链表,对于循环双向链表反转没有太大意义 int主要(空白) { PNode PHead=CreateLinkList (); ControlLinkList (PHead); 返回0; } PNode CreateLinkList(空白) { int len=0; int我; PNode PHead=(PNode) malloc (sizeof(节点)); PNode r; 如果(NULL==PHead) { printf("分配内存失败\ n”); 退出(EXIT_FAILURE); }//初始化头 PHead→数据=https://www.yisu.com/zixun/0; 之前PHead ->=PHead; PHead下一步->=PHead; r=PHead; printf(“请输入构造几个节点:”); scanf (“% d”, len); (我=0;我& lt;兰;我+ +) { PNode p=(PNode) malloc (sizeof(节点)); 如果(NULL==p) { printf("分配内存失败\ n”); 退出(EXIT_FAILURE); } printf("请输入数据:"); scanf (“% d”,和p→数据); p→下=零;//后驱为NULL p→前=r;//前驱指向r也就是PHead头节点 r→下=p;//然后r的后驱也就PHead的后驱指向p r=p;//最后r=p; } r→下=PHead; 之前PHead→=r;//这两步完成了链表循环,头尾想指 返回PHead;//循环双向链表返回头指针既可以正向反向遍历 } int PositionLinkList (PNode PHead) { int i=0; PNode p=PHead→下;//PHead→下才是链表第一个元素 而(零!=p和,PHead !=p) { 我+ +; printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据); p=p→下; } printf("正向遍历成功”); 返回我; } 空白ReverseLinkList (PNode PHead) { int i=0; PNode p=PHead→之前;//指向了链表尾部r 而(零!=p和,p !=PHead) { 我+ +; printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据); p=p→之前; } printf(“逆向遍历成功\ n”); } 空白InsertLinkList (PNode PHead, int pos, int数据) { int i=1; PNode p=PHead→下; PNode PNew=(PNode) malloc (sizeof(节点)); 如果(NULL==p) { printf("内存分配失败\ n”); 退出(EXIT_FAILURE); } 而(p !=零,,我!=pos-1) { 我+ +; p=p→下; } PNew→数据=https://www.yisu.com/zixun/data; 前p ->下一步->=PNew; PNew下=p -> -> next; p -> next=PNew; 之前PNew ->=p; printf("插入成功\ n”); } 空白FindLinkList (PNode PHead, int pos) { PNode p=PHead→下; int i=1; 而(零!=p和,我!=pos) { 我+ +; p=p→下; } printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据); } 空白DeleteLinkList (PNode PHead, int pos) { int i=1; PNode p=PHead→下; PNode温度; 而(零!=p和,我!=pos) { 我+ +; p=p→下; } temp=p→下;//临时指向删除的节点 下=p p→→下一步→下;//p→下一节点指向删除节点的下一个 p→下一步→下一步→前=p; 免费的(临时); printf("删除节点成功\ n”); } 空白ReleaseLinkList (PNode PHead) { PNode p, q; p=PHead; q=p→下; 而(q !=PHead) { p=; q=p→下; 自由(p); } 免费(PHead); printf("释放内存成功”); } 空白ControlLinkList (PNode PHead) { int len=0; int pos=0; len=PositionLinkList (PHead); ReverseLinkList (PHead); printf(“请输入pos节点:”); scanf (“% d”,和pos); InsertLinkList (PHead pos 10); PositionLinkList (PHead); printf(“请输入查询的节点:”); scanf (“% d”,和pos); FindLinkList (PHead pos); printf(“请输入删除的节点:”); scanf (“% d”,和pos); DeleteLinkList (PHead pos); PositionLinkList (PHead); ReleaseLinkList (PHead); }双向循环链表