您的位置:首页 > 理论基础 > 数据结构算法

【C++数据结构学习笔记---线性表】带头结点的双向循环链表

2013-03-14 00:26 1661 查看
【C++数据结构学习笔记---线性表】带头结点的双向循环链表



一个简单的实现例子,只用到了插入函数以及输出函数,初始化26个英文字母。

插入算法的思路:(insert)本算法为结点后插入

1、声明一结点p指向头结点,初始化i从0开始。

2、遍历链表,让指针p向后移动,直至移动到要插入元素的结点,即向后移动k次。

4、让指针q指向p的右边一个结点。

5、在系统中新建一个结点s。

接着按照图片上的思路插入结点。



删除算法的思路:(erase)本算法为删除第k个结点

1、声明一结点p指向链表第一个结点,初始化i从0开始。

2、遍历链表,让指针p向后移动,一直移动到要删除结点的前一个结点,即向后移动k-1次。

3、让指针q指向p的右边一个结点。

4、执行q=p->right; p->right=q->right; q->right->left=q;删除结点。

#include <iostream>
using namespace std;
template <typename T>
class List;
template <typename T>
class Node{
friend class List<T>;
private:
T data;
Node<T> *left,*right;
};
template <typename T>
class List{
public:
List();									//构造函数
~List();								//析构函数
bool empty()const{return header->right==header->left;}//测试表是否为空
int size()const;						//返回表的长度
bool retrieve(int k,T& x)const;			//返回表位置k处的元素x
int locate(const T& x)const;			//返回元素x在表中的位置
List<T>& insert(int k,const T& x);		//在位置k处插入元素x
List<T>& erase(int k);					//从位置k处删除元素
void print_list()const;					//打印表
private:
Node<T> *header;
};
template <typename T>
List<T>::List()
{
Node<T> *p=new Node<T>;
header=p->left=p->right=p;
}
template <typename T>
List<T>::~List()
{
Node<T> *p=0,*q=0;
p=header->right;
while(header->right==header->left){
q=p->right;
header->right=q;
q->left=header;
delete p;
p=q;
}
delete header;
}

template <typename T>
int List<T>::size()const
{
Node<T> *p=header->right;
int len=0;
while(p!=header){
p=p->right;
++len;
}
return len;
}
template <typename T>
bool List<T>::retrieve(int k,T& x)const
{
Node<T> *p=header->right;
int i=0;
while(i<k-1){
p=p->right;
++i;
}
x=p->data;
return true;
}
template <typename T>
int List<T>::locate(const T& x)const
{
Node<T> *p=header->right;
int i=1;
while((p!=header)){
if (p->data==x) return i;
p=p->right;
++i;
}
return 0;
}
template <typename T>
List<T>& List<T>::insert(int k,const T& x)
{
Node<T> *p=0,*q=0;
p=header;
int i=0;
while(i<k){
p=p->right;
++i;
}
q=p->right;
Node<T> *s=new Node<T>;
s->data=x;
s->right=p->right;
s->left=q->left;
p->right=s;
q->left=s;
return *this;
}
template <typename T>
List<T>& List<T>::erase(int k)
{
Node<T> *p=0,*q=0;
p=header;
int i=0;
while(i<k-1){
p=p->right;
++i;
}
q=p->right;
p->right=q->right;
q->right->left=q;
delete q;
return *this;
}
template <typename T>
void List<T>::print_list()const
{
Node<T> *p=header->right;
while(p!=header){
cout <<p->data <<" ";
p=p->right;
}
}
int main()
{
int s1,s2;
s1='A';
s2='Z';
List<char> p;
for(int i=s2; i>=s1; --i){
p.insert(0,i);
}
p.print_list();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐