只提供常量阶接口的双链表类模板
来源:互联网 发布:背单词软件 免费 编辑:程序博客网 时间:2024/06/03 20:28
测试双链表所有接口的测试程序
// testcase.cpp : Defines the entry point for the console application.//#include <stdlib.h>#include <stdio.h>#include "LsDoublyLinkedList.h"void fnTestDbList(); ///< 测试CLsDoublyLinkedList<T>双链表的所有接口int main(int argc, char* argv[]){ fnTestDbList(); return 0;}void fnTestDbList(){ int i = 0; int iTmp = 0; CLsDoublyLinkedList<int> list; CLsDoublyLinkedNode<int>* pNode = NULL; CLsDoublyLinkedNode<int>* pNodeToDel = NULL; for (i = 1; i < 10; i++) { pNode = list.addTail(i); list.setAt(pNode, 100 + i); iTmp = list.getAt(pNode); pNode = list.addHead(i + 200); list.setAt(pNode, 100 + i); iTmp = list.getAt(pNode); if (0 == (i % 2)) { pNodeToDel = pNode; list.insert(pNode, 300 + i); } } list.removeAt(pNodeToDel); list.removeHead(); list.removeTail(); printf("[%d]\n", list.getLength()); pNode = list.getHead(); while(NULL != pNode) { printf("%d ", pNode->m_Elem); pNode = pNode->m_pNext; } printf("\r\n"); pNode = list.getTail(); while(NULL != pNode) { printf("%d ", pNode->m_Elem); pNode = pNode->m_pPrev; } printf("\r\n"); }
类模板定义与实现
// LsDoublyLinkedList.h: interface for the CLsDoublyLinkedList class.////////////////////////////////////////////////////////////////////////#if !defined(LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632)#define LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632#include <assert.h>#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/// ----------------------------------------------------------------------/// CLsDoublyLinkedNode 定义/// ----------------------------------------------------------------------/// LsDoublyLinkedList's Nodetemplate <typename T>struct CLsDoublyLinkedNode{ CLsDoublyLinkedNode(T Elem); ~CLsDoublyLinkedNode(); T m_Elem; //数据元素 CLsDoublyLinkedNode<T>* m_pPrev; //前驱 CLsDoublyLinkedNode<T>* m_pNext; //后继};/// ----------------------------------------------------------------------/// CLsDoublyLinkedList 双链表 定义/// ----------------------------------------------------------------------template <typename T>class CLsDoublyLinkedList {public: CLsDoublyLinkedList(); virtual ~CLsDoublyLinkedList(); /// 只提供O(1)的接口^_^ CLsDoublyLinkedNode<T>* getTail() const; CLsDoublyLinkedNode<T>* getHead() const; inline bool isEmpty() const; inline size_t getLength() const; //表长 void clear(); CLsDoublyLinkedNode<T>* addTail(T newElem); bool removeTail(); CLsDoublyLinkedNode<T>* addHead(T newElem); bool removeHead(); T getAt(CLsDoublyLinkedNode<T>* pNode) const; void setAt(CLsDoublyLinkedNode<T>* pNode, T newElem); bool removeAt(CLsDoublyLinkedNode<T>* pNode); bool insert(CLsDoublyLinkedNode<T>* pNode, T newElem);private: CLsDoublyLinkedNode<T>* m_pHead; //头结点 CLsDoublyLinkedNode<T>* m_pTail; //尾结点 size_t m_nLength;};/// ----------------------------------------------------------------------/// CLsDoublyLinkedNode 实现/// ----------------------------------------------------------------------template <typename T>CLsDoublyLinkedNode<T>::CLsDoublyLinkedNode(T Elem):m_Elem(Elem),m_pNext(NULL),m_pPrev(NULL){}template <typename T>CLsDoublyLinkedNode<T>::~CLsDoublyLinkedNode(){}/// ----------------------------------------------------------------------/// CLsDoublyLinkedList 实现/// ----------------------------------------------------------------------template <typename T>inline size_t CLsDoublyLinkedList<T>::getLength() const{ return m_nLength;}template <typename T>inline bool CLsDoublyLinkedList<T>::isEmpty() const{ return (NULL == m_pHead) ? true : false;}template <typename T>CLsDoublyLinkedList<T>::CLsDoublyLinkedList():m_pHead(NULL),m_pTail(NULL),m_nLength(0){}template <typename T>CLsDoublyLinkedList<T>::~CLsDoublyLinkedList(){ clear();}template <typename T>void CLsDoublyLinkedList<T>::clear(){ while (!isEmpty()) { removeTail(); }}template <typename T>T CLsDoublyLinkedList<T>::getAt(CLsDoublyLinkedNode<T>* pNode) const{ T Rc = (T)0; if (NULL != pNode) { return pNode->m_Elem; } return Rc;}template <typename T>void CLsDoublyLinkedList<T>::setAt(CLsDoublyLinkedNode<T>* pNode, T newElem){ if (NULL != pNode) { pNode->m_Elem = newElem; }}template <typename T>bool CLsDoublyLinkedList<T>::insert(CLsDoublyLinkedNode<T>* pNode, T newElem){ CLsDoublyLinkedNode<T>* pNewNode = NULL; CLsDoublyLinkedNode<T>* pPrev = NULL; CLsDoublyLinkedNode<T>* pNext = NULL; pPrev = pNode; if (NULL == pPrev) { return false; } pNewNode = new CLsDoublyLinkedNode<T>(newElem); pNext = pPrev->m_pNext; /* 1 2 3 [6] 4 5 3.next = 6 4.prev = 6 6.prev = 3 6.next = 4 1 2 3 4 5 [6] */ pPrev->m_pNext = pNewNode; if (NULL != pNext) { pNext->m_pPrev = pNewNode; } pNewNode->m_pPrev = pPrev; pNewNode->m_pNext = pNext; m_nLength++; return true;}template <typename T>bool CLsDoublyLinkedList<T>::removeTail(){ bool bRc = false; CLsDoublyLinkedNode<T>* pPrev = NULL; if (NULL == m_pHead) { return false; } //1 2 [3] if (NULL != m_pTail) { pPrev = m_pTail->m_pPrev; if (NULL != pPrev) { pPrev->m_pNext = NULL; } else { m_pHead = NULL; } delete m_pTail; bRc = true; m_pTail = pPrev; m_nLength--; } return bRc;}template <typename T>bool CLsDoublyLinkedList<T>::removeHead(){ if (NULL == m_pHead) { return false; } //[1] 2 3 CLsDoublyLinkedNode<T>* pNext = m_pHead->m_pNext; if (NULL != pNext) { pNext->m_pPrev = NULL; } else { m_pTail = NULL; } delete m_pHead; m_nLength--; m_pHead = pNext; return true;}template <typename T>bool CLsDoublyLinkedList<T>::removeAt(CLsDoublyLinkedNode<T>* pNode){ CLsDoublyLinkedNode<T>* pDelNode = pNode; CLsDoublyLinkedNode<T>* pPrev = NULL; CLsDoublyLinkedNode<T>* pNext = NULL; if ((NULL == m_pHead) || (NULL == pDelNode)) { return false; } /* 1 2 [3] 4 5 2.next = 4 4.prev = 2 [1] 2 3 4 5 1 2 3 4 [5] [1] */ pPrev = pDelNode->m_pPrev; pNext = pDelNode->m_pNext; if (NULL != pPrev) { pPrev->m_pNext = pNext; } else { m_pHead = pNext; } if (NULL != pNext) { pNext->m_pPrev = pPrev; } else { m_pTail = pPrev; } delete pDelNode; m_nLength--; return true;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::addTail(T newElem){ CLsDoublyLinkedNode<T>* pNewNode = new CLsDoublyLinkedNode<T>(newElem); //空表 if (NULL == m_pHead) { m_pHead = m_pTail = pNewNode; } else { //1 2 3 4 5 [6] //5.next = 6 6.prev = 5 tail = 6 m_pTail->m_pNext = pNewNode; pNewNode->m_pPrev = m_pTail; m_pTail = pNewNode; } m_nLength++; return pNewNode;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::addHead(T newElem){ CLsDoublyLinkedNode<T> *pNewNode = new CLsDoublyLinkedNode<T>(newElem); //空表 if (NULL == m_pHead) { m_pHead = m_pTail = pNewNode; } else { //[6] 1 2 3 4 5 //1.prev = 6 6.next = 1 head = 6 m_pHead->m_pPrev = pNewNode; pNewNode->m_pNext = m_pHead; m_pHead = pNewNode; } m_nLength++; return pNewNode;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::getTail() const{ return m_pTail;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::getHead() const{ return m_pHead;}#endif // !defined(LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632)
0 0
- 只提供常量阶接口的双链表类模板
- Struts2框架提供的常量
- 接口的提供方式
- thrift 提供的接口
- AWVS 提供的接口
- 反模式的接口常量
- 静态库的使用,只提供.h
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 国家气象局提供的天气预报接口
- 分析内存泄露的一般步骤
- Python 写网络爬虫思路分析
- OOM(2)
- 元旦闲得:网络流量的经济属性浅解
- 【CSS】最全的CSS浏览器兼容问题
- 只提供常量阶接口的双链表类模板
- UITableViewController值得注意的基本概念
- Application.EnableVisualStyles()的作用
- C#冒泡泡算法
- ssh 无密码登录
- 二维码生成及解析类
- .net 泛型 泛型编程之泛型类、泛型方法、泛型约束
- machine-learning第三周 上机作业
- 秒杀系统架构分析与实战