数据结构一:链表2
2010-04-08 16:43
323 查看
《数据结构一:链表》中链表采用单链表,当大量数据存储或者频繁操作链表时,导致速度过慢。主要原因是单链表反问效率问题,本文档对链表采用双向链表操作,同时对访问时开始位置做“二分”读取,经过测试速度有了很好的提高。
////////////////////////////////////////////////////////////////////////// //队列节点 template<class T> class CRtNode { public: CRtNode<T> *front;//指向前面节点 CRtNode<T> *next;//指向后面节点 T data;//数据 }; ////////////////////////////////////////////////////////////////////////// template<class T> class CRtList: public CRtNode<T> { private: CRtNode<T>* mvo_front;//链表头 CRtNode<T>* mvo_back;//链表尾巴 long mvi_num;//长度 public: CRtList():mvo_front(NULL), mvo_back(NULL), mvi_num(0){ } ~CRtList(){ RemoveAll(); } int Insert_front(const T data);//插入链表头 int Insert_back(const T data);//插入链表尾巴 void RemoveAll();//全部删除队列数据 int RemoveAt(const int index);//删除队列中指定数据 T GetAt(const int index);//得到指定标号的数据 int length() const{ return mvi_num; } }; template<class T> inline T CRtList<T>::GetAt(const int index) { int i = 0; CRtNode<T>* temp; if( index - mvi_num / 2 >= 0 )//删除的标号在队列后半部分 { temp = mvo_back; while((i++) < (mvi_num - index - 1))//删除地址 { temp = temp->front; } } else////删除的标号在队列前半部分 { temp = mvo_front; while((i++) < index)//删除地址 { temp = temp->next; } } return temp->data; } template<class T> inline int CRtList<T>::RemoveAt(const int index) { int i = 0; CRtNode<T>* temp; CRtNode<T>* next, *front; if (index < 0 || index >= mvi_num) return -1; if (index == (mvi_num - 1) )//当删除编号为结尾标号 { temp = mvo_back; mvo_back = mvo_back->front; mvo_back->next = NULL; delete temp; return 0; } if (index == 0 )//当删除编号为链表头标号 { temp = mvo_front; mvo_front = mvo_front->next; mvo_front->front = NULL; delete temp; return 0; } if( index - mvi_num / 2 >= 0 )//删除的标号在队列后半部分 { temp = mvo_back; while((i++) < (mvi_num - index - 1))//删除地址 { temp = temp->front; } } else////删除的标号在队列前半部分 { temp = mvo_front; while((i++) < index)//删除地址 { temp = temp->next; } } front = temp->front; next = temp->next; delete temp; front->next = next; next->front = front; mvi_num--;//数据减少 return 0; } template<class T> inline void CRtList<T>::RemoveAll() { CRtNode<T>* temp;//下一个节点 while(mvo_front) { temp = mvo_front->next; delete mvo_front; mvo_front = temp; } mvo_back = NULL; mvi_num = 0; } template<class T> inline int CRtList<T>::Insert_front(const T data) { //存储新节点 CRtNode<T>* newNode = NULL; CRtNode<T>* temp = NULL; if (NULL == ( newNode = new CRtNode<T> )) return -1; newNode->data = data; newNode->next = NULL; newNode->front = NULL; if (NULL == mvo_front)//队列为空 { mvo_front = mvo_back = newNode; } else//在头部插入新节点 { temp = mvo_front; newNode->next = temp; temp->front = newNode; mvo_front = newNode; } mvi_num++; return 0; } template<class T> inline int CRtList<T>::Insert_back(const T data) { //存储新节点 CRtNode<T>* newNode = NULL; CRtNode<T>* temp = NULL; if (NULL == ( newNode = new CRtNode<T> )) return -1; newNode->data = data; newNode->next = NULL; newNode->front = NULL; if (NULL == mvo_front)//队列为空 { mvo_front = mvo_back = newNode; } else//在尾部插入新节点 { temp = mvo_back; mvo_back->next = newNode; newNode->front = temp; mvo_back = newNode; } mvi_num++; return 0; }
相关文章推荐
- 数据结构(23)队列--单链表实现
- 数据结构--双向循环链表C实现
- 数据结构上机测试2-2:单链表操作B
- 数据结构 ---- 链表
- 常用的数据结构String、链表、Map、hashmap、hashtable区别
- 重拾数据结构:栈、队列、链表、堆(2)
- 数据结构学习笔记之线性结构--离散存储[链表]
- 数据结构--链表
- 基本数据结构:链表
- 数据结构 - 链表
- 数据结构之链表与数组(三)-单向链表上的简单操作
- 【数据结构学习】-链表
- 数据结构--链表、栈、队列存储结构总结
- 数据结构-链表深入剖析(带图)
- 【数据结构】C语言单链表面试题
- 数据结构--单向链表
- 数据结构Java实现04----循环链表、仿真链表
- 【数据结构】二叉搜索树——转换成有序双向链表
- 对链表的相关操作及数据结构的再理解
- 数据结构代码补全-C版-链表及其应用