C++ 实现单链表

来源:互联网 发布:win10怎么重置网络配置 编辑:程序博客网 时间:2024/06/07 06:26
#include <iostream>using namespace std;// 单链表的实现template<typename _Ty>class SingleList{public:SingleList();~SingleList();private:typedef struct tagNode// 节点定义{_Ty_elem;// 值域struct tagNode* pNext;// 指针域}NODE,*PNODE;tagNode*m_pHead;// 节点头tagNode*m_pTitle;// 游标[永远指向的的是最后一个节点]intm_size;// 链表节点数public:// 在链表尾部追加元素bool append(_Ty elem);// 在链表任意点插入元素bool insert(int pos,_Ty elem);// 获取链表头元素_Ty front();// 获取链表尾部元素_Ty last();// 获取链表长度int length(){return m_size};// 删除链表指定节点bool deletepos(int pos,_Ty& res);// 删除链表所有元素bool deleteall();// 链表是否为空bool empty();// 遍历元素void traverse();};template<typename _Ty>SingleList<_Ty>::SingleList(){m_pHead = (tagNode *)malloc(sizeof(tagNode));m_pTitle = m_pHead;m_size = 0;}template<typename _Ty>SingleList<_Ty>::~SingleList(){if(m_pHead->pNext != NULL){deleteall();// 释放所有空间}free(m_pHead);}// 在链表尾部插入元素template<typename _Ty>bool SingleList<_Ty>::append(_Ty elem){tagNode* pNewNode = (tagNode *)malloc(sizeof(tagNode));if(pNewNode == NULL){return false;// 内存空间分配失败}pNewNode->_elem = elem;pNewNode->pNext = NULL;m_pTitle->pNext = pNewNode;m_pTitle = pNewNode;++m_size;return true;}// 在链表任意位置插入元素template<typename _Ty>bool SingleList<_Ty>::insert(int pos,_Ty elem)// pos指的是第几个元素的位置从1开始{int i = 0;// 不能破坏链表头tagNode* pCursor = m_pHead;while(pCursor != NULL && i < pos - 1) // 偏移到插入元素位置{pCursor = pCursor->pNext;++i;}if(i > pos-1 || pCursor == NULL){return append(elem);}tagNode* pNewNode = (tagNode *)malloc(sizeof(tagNode));if(pNewNode == NULL){return false;// 内存空间分配失败}pNewNode->_elem = elem;pNewNode->pNext = pCursor->pNext;pCursor->pNext = pNewNode;++m_size;return true;}// 删除链表所有节点template<typename _Ty>bool SingleList<_Ty>::deleteall(){tagNode* pNode = m_pHead->pNext;tagNode* pTemp = NULL;while(pNode != NULL){pTemp = pNode;pNode = pTemp->pNext;pTemp->_elem = 0;pTemp->pNext = NULL;free(pTemp);--m_size;}m_pHead->pNext = NULL;return true;}// 删除链表指定节点template<typename _Ty>bool SingleList<_Ty>::deletepos(int pos,_Ty& res){if(pos > m_size || m_pHead->pNext == NULL) // 删除的元素不存在{return false;}tagNode* pNode = m_pHead;int i = 0;while(pNode != NULL && i < pos -1)// 偏移到要删除元素位置{pNode = pNode->pNext;++i;}tagNode* pDelete = pNode->pNext;pNode->pNext = pDelete->pNext;pDelete->_elem = 0;pDelete->pNext = NULL;free(pDelete);--m_size;return true;}// 获取第一个元素template<typename _Ty>_Ty  SingleList<_Ty>::front(){return m_pHead->pNext->_elem;}// 获取最后一个一元素template<typename _Ty>_Ty SingleList<_Ty>::last(){return m_pTitle->_elem;}// 判断链表是否为空template<typename _Ty>bool SingleList<_Ty>::empty(){if(m_pHead->pNext == NULL || m_size == 0){return true;}else{return false;}}// 遍历template<typename _Ty>void SingleList<_Ty>::traverse(){tagNode* pTmp = m_pHead->pNext;if(pTmp == NULL || m_size == 0){cout << "链表为空"<<endl;return;}while(pTmp != NULL){cout << pTmp->_elem << "\t";pTmp = pTmp->pNext;}return;}int main(int _args,char* _argc){SingleList<int>* pList = new SingleList<int>;pList->append(1);pList->append(2);pList->append(3);pList->traverse();cout << endl;cout << pList->front()<<endl;int nstop;scanf("%d",&nstop);return 0;}

原创粉丝点击