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++实现俄罗斯方块(linux版本)

    C++实现俄罗斯方块(linux版本)

    这篇文章主要为大家详细介绍了linux版本C++实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 深入浅出理解C语言指针的综合应用

    深入浅出理解C语言指针的综合应用

    指针是指向另一个变量的变量。意思是一个指针保存的是另一个变量的内存地址。换句话说,指针保存的并不是普通意义上的数值,而是另一个变量的地址值。一个指针保存了另一个变量的地址值,就说这个指针“指向”了那个变量
    2022-02-02
  • C++算法设计之马踏棋盘的实现

    C++算法设计之马踏棋盘的实现

    这篇文章主要为大家详细介绍了C++算法设计之马踏棋盘的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Visual C++ 6.0添加一个对话框的实现步骤

    Visual C++ 6.0添加一个对话框的实现步骤

    VC6.0是微软公司推出的一款集成开发环境,本文主要介绍了Visual C++ 6.0添加一个对话框的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • C++简单集合类的实现方法

    C++简单集合类的实现方法

    如何使用C++实现一个简单的集合类,这篇文章主要介绍了C++简单集合类的实现方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 内联函数inline与宏定义深入解析

    内联函数inline与宏定义深入解析

    类的内敛函数是一个真正的函数。使用内联函数inline可以完全取代表达式形式的宏定义
    2013-09-09
  • 详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    这篇文章主要介绍了详解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C语言栈顺序结构实现代码

    C语言栈顺序结构实现代码

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译),有需要的朋友可以参考一下
    2013-10-10
  • C语言 将字符串逆序输出的实例

    C语言 将字符串逆序输出的实例

    这篇文章主要介绍了C语言将字符串逆序输出的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 用C语言实现扫雷小游戏

    用C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论