C++语言实现线性表之链表实例
本文实例讲述了C++语言实现线性表之链表实现方法。分享给大家供大家参考。具体分析如下:
插入、删除结点的代码有点多,但这样提高了代码的可读性,且不增加时间复杂度,不会影响程序性能
#include <iostream> using namespace std; template<typename T> class CList; template<class T> class Node { friend CList<T>; private: T m_data; Node *m_pNext; }; template<class T> class CList { public: CList(); ~CList(); bool IsEmpty(); void Append(const T &data); void Delete(const int &pos); void Print(); int GetLength(); T Find(const int &pos); void Insert(const int &pos,const T &data); private: Node<T> *m_pHead; Node<T> *m_pEnd; int m_len; void Create(); void Destroy(); }; //为头结点分配空间 template<class T> void CList<T>::Create() { m_pHead = new Node<T>; m_pEnd = new Node<T>; m_pHead->m_pNext = NULL; m_pEnd->m_pNext = m_pHead->m_pNext; m_len = 0; } template<class T> CList<T>::CList() { Create(); } //删除所有结点 template<class T> void CList<T>::Destroy() { Node<T> *pF = m_pHead->m_pNext; Node<T> *pT; while(pF) { pT = pF; pF = pF->m_pNext; delete pT; } } template<class T> CList<T>::~CList() { Destroy(); } //判断是否为空 template<class T> bool CList<T>::IsEmpty() { if(!m_pHead->m_pNext) { return true; } else { return false; } } //从表的最后加入一个元素 template<class T> void CList<T>::Append(const T &data) { Node<T> *pT = new Node<T>; pT->m_data = data; pT->m_pNext = NULL; if(!m_pHead->m_pNext) { m_pHead->m_pNext = pT; } else { (m_pEnd->m_pNext)->m_pNext = pT; } m_pEnd->m_pNext = pT; ++m_len; } //删除一个元素 template<class T> void CList<T>::Delete(const int &pos) { if(pos < 0 || pos < m_len) { cout<<"位置不合法"<<endl; return; } Node<T> *pPre = NULL;//存放前一个结点 Node<T> *pBehind = NULL;//存放后一个结点 Node<T> *pT = m_pHead->m_pNext;//目标结点 int ix = -1; while(pT) { ++ix; if(ix == pos - 1 - 1) { pPre = pT; } else if(ix == pos - 1) { pBehind = pT->m_pNext; break; } pT = pT->m_pNext; } if(!pPre)//如果指针为空则说明pos是指第一个元素 { delete pT; m_pHead->m_pNext = pBehind; --m_len; return; } if(!pBehind)//如果指针为空则说明pos是指最后一个元素 { m_pEnd = pPre; delete pT; } pPre->m_pNext = pBehind; --m_len; } //输出所有数据 template<class T> void CList<T>::Print() { Node<T> *pT = m_pHead->m_pNext; while(pT) { cout<<pT->m_data<<","; pT = pT->m_pNext; } cout<<endl; } template<class T> int CList<T>::GetLength() { return m_len; } //查找数据 template<class T> T CList<T>::Find(const int &pos) { if(pos <= 0) { cout<<"输入不合法"<<endl; return NULL; } if(pos > m_len) { cout<<"超出表长"<<endl; return NULL; } int i = 0; Node<T> *pT = m_pHead->m_pNext; while(pT) { ++i; if(i == pos) { return pT->m_data; } pT = pT->m_pNext; } return NULL; } template<class T> void CList<T>::Insert(const int &pos,const T &data) { if(pos <= 0 || pos >m_len) { cout<<"输入不合法"<<endl; return; } int i = 0; Node<T> *pT = m_pHead->m_pNext; Node<T> *pPre = NULL; Node<T> *pBehind = NULL; while(pT) { ++i; if(i == pos - 1) { pPre = pT; } if(i == pos) { pBehind = pT->m_pNext; break; } pT = pT->m_pNext; } Node<T> *pNew = new Node<T>; pNew->m_data = data; if(!pPre)//如果指针为空则说明pos是指第一个元素 { pNew->m_pNext = m_pHead->m_pNext; m_pHead->m_pNext = pNew; ++m_len; return; } if(!pBehind)//如果指针为空则说明pos是指最后一个元素 { m_pEnd->m_pNext = pNew; } pPre->m_pNext = pNew; pNew->m_pNext = pT; ++m_len; }
希望本文所述对大家的C++程序设计有所帮助。
上一篇:VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法
栏 目:C语言
下一篇:C语言创建windows窗口实例
本文标题:C++语言实现线性表之链表实例
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3086.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结