循环双链表的C++实现
2014-03-20 14:58
567 查看
前面一篇文章里实现的是一般的非循环双链表(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); //从循环双链表中查找X
void Delete(int X, Double_Node* Lists);
void Insert(Double_Node* P, int X); //在节点P后面插入X
int 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;
else
P = P->next;
}while(P!=Lists);
return NULL;
}
void Delete(int X, Double_Node* Lists)
{
Double_Node* temp = Find(X,Lists); //如果没找到X,则temp=NULL
if(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代码验证一下:
前面一篇文章里实现的是一般的非循环双链表(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); //从循环双链表中查找X
void Delete(int X, Double_Node* Lists);
void Insert(Double_Node* P, int X); //在节点P后面插入X
int 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;
else
P = P->next;
}while(P!=Lists);
return NULL;
}
void Delete(int X, Double_Node* Lists)
{
Double_Node* temp = Find(X,Lists); //如果没找到X,则temp=NULL
if(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; }结果如下:
相关文章推荐
- 循环双链表基本操作C++实现
- 【c++版数据结构】之循环双链表的实现(带头结点以及尾节点)
- 数据结构之循环双链表的结构和实现
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- 【C++】模板实现带头节点的双向循环链表
- [C++] for循环实现九九乘法表
- C++实现双链表
- 数据结构学习之循环队列的另一种c++实现
- C++实现循环双向链表
- 3.3 C++队列的循环实现
- 【数据结构】双向循环线性表的基本操作--C++/C实现
- C++模板及用模板实现双向循环链表,顺序表
- 循环顺序队列介绍及其C++实现
- C/C++学习(九)循环双链表的操作之创建,插入、删除
- “循环双链表”实际代码宣布实现【物联网1132-11】
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 第四周项目五C/C++循环双链表应用
- C++实现双链表
- 链队列的C++ 实现以及循环队列