【C++数据结构学习笔记---线性表】带头结点的双向循环链表
2013-03-14 00:26
1661 查看
【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;删除结点。
一个简单的实现例子,只用到了插入函数以及输出函数,初始化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; }
相关文章推荐
- 线性表和带头结点的双向循环链表
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构 学习笔记之:线性表——顺序表、静态链表、动态链表(单链表、双链表、单循环链表、双循环链表,链式栈、链式队列)——基础概念大扫盲!
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构:带头结点的双向循环链表
- 数据结构学习笔记(二) 链表之带表头结点的单循环链表基本操作
- C++模板实现双向循环链表(有带头结点)
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构实验-用C++实现带头结点的循环链表
- 小猪的数据结构辅助教程——2.7 线性表中的双向循环链表
- 数据结构示例之带头节点的双向循环链表
- 线性表学习归纳总结五:不带头结点的循环链表
- 数据结构学习笔记之线性结构--离散存储[链表]
- 数据结构 学习笔记(二):线性结构:线性表(顺序表,链表,广义表,多重链表)
- 数据结构高分笔记 算法2-18~2-19:双向循环链表
- 数据结构学习笔记三 循环链表及双向链表
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄