数据结构之链表 (C++类模板实现)

简述

    前面用c写的链表主要使用泛型指针(void *)存储数据的地址,索引到不同类型的数据,而用C++类模板实现后可以直接存储数据,编译器会根据定义好的数据类型动态分配空间。

实现

//链表节点
template<class T>
class LinkNode
{
public:
	T data;
	LinkNode<T> *next;
};

//链表
template <class T>
class LinkList
{
public:
	//初始化
	LinkList();
	//指定位置插入元素
	void insert_LinkList(int pos, T val);
	//头部插入
	void Fush_Front(T val);
	//尾部插入
	void Fush_Back(T val);
	//指定位置删除
	void RemoveByPos_LinkList(int pos);
	//头删
	void Pop_Front();
	//尾删
	void Pop_Back();
	//获得链表大小
	int size_LinkList();
	//根据指定位置获得数据
	T data_LinkList(int index);
	//值删除
	void RemoveByVal(T val);
	//遍历链表
	void Show_LinkList(void(*MyPrint)(T val));
	//析构函数
	~LinkList();
private:
	LinkNode<T> mHeader;
	int mSize;
};


//初始化
template <class T>
LinkList<T>::LinkList()
{
	this->mHeader.next = NULL;
	this->mSize = 0;
}

//指定位置插入元素
template <class T>
void LinkList<T>::insert_LinkList(int pos, T val)
{
	if (pos < 0 || pos > this->mSize)
	{
		pos = this->mSize;
	}
	//创建新节点
	LinkNode<T>* newnode = new LinkNode<T>;
	newnode->data = val;
	newnode->next = NULL;
	//辅助指针
	LinkNode<T>* current = &(this->mHeader);
	for (int i = 0; i < pos; i++)
	{
		current = current->next;
	}
	//新节点入链表
	newnode->next = current->next;
	current->next = newnode;
	this->mSize++;
}
//头部插入
template <class T>
void LinkList<T>::Fush_Front(T val)
{
	insert_LinkList(0, val);
}
//尾部插入
template <class T>
void LinkList<T>::Fush_Back(T val)
{
	insert_LinkList(this->mSize, val);
}
//指定位置删除
template <class T>
void LinkList<T>::RemoveByPos_LinkList(int pos)
{
	if (this->mSize == 0)
	{
		return;
	}
	if (pos < 0 || tpos > this->mSize)
	{
		pos = this->mSize;
	}
	//找到被删除节点的前一个节点
	LinkNode<T>* current = &(this->mHeader);
	for (int i = 0; i < pos; i++)
	{
		current = current->next;
	}
	//缓存被删除节点
	LinkNode<T>* pDel = current->next;
	//建立新的前后驱关系
	current->next = current->next->next;
	//释放被删除节点
	delete pDel;
	this->mSize--;
}

//头删
template <class T>
void LinkList<T>::Pop_Front()
{
	if (this->mSize == 0)
	{
		return;
	}
	RemoveByPos_LinkList(0);
}
//尾删
template <class T>
void LinkList<T>::Pop_Back()
{
	if (this->mSize == 0)
	{
		return;
	}
	RemoveByPos_LinkList(this->mSize - 1);
}

//获得链表大小
template <class T>
int LinkList<T>::size_LinkList()
{
	return this->mSize;
}

//获得数据
template <class T>
T LinkList<T>::data_LinkList(int index)
{
	if (this->mSize == 0)
	{
		return -1;
	}
	if (index < 0 || index >= this->mSize)
	{
		return -1;
	}
	LinkNode<T>* current = &(this->mHeader);
	for (int i = 0; i < index; i++)
	{
		current = current->next;
	}
	return current->data;
}
//值删除
template <class T>
void LinkList<T>::RemoveByVal(T val)
{
	if (this->mSize == 0)
	{
		return;
	}

	//辅助指针变量
	LinkNode<T>* prev = &(this->mHeader);
	LinkNode<T>* current = prev->next;
	while (current != NULL)
	{
		if (current->data == val)
		{
			prev->next = current->next;
			delete current;
			this->mSize--;
			break;
		}
		prev = current;
		current = current->next;
	}
}

//遍历链表
template <class T>
void LinkList<T>::Show_LinkList(void(*MyPrint)(T val))
{
	if (this->mSize == 0)
	{
		return;
	}
	LinkNode<T>* current = this->mHeader.next;
	while (current != NULL)
	{
		MyPrint(current->data);
		current = current->next;
	}
}

//析构函数
template <class T>
LinkList<T>::~LinkList()
{
	cout << "调用析构函数" << endl;
	LinkNode<T>* current = this->mHeader.next;
	while (current != NULL)
	{
		LinkNode<T>* pNext = current->next;
		delete current;
		current = pNext;
	}
}

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值