C++语言实现线性表之链表实例

 更新时间:2015年04月20日 11:21:48   作者:司青  
这篇文章主要介绍了C++语言实现线性表之链表,实例分析了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++程序设计有所帮助。

相关文章

  • 详解C++编程中的静态成员与可变数据成员

    详解C++编程中的静态成员与可变数据成员

    这篇文章主要介绍了详解C++编程中的静态成员与可变数据成员,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C++11 并发指南之std::thread 详解

    C++11 并发指南之std::thread 详解

    这篇文章主要介绍了C++11 并发指南之std::thread 详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++事件处理中__event与__raise关键字的用法讲解

    C++事件处理中__event与__raise关键字的用法讲解

    这篇文章主要介绍了C++事件处理中__event与__raise关键字的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 深入解析C++的WNDCLASS结构体及其在Windows中的应用

    深入解析C++的WNDCLASS结构体及其在Windows中的应用

    这篇文章主要介绍了C++的WNDCLASS结构体及其在Windows中的应用,WNDCLASS被用来定义窗口,文中介绍了其诸多属性,需要的朋友可以参考下
    2016-01-01
  • C++ Boost Spirit进阶教程

    C++ Boost Spirit进阶教程

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言实现简单五子棋游戏

    C语言实现简单五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现简单五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Qt实现简易时钟

    Qt实现简易时钟

    这篇文章主要为大家详细介绍了Qt实现简易时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及区别

    这篇文章主要介绍了C语言 指针与数组的详解及对比的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++实现走迷宫小游戏

    C++实现走迷宫小游戏

    这篇文章主要为大家详细介绍了C++实现走迷宫小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言超全面讲解函数的使用方法下

    C语言超全面讲解函数的使用方法下

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数,由于篇幅过大,分为两篇讲解,下面开始下篇
    2022-04-04

最新评论