当前位置: 首页 > news >正文

【数据结构】线性表之链表--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;

}


 

转载于:https://www.cnblogs.com/whongfei/archive/2012/09/02/5247030.html

相关文章:

  • oracle如何获取当年第一月,如今年是2015年,则需获取 201501
  • Lustre I/O性能特点与最佳实践 - 刘爱贵的专栏 - 博客频道 - CSDN.NET
  • loadrunner download file script
  • NSJSONSerialization介绍
  • JavaScript数字精度丢失问题总结
  • 如何在Liferay站点之间快速移植配置和设定
  • 应试教育的死穴,恰在于没有给给孩子留下“犯错”的空间
  • SAX解析全过程详解---代码参考
  • Spring注解@Component、@Repository、@Service、@Controller区别
  • windows 7 15个常用的快捷键
  • NFS的简单使用
  • HTML DOM 和 XML DOM 的区别和联系
  • centos下httpd-2.4的编译安装
  • 9月13号决定
  • Java反射机制
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Docker容器管理
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP--网络协议分层,http历史(二)
  • Intervention/image 图片处理扩展包的安装和使用
  • V4L2视频输入框架概述
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 线上 python http server profile 实践
  • 一个SAP顾问在美国的这些年
  • 一个项目push到多个远程Git仓库
  • 原生 js 实现移动端 Touch 滑动反弹
  • (14)Hive调优——合并小文件
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (TOJ2804)Even? Odd?
  • (附源码)php投票系统 毕业设计 121500
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (实战篇)如何缓存数据
  • (五)网络优化与超参数选择--九五小庞
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)nsfocus-绿盟科技笔试题目
  • (转载)hibernate缓存
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • 、写入Shellcode到注册表上线
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat文件调用java类的main方法
  • .net CHARTING图表控件下载地址
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net 知识杂记
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net和jar包windows服务部署
  • .Net中的集合
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [codeforces] 25E Test || hash
  • [Django 0-1] Core.Handlers 模块