循环双链表的C++实现

来源:互联网 发布:linux grep java 编辑:程序博客网 时间:2024/05/29 03:42


    前面一篇文章里实现的是一般的非循环双链表(http://blog.csdn.net/wonggonghong/article/details/21605423)。而下面我们来实现一个循环双链表。

     

    循环双链表通过指针将头节点与尾节点也建立了与其他节点间相似的连接方式。这样做之后,就淡化了链表中存在表头与表尾的意义。因为事实上,链表中任意两个相邻节点之间的连接关系都是一样的。我们将循环双链表的数据结构表示成“圆圈”结构,如图(箭头均表示指针指向):

而一个单节点的循环双链表可以看成该节点自连接形成的“圆圈”结构,如下图所示:

       

即满足条件:Single_Lists->previous= Single_Lists->next = Single_Lists

    于是,对于循环双链表中的任意节点都可以同等看待,不存在特殊节点(头节点、尾节点)。我们基于前面的双链表结构,实现循环双链表。

    在<List.h>头文件里声明循环双链表结构:

#include "list.h"

//循环的双链表结构,包含一些常见的操作#ifndef _List_H_#define _List_H_#include <iostream>struct Double_Node{int element;  //节点存储信息可以根据需要修改!Double_Node* previous;Double_Node* next;};Double_Node* CreateLists(int X); //创建一个循环双链表(此时只有一个节点)void OutputLists(Double_Node* Lists); //输出链表中所有元素的值void DeleteLists(Double_Node* Lists); //删除循环双链表Double_Node* Find(int X, Double_Node* Lists);   //从循环双链表中查找Xvoid Delete(int X, Double_Node* Lists);void Insert(Double_Node* P, int X); //在节点P后面插入Xint GetNumofNodes(Double_Node* Lists); //返回节点总个数#endif

       然后,在<List.cpp>文件里实现循环双链表操作(由于不存在特殊节点,部分操作可以简化):

#include "list.cpp"

#include "list.h"#include <assert.h>Double_Node* CreateLists(int X){Double_Node* Lists = new Double_Node;Lists->element = X;Lists->previous = Lists->next = Lists; //单节点链表形成自循环return Lists;}void DeleteLists(Double_Node* Lists)  {assert(Lists);Double_Node* P = Lists->next, *temp;Lists->next = P->previous = NULL;while(P!=Lists)  {  temp = P->next;         P->next = temp->previous = NULL;delete P;  P = temp;  }delete Lists;}  Double_Node* Find(int X, Double_Node* Lists){assert(Lists);Double_Node* P = Lists;do{if(P->element == X)return P;elseP = P->next;}while(P!=Lists);return NULL;}void Delete(int X, Double_Node* Lists){Double_Node* temp = Find(X,Lists); //如果没找到X,则temp=NULLif(temp){temp->previous->next = temp->next;temp->next->previous = temp->previous;temp->previous = temp->next = NULL;delete temp;}}void Insert(Double_Node* P, int X){assert(P);Double_Node* tempX = new Double_Node;tempX->element = X;tempX->previous = P;tempX->next = P->next;P->next->previous = tempX;   P->next = tempX;}void OutputLists(Double_Node* Lists){assert(Lists);Double_Node* P = Lists;do{std::cout<<P->element<<"   ";P = P->next;}while(P!=Lists);std::cout<<std::endl;}int GetNumofNodes(Double_Node* Lists){assert(Lists);int count = 1;Double_Node* P = Lists->next;while(P!=Lists){         count++; P = P->next;}return count;}
最后,同样用一段main代码验证一下:
#include <iostream>#include "list.h"using namespace std;int main(){int Data[10] = {1,3,4,6,0,2,5,8,12,13};Double_Node* Lists = CreateLists(1);Double_Node* P = Lists;for(int i=1;i<10;i++){Insert(P,Data[i]);P = P->next;}cout<<"打印出循环双链表的所有元素:\n";OutputLists(Lists);if(Find(8,P))cout<<"Find函数没有问题!!\n";Delete(8,Lists);cout<<"Delete节点8后,再打印出(非循环)双链表的所有元素:\n";OutputLists(Lists);cout<<"循环双链表总节点数为:"<<GetNumofNodes(P)<<endl;DeleteLists(Lists);return 0;}
结果如下:





 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 感觉自己好笨没脑子怎么办 脑子浑浊不清晰怎么办 30岁体力下降怎么办 皮肤差毛孔粗大怎么办 最近身体素质越来越差怎么办 身体素质差容易感冒怎么办 易疲惫犯困体质怎么办 成年狗体力不行怎么办 累了体力不支怎么办 新兵连成绩不合格怎么办 征兵体检血压高怎么办 魔域手游幻兽亲密度过低怎么办 移动账号被锁定怎么办 魔域手游账号被冻结怎么办 魔域手游没用的装备怎么办 5173账号三年找回怎么办 电脑的任务栏不见了怎么办 减肥出现瓶颈期怎么办 减肥到瓶颈期怎么办 减脂皮肤松弛怎么办 减肥期间上火了怎么办 涂了瘦身霜好辣怎么办 站起来就头晕怎么办 蹲了起来头晕怎么办 蛙跳后大腿疼怎么办 头低久了脖子痛怎么办 边防武警改革义务兵怎么办 家门钥匙丢了怎么办 森警改革士官怎么办 武警改制后士兵怎么办 消防改革时新兵怎么办 腈纶衣服染色了怎么办 部队新兵体能训练不及格怎么办 做足疗私处有了反应怎么办 跑步跑不起来怎么办 28岁有抬头纹怎么办? 眼睛近视加散光怎么办 眼睛近视又散光怎么办 眼睛近视有散光怎么办 眼睛不近视散光怎么办 孩子眼睛近视散光怎么办