数据结构与算法分析学习笔记---第三章(链表)
来源:互联网 发布:vb 打开文件对话框 编辑:程序博客网 时间:2024/05/17 03:03
单链表:
/////////////////////////////////////////////////////////////////////////////////// FileName : slist(单链表).h// Version : 0.10// Author : Z X// Date : 2014-4-29 19:58:38// Comment : /////////////////////////////////////////////////////////////////////////////////#include <assert.h>#include <iostream>using namespace std;#define ASSERT asserttemplate<typename T>class CNode{public:T m_data;//数据CNode<T> *pnext;//下一个节点地址CNode<T>(): m_data(T()) , pnext(NULL){}CNode(const T &initdata) : m_data(initdata) , pnext(NULL){}CNode(const T &initdata, const CNode<T> *p) : m_data(initdata) , pnext(p){}};template<typename T>class CList{//构造与析构函数public:CList(){m_pNodeHead = NULL;}CList(const T &initdata){AddHead(initdata);}~CList();//成员函数public:CList<T>*InitList();intIsEmpty();//判断是否为空T&GetTail();//得到一个引用,那么可以利用这个引用来改变链表中的值。TGetTail() const;//得到一个对象,改变这个对象不能改变链表中的值。T&GetHead();//得到头TGetHead() const;T&GetAt(int pos);//得到pos处的值,假设1代表list中的第一个值TGetAt(int pos) const;voidSetAt(int pos, const T &data);//将第pos处的值设为dataintGetCount() const;//得到总数intFind(const T &data) const;//找到链表中值为data的结点位置,我们假设是第一个intFindPrevious(const T &data);//找到值为data前面的结点位置voidDelete(const T &data);//删除值为data的结点int InsertBefore(const int pos, const T data);//在pos前面插入值为data的结点int InsertAfter(const int pos, const T data);//在pos后面插入值为data的结点int AddHead(const T data);//添加头int AddTail(const T data);//添加尾void RemoveAt(const int pos);//删除pos处的结点void RemoveHead();//删除头void RemoveTail();//删除尾void RemoveAll();//删除所有元素voidPrintList();//打印所有元素void Test();//测试函数//成员变量protected:CNode<T> *m_pNodeHead;};//创建头结点。如果不想要头结点也可以,那么在List类中加入一个成员变量m_count,//类似的写法见http://www.luocong.com/dsaanotes/index-Z-H-3.htm#node_sec_2.1template<typename T>CList<T>::~CList(){RemoveAll();if(m_pNodeHead)delete m_pNodeHead;m_pNodeHead = NULL;}template<typename T>CList<T> *CList<T>::InitList(){CNode<T> *pNewNode = new CNode<T>();if(NULL == pNewNode)return 0;pNewNode->m_data = 0;pNewNode->pnext = NULL;m_pNodeHead = pNewNode;return this;}template<typename T>int CList<T>::AddHead(const T data){ASSERT(m_pNodeHead);CNode<T> *pNewNode = new CNode<T>();if(NULL == pNewNode)return 0;pNewNode->m_data = data;pNewNode->pnext = m_pNodeHead->pnext;m_pNodeHead->pnext = pNewNode;return 1;}template<typename T>int CList<T>::AddTail(const T data){ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead; CNode<T> *pNewNode = new CNode<T>();if(NULL == pNewNode)return 0;while(pTempNode->pnext != NULL){pTempNode = pTempNode->pnext;}pNewNode->m_data = data;pNewNode->pnext = pTempNode->pnext;pTempNode->pnext = pNewNode;return 1;}template<typename T>intCList<T>::IsEmpty(){return m_pNodeHead == NULL;}template<typename T>T&CList<T>::GetHead(){ASSERT(m_pNodeHead);return m_pNodeHead->pnext->m_data;//用了两次查询地址,略烦。}template<typename T>TCList<T>::GetHead() const{ASSERT(m_pNodeHead);return m_pNodeHead->pnext->m_data;//用了两次查询地址}template<typename T>T&CList<T>::GetTail(){ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext; while(pTempNode->pnext != NULL)pTempNode = pTempNode->pnext;return pTempNode->m_data;}template<typename T>TCList<T>::GetTail() const{ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext; while(pTempNode->pnext != NULL)pTempNode = pTempNode->pnext;return pTempNode->m_data;}template<typename T>T&CList<T>::GetAt(int pos){ASSERT(m_pNodeHead);int i = 1;CNode<T>*pTempNode = m_pNodeHead->pnext;while(i != pos){pTempNode = pTempNode->pnext;++i;}return pTempNode->m_data;}template<typename T>T CList<T>::GetAt(int pos) const{ASSERT(m_pNodeHead);int i = 1;CNode<T>*pTempNode = m_pNodeHead->pnext;while(i != pos){pTempNode = pTempNode->pnext;++i;}return pTempNode->m_data}template<typename T>void CList<T>::SetAt(int pos, const T &data){int i = 1;ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext;while(i != pos){pTempNode = pTempNode->pnext;++i;}pTempNode->m_data = data;}template<typename T>intCList<T>::GetCount() const{ASSERT(m_pNodeHead);int i = 0;CNode<T>*pTempNode = m_pNodeHead->pnext;while(pTempNode != NULL){pTempNode = pTempNode->pnext;++i;}return i;}template<typename T>intCList<T>::Find(const T &data) const{ASSERT(m_pNodeHead);int i = 1;CNode<T>*pTempNode = m_pNodeHead->pnext;while(pTempNode->m_data != data && pTempNode != NULL){pTempNode = pTempNode->pnext;++i;}return pTempNode != NULL ? i : -1;}template<typename T>intCList<T>::FindPrevious(const T &data){ASSERT(m_pNodeHead);int i = 0;CNode<T>*pTempNode = m_pNodeHead->pnext;CNode<T>*pTempPrevious = m_pNodeHead;while(pTempNode->m_data != data && pTempNode != NULL){pTempPrevious = pTempNode;pTempNode = pTempNode->pnext;++i;}return pTempNode != NULL ? i : -1;}template<typename T>void CList<T>::Delete(const T &data){ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext;CNode<T>*pTempPrevious = m_pNodeHead;while(pTempNode && pTempNode->m_data != data){pTempPrevious = pTempNode;pTempNode = pTempNode->pnext;}if(pTempNode != NULL){pTempPrevious->pnext = pTempNode->pnext;delete pTempNode;pTempNode = NULL;}}template<typename T>intCList<T>::InsertBefore(const int pos, const T data){ASSERT(m_pNodeHead);int i = 1;CNode<T>*pTempNode = m_pNodeHead->pnext;CNode<T>*pTempPrevious = m_pNodeHead;while(pTempNode && i != pos){pTempPrevious = pTempNode;pTempNode = pTempNode->pnext;++i;}CNode<T>*pInsertNode = new CNode<T>();if(pInsertNode == NULL)return -1;pTempPrevious->pnext = pInsertNode;pInsertNode->pnext = pTempNode;pInsertNode->m_data = data;return i;}template<typename T>intCList<T>::InsertAfter(const int pos, const T data)//此处,如果pos超过总数,则插在最后一个结点处{ASSERT(m_pNodeHead);int i = 0;CNode<T>*pTempNode = m_pNodeHead;while(pTempNode->pnext != NULL && i != pos){pTempNode = pTempNode->pnext;++i;}CNode<T>*pInsertNode = new CNode<T>();if(pInsertNode == NULL)return -1;pInsertNode->pnext = pTempNode->pnext;pTempNode->pnext = pInsertNode;pInsertNode->m_data = data;return i+1;}template<typename T>void CList<T>::RemoveAt(const int pos){ASSERT(m_pNodeHead);ASSERT(pos);int i = 1;CNode<T>*pTempNode = m_pNodeHead->pnext;CNode<T>*pTempPrevious = m_pNodeHead;while(pTempNode && i != pos){pTempPrevious = pTempNode;pTempNode = pTempNode->pnext;++i;}if(pTempNode != NULL){pTempPrevious->pnext = pTempNode->pnext;delete pTempNode;pTempNode = NULL;}}template<typename T>void CList<T>::RemoveHead(){ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext;if(pTempNode != NULL){CNode<T>*pTempNextNode = pTempNode->pnext;delete pTempNode;pTempNode = NULL;m_pNodeHead->pnext = pTempNextNode;}}template<typename T>void CList<T>::RemoveTail(){ASSERT(m_pNodeHead);CNode<T>*pTempNode = m_pNodeHead->pnext;CNode<T>*pPrevisNode = pTempNode;if(pTempNode == NULL)return;while(pTempNode->pnext != NULL){pPrevisNode = pTempNode;pTempNode = pTempNode->pnext;}delete pTempNode;pTempNode = NULL;pPrevisNode->pnext = NULL;}template<typename T>void CList<T>::RemoveAll()//!!!!!!!!!!!注意,此处是为了保证可以删除list中除去头结点外的其他元素。{CNode<T>*pTempNode = m_pNodeHead;CNode<T>*pTempRemove = m_pNodeHead->pnext;if(pTempRemove == NULL)return;while(pTempNode!= NULL){pTempNode = pTempRemove->pnext;delete pTempRemove;pTempRemove = pTempNode;}m_pNodeHead->pnext = NULL;}template<typename T>void CList<T>::PrintList(){int i,nCount;nCount = GetCount();// print out elementsfor (i = 0; i < nCount; ++i)cout << GetAt(i + 1);cout <<endl;}template<typename T>void CList<T>::Test(){InsertAfter(InsertAfter(AddHead(1), 2), 3);PrintList();InsertAfter(InsertAfter(GetCount(), 4), 5);PrintList();InsertAfter(GetCount(), 6);PrintList();AddTail(10);PrintList();InsertAfter(InsertBefore(GetCount(), 7), 8);PrintList();SetAt(GetCount(), 9);PrintList();RemoveHead();PrintList();RemoveTail();PrintList();cout << Find(3)<<endl;cout << FindPrevious(3)<<endl;Delete(3);PrintList();RemoveAt(3);PrintList();RemoveHead();PrintList();RemoveTail();PrintList();RemoveAll();}
双向链表
#include <assert.h>#include <iostream>#define ASSERY assertusing namespace std;template<typename Y>class CDNode{public:Y m_data;//数据CDNode<Y> *pnext;//下一个节点地址CDNode<Y> *ppre;CDNode<Y>(): m_data(Y()) , pnext(NULL), ppre(NULL){}CDNode(const Y &initdata) : m_data(initdata) , pnext(NULL), ppre(NULL){}CDNode(const Y &initdata, const CDNode<Y> *p) : m_data(initdata) , pnext(p),ppre(NULL){}};template<typename Y>class CDList{//构造与析构函数public:CDList(){m_pNodeHead = NULL;}CDList(const Y &initdata){AddHead(initdata);}~CDList();//成员函数public:CDList<Y>*InitList();intIsEmpty();//判断是否为空Y&GetTail();//得到一个引用,那么可以利用这个引用来改变链表中的值。YGetTail() const;//得到一个对象,改变这个对象不能改变链表中的值。Y&GetHead();//得到头YGetHead() const;Y&GetAt(int pos);//得到pos处的值,假设1代表list中的第一个值YGetAt(int pos) const;voidSetAt(int pos, const Y &data);//将第pos处的值设为dataintGetCount() const;//得到总数intFind(const Y &data) const;//找到链表中值为data的结点位置,我们假设是第一个intFindPrevious(const Y &data);//找到值为data前面的结点位置voidDelete(const Y &data);//删除值为data的结点int InsertBefore(const int pos, const Y data);//在pos前面插入值为data的结点int InsertAfter(const int pos, const Y data);//在pos后面插入值为data的结点int AddHead(const Y data);//添加头int AddTail(const Y data);//添加尾void RemoveAt(const int pos);//删除pos处的结点void RemoveHead();//删除头void RemoveTail();//删除尾void RemoveAll();//删除所有元素voidPrintList();//打印所有元素void Test();//测试函数//成员变量protected:CDNode<Y> *m_pNodeHead;};template<typename Y>CDList<Y>::~CDList(){RemoveAll();if(m_pNodeHead)delete m_pNodeHead;m_pNodeHead = NULL;}template<typename Y>CDList<Y> *CDList<Y>::InitList(){CDNode<Y> *pNewNode = new CDNode<Y>();if(NULL == pNewNode)return 0;pNewNode->m_data = 0;pNewNode->pnext = NULL;pNewNode->ppre = NULL;m_pNodeHead = pNewNode;return this;}template<typename Y>int CDList<Y>::AddHead(const Y data){ASSERY(m_pNodeHead);CDNode<Y> *pNewNode = new CDNode<Y>();if(NULL == pNewNode)return 0;pNewNode->m_data = data;pNewNode->pnext = m_pNodeHead->pnext;pNewNode->ppre = m_pNodeHead;m_pNodeHead->pnext = pNewNode;return 1;}template<typename Y>int CDList<Y>::AddTail(const Y data){ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead; CDNode<Y> *pNewNode = new CDNode<Y>();if(NULL == pNewNode)return 0;while(pYempNode->pnext != NULL){pYempNode = pYempNode->pnext;}pNewNode->m_data = data;pNewNode->pnext = pYempNode->pnext;pYempNode->pnext = pNewNode;pNewNode->ppre = pYempNode;return 1;}template<typename Y>intCDList<Y>::IsEmpty(){return m_pNodeHead->next == NULL;}template<typename Y>Y&CDList<Y>::GetHead(){ASSERY(m_pNodeHead);return m_pNodeHead->pnext->m_data;//用了两次查询地址,略烦。}template<typename Y>YCDList<Y>::GetHead() const{ASSERY(m_pNodeHead);return m_pNodeHead->pnext->m_data;//用了两次查询地址}template<typename Y>Y&CDList<Y>::GetTail(){ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext; while(pYempNode->pnext != NULL)pYempNode = pYempNode->pnext;return pYempNode->m_data;}template<typename Y>YCDList<Y>::GetTail() const{ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext; while(pYempNode->pnext != NULL)pYempNode = pYempNode->pnext;return pYempNode->m_data;}template<typename Y>Y&CDList<Y>::GetAt(int pos){ASSERY(m_pNodeHead);int i = 1;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(i != pos){pYempNode = pYempNode->pnext;++i;}return pYempNode->m_data;}template<typename Y>Y CDList<Y>::GetAt(int pos) const{ASSERY(m_pNodeHead);int i = 1;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(i != pos){pYempNode = pYempNode->pnext;++i;}return pYempNode->m_data}template<typename Y>void CDList<Y>::SetAt(int pos, const Y &data){int i = 1;ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(i != pos){pYempNode = pYempNode->pnext;++i;}pYempNode->m_data = data;}template<typename Y>intCDList<Y>::GetCount() const{ASSERY(m_pNodeHead);int i = 0;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode != NULL){pYempNode = pYempNode->pnext;++i;}return i;}template<typename Y>intCDList<Y>::Find(const Y &data) const{ASSERY(m_pNodeHead);int i = 1;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode->m_data != data && pYempNode != NULL){pYempNode = pYempNode->pnext;++i;}return pYempNode != NULL ? i : -1;}template<typename Y>intCDList<Y>::FindPrevious(const Y &data){ASSERY(m_pNodeHead);int i = 0;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode->m_data != data && pYempNode != NULL){pYempNode = pYempNode->pnext;++i;}return pYempNode != NULL ? i : -1;}template<typename Y>void CDList<Y>::Delete(const Y &data){ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode && pYempNode->m_data != data){pYempNode = pYempNode->pnext;}if(pYempNode != NULL){pYempNode->ppre->pnext = pYempNode->pnext;pYempNode->pnext->ppre = pYempNode->ppre;delete pYempNode;pYempNode = NULL;}}template<typename Y>intCDList<Y>::InsertBefore(const int pos, const Y data){ASSERY(m_pNodeHead);int i = 1;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode && i != pos){pYempNode = pYempNode->pnext;++i;}CDNode<Y>*pInsertNode = new CDNode<Y>();if(pInsertNode == NULL)return -1;pYempNode->ppre->pnext = pInsertNode;pInsertNode->ppre = pYempNode->ppre;pInsertNode->pnext = pYempNode;pInsertNode->m_data = data;return i;}template<typename Y>intCDList<Y>::InsertAfter(const int pos, const Y data)//此处,如果pos超过总数,则插在最后一个结点处{ASSERY(m_pNodeHead);int i = 0;CDNode<Y>*pYempNode = m_pNodeHead;while(pYempNode->pnext != NULL && i != pos){pYempNode = pYempNode->pnext;++i;}CDNode<Y>*pInsertNode = new CDNode<Y>();if(pInsertNode == NULL)return -1;pInsertNode->pnext = pYempNode->pnext;if(pYempNode->pnext!=NULL)pYempNode->pnext->ppre = pInsertNode;pYempNode->pnext = pInsertNode;pInsertNode->ppre = pYempNode;pInsertNode->m_data = data;return i+1;}template<typename Y>void CDList<Y>::RemoveAt(const int pos){ASSERY(m_pNodeHead);ASSERY(pos);int i = 1;CDNode<Y>*pYempNode = m_pNodeHead->pnext;while(pYempNode && i != pos){pYempNode = pYempNode->pnext;++i;}if(pYempNode != NULL){pYempNode->ppre->pnext = pYempNode->pnext;if(pYempNode->pnext != NULL)pYempNode->pnext->ppre = pYempNode->ppre;delete pYempNode;pYempNode = NULL;}}template<typename Y>void CDList<Y>::RemoveHead(){ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext;if(pYempNode != NULL){m_pNodeHead->pnext = pYempNode->pnext;if(pYempNode->pnext != NULL)pYempNode->pnext->ppre = m_pNodeHead;delete pYempNode;pYempNode = NULL;}}template<typename Y>void CDList<Y>::RemoveTail(){ASSERY(m_pNodeHead);CDNode<Y>*pYempNode = m_pNodeHead->pnext;if(pYempNode == NULL)return;while(pYempNode->pnext != NULL){pYempNode = pYempNode->pnext;}pYempNode->ppre->pnext = NULL;delete pYempNode;pYempNode = NULL;}template<typename Y>void CDList<Y>::RemoveAll()//!!!!!!!!!!!注意,此处是为了保证可以删除list中除去头结点外的其他元素。{CDNode<Y>*pYempNode = m_pNodeHead;CDNode<Y>*pYempRemove = m_pNodeHead->pnext;if(pYempRemove == NULL)return;while(pYempNode!= NULL){pYempNode = pYempRemove->pnext;delete pYempRemove;pYempRemove = pYempNode;}m_pNodeHead->pnext = NULL;}template<typename Y>void CDList<Y>::PrintList(){int i,nCount;nCount = GetCount();// print out elementsfor (i = 0; i < nCount; ++i)cout << GetAt(i + 1);cout <<endl;}template<typename Y>void CDList<Y>::Test(){InsertAfter(InsertAfter(AddHead(1), 2), 3);PrintList();InsertAfter(InsertAfter(GetCount(), 4), 5);PrintList();InsertAfter(GetCount(), 6);PrintList();AddTail(10);PrintList();InsertAfter(InsertBefore(GetCount(), 7), 8);PrintList();SetAt(GetCount(), 9);PrintList();RemoveHead();PrintList();RemoveTail();PrintList();cout << Find(3)<<endl;cout << FindPrevious(3)<<endl;Delete(3);PrintList();RemoveAt(3);PrintList();RemoveHead();PrintList();RemoveTail();PrintList();RemoveAll();}
循环列表就是将尾链表的pnext指向head,此处就不再贴出代码了
0 0
- 数据结构与算法分析学习笔记---第三章(链表)
- 【算法】数据结构与算法分析学习笔记——第三章习题选做Josephus问题
- 《数据结构与算法分析--C++描述》(第三版)学习笔记系列一:BST的实现
- 【算法】数据结构与算法分析学习笔记——第三章习题选做快速傅里叶变换与多项式乘法
- 数据结构与算法 java版 学习笔记 第三章
- 【数据结构与算法分析 】第三章总结
- 数据结构与算法分析_学习笔记
- 数据结构与算法分析学习笔记
- 数据结构与算法分析 学习笔记
- 数据结构与算法分析学习笔记---第一章
- 《数据结构与算法分析》学习笔记
- 数据结构与算法分析学习笔记
- 数据结构与算法分析学习笔记
- 数据结构与算法(c语言) 学习笔记——第三章练习
- 数据结构与算法分析学习笔记之一-链表
- 数据结构与算法分析学习笔记---第二章
- 数据结构与算法分析学习笔记--第四章AVL树
- 数据结构与算法分析学习笔记--第五章--排序
- DDoS攻击工具——TFN2K 分析
- Robot
- Android开源客户端之LookAround学习(一)Application & 网络框架
- 阿里面试经历与感受谈
- PB打印标签DLL,支持128码
- 数据结构与算法分析学习笔记---第三章(链表)
- 如何令你的网站“动感十足”
- Android编译和运行原理(2)
- CherryPy wsgiserver模块的分析
- STL vector
- 封装好的无刷新分页程序
- Android自学笔记-17-广播接收者(BroadcastReceiver)
- Windows XP 系统JDK安装
- 最简洁的多重查询的解决方案