STL-链表模板

#include<iostream>
using namespace std;



/*
思想:当传入一个元素后,自动给其加上一个地址域并封装在结构体里,再将结构体存入链表
因有需根据元素查找和删除的函数,故传入数据时,应传入数据地址。
*/


typedef struct LinkListNobe 
{
	struct LinkListNobe *next;
}LinkListNobe;   //

template<class T>
class TLinklist
{
public:
	TLinklist();
	~TLinklist();
	int TLinglist_Insert(T &x,int pos); //增  x 元素  pos 插入位置
	T  TLinglist_print(int pos);  //打印 pos 要打印的第几个元素
	void LinkList_Clear(); //清空
	void TLinglist_Del(int pos); //删除 根据下标
	void TLinglist_Del(T *&&x);//删除 根据元素
	int LinkList_Length();//获取链表长度
	int LinkList_Search(T *&x); //查找 ,返回为元素所在下标
private:
	typedef struct data
	{
		LinkListNobe *node; //加上的地址域
		T *x; //原数据
	}data;  
	int length; //链表长度
	LinkListNobe header; //表头

};


template<class T>
TLinklist<T>::TLinklist()
{
	this->length = 0;
	this->header.next = nullptr;
}

template<class T>
TLinklist<T>::~TLinklist()
{
	while (this->length != 0)  //判断链表是否为空,未空时需释放内存
	{
		LinkListNobe *tmp = this->header.next->next;
		free(this->header.next);
		this->header.next = tmp;
		length--;
	}
}

template<class T>
int TLinklist<T>::LinkList_Length()  //获取长度
{
	return this->length;
}



template<class T>
int TLinklist<T>::TLinglist_Insert(T &x,int pos)  //插入元素
{
	if (pos > this->length || pos < 0)
	{
		return -1;
	}
	data *newdata = new data;  //创建结构体
	newdata->x = &x;    //放入数据
	LinkListNobe *ret = &(this->header);
	for (int i = 0; i < pos; i++)
	{
		ret = ret->next;
	}
	newdata->node = ret->next;  
	ret->next = (LinkListNobe *)newdata;  //放进链表
	this->length++;
	return 0;
}


template<class T>
T TLinklist<T>::TLinglist_print(int pos)  //打印(根据下标)
{
	if (pos > this->length || pos < 0)
	{
		exit(0);
	}
	LinkListNobe *ret = &(this->header);
	for (int i = 0; i < pos; i++)
	{
		ret = ret->next;
	}
	T *x = ((data *)(ret->next))->x;
	return *x;
}

template<class T>
int TLinklist<T>::LinkList_Search(T*&x)  //查找元素,返回元素所在位置,没有返回-1
{
	LinkListNobe *ret = &(this->header);
	for (int i = 0; i <this->length; i++)
	{

		T *mx = ((data *)(ret->next))->x;
		if (mx == x)
		{
			return i;
		}
		ret = ret->next;
	}

	return -1;
}

template<class T>
void TLinklist<T>::TLinglist_Del(int pos) //删除某一元素(根据下标)
{
	if (pos > this->length || pos < 0)
	{
		exit(0);
	}
	LinkListNobe *ret = &(this->header);
	for (int i = 0; i < pos; i++)
	{
		ret = ret->next;
	}
	LinkListNobe *current = ret->next->next;
	free(ret->next);
	ret->next = current;
	this->length--;
}



template<class T>
void TLinklist<T>::TLinglist_Del( T*&&x)  //根据元素(重载)
{

	int i = LinkList_Search(x); //查找要删除的元素位置

	if (i != -1)
	{
		TLinglist_Del(i);  //删除
	}

}


template<class T>
void TLinklist<T>::LinkList_Clear()    //清空链表
{
	while (this->length != 0)
	{
		LinkListNobe *tmp = this->header.next->next;
		free(this->header.next);
		this->header.next = tmp;
		length--;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值