【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;
}