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