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

来源:互联网 发布:ubuntu 64位镜像下载 编辑:程序博客网 时间:2024/05/18 15:56

【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处的元素xint locate(const T& x)const;//返回元素x在表中的位置List<T>& insert(int k,const T& x);//在位置k处插入元素xList<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;}
原创粉丝点击