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