【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;}
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 线性表和带头结点的双向循环链表
- 带头结点的双向循环链表
- 带头结点的双向循环链表
- 带头结点的双向循环链表
- 【C++数据结构学习笔记---线性表】带头结点的单循环链表
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 双向循环链表(带头结点)
- 线性表 - 带头结点的循环单链表
- 带头结点双链循环线性表
- C语言实现双向非循环链表(不带头结点)的基本操作
- C语言实现双向非循环链表(不带头结点)的逆序打印
- C语言实现双向非循环链表(不带头结点)的节点插入
- C语言实现双向非循环链表(不带头结点)的清空
- C实现头插法和尾插法来构建双向非循环链表(带头结点尾结点)
- 线性表学习归纳总结五:不带头结点的循环链表
- 数据结构学习之路-第二章:带头结点的线性链表
- Opencms安装和配置
- spool的简单使用
- signal讲解
- OO 模拟那些事儿
- linux下的多线程编程
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- Mac OS X下安装Java 7及配置Eclipse JDK
- 设置LINUX的IP地址
- ios开发之asihttprequest数据离线缓存与读取
- Android Service的生命周期
- 创建简单的java单例模式类
- pthread_create是UNIX环境创建线程函数
- spring+hibernate下连接两个以上的数据库
- More Effective C++:类型转换