【C++數據結構學習筆記---線性表】帶頭結點的雙向循環鏈表

【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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章