循环双链表的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
- C实现循环双链表
- c 实现的 循环队列
- C语言循环的实现
- 循环双链表的实现
- 循环双链表的实现
- 数据结构的C实现_循环队列
- 数据结构循环队列的实现c程序
- 循环队列的实现(C语言)
- C实现的循环链表排序
- c语言循环线性队列的实现
- 数据结构的C实现_循环队列
- 循环队列的实现(C语言)
- 顺序循环队列的c语言实现
- 循环缓冲区的C语言实现
- C语言-循环队列的简单实现
- 循环移位的C语言实现
- 【数据结构】循环队列的实现(c++)
- c语言:循环队列的实现
- C语言预处理学习
- Android项目中屏幕适配问题
- python下的MySQLdb使用
- Linux 进程状态 说明
- 基于opencv的一维条码识别
- 循环双链表的C++实现
- 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机
- Color透明度计算方法
- 装office2010时,装了msxml6仍提示要装msxml6
- Java 匿名内部类
- 一个公司管理之八:每日站会变成-僵尸大会
- python 获取当前时间
- 极速搜索的出现,SEO是否也需要改变?
- 《程序员2013精华本》