#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--;
}
}
STL-链表模板
最新推荐文章于 2022-08-02 10:22:59 发布