模板重写数据结构——链表

1.链表的操作,由于链表的值不晓得取整型还是字符型,所以刚脆用模板来重新写了一次:包含的操作有

<span style="white-space:pre">	</span>line_list_node(const T &a):val(a),next(NULL){};//初始化一个结点
<span style="white-space:pre">	</span>virtual line_list_node<T>* Init_List(T a,int len);//初始化一个长度为len的值为a链表
	virtual line_list_node<T>* Init_List(T *a,int len);//初始化一个已知数据的链表
	bool Is_Empty(line_list_node<T>* a) ;//判断链表是否为空
	line_list_node<T>* Clear_List(line_list_node<T>* a);//清空链表
	T GetElem(line_list_node<T>* a,int i);//获取第i个元素的值,当i的值比链表长度大时,返回-65535
	line_list_node<T>* LocateElem(line_list_node<T>* a,T i);//定位链表中第一个等于i的结点,没有定位成功则返回NULL
	void AfterInsertElem(line_list_node<T>* a,T i);//在结点a的后面插入元素i
	line_list_node<T>* InsertElemTh(line_list_node<T>* a,int i,T j);//在第i个位置插入元素j,返回头结点
	line_list_node<T>* DeleteElem(line_list_node<T>* a,int i);//删除第i个结点,返回头结点
	int SizeOfList(line_list_node<T>* a);//链表的长度
	line_list_node<T>* ReverseList(line_list_node<T>* a);//反向链表
	vector<T> DeserializeList(line_list_node<T>* a);//反序列化链表
	line_list_node<T>* UniqueList(line_list_node<T>*a);//删除重复元素
	line_list_node<T>* NextNode(line_list_node<T>* a);//下一个结点
还是经过初步测试通过的,具体代码如下:( 模板的定义要和申请在一个文件中

#ifndef data_structure_h_
#define data_structure_h_
#include <iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>//建立自己的模板函数
using namespace std;
//数据的定义
template<typename T> 
class line_list_node
{
public:
	line_list_node(){};
	line_list_node(const T &a):val(a),next(NULL){};
	~line_list_node(){};
	virtual line_list_node<T>* Init_List(T a,int len);//初始化一个长度为len的值为a链表
	virtual line_list_node<T>* Init_List(T *a,int len);//初始化一个已知数据的链表
	bool Is_Empty(line_list_node<T>* a) ;//判断链表是否为空
	line_list_node<T>* Clear_List(line_list_node<T>* a);//清空链表
	T GetElem(line_list_node<T>* a,int i);//获取第i个元素的值,当i的值比链表长度大时,返回-65535
	line_list_node<T>* LocateElem(line_list_node<T>* a,T i);//定位链表中第一个等于i的结点,没有定位成功则返回NULL
	void AfterInsertElem(line_list_node<T>* a,T i);//在结点a的后面插入元素i
	line_list_node<T>* InsertElemTh(line_list_node<T>* a,int i,T j);//在第i个位置插入元素j,返回头结点
	line_list_node<T>* DeleteElem(line_list_node<T>* a,int i);//删除第i个结点,返回头结点
	int SizeOfList(line_list_node<T>* a);//链表的长度
	line_list_node<T>* ReverseList(line_list_node<T>* a);//反向链表
	vector<T> DeserializeList(line_list_node<T>* a);//反序列化链表
	line_list_node<T>* UniqueList(line_list_node<T>*a);//删除重复元素
	line_list_node<T>* NextNode(line_list_node<T>* a);//下一个结点
private:
	T val;
	line_list_node<T> * next;

};
template<typename T>
 line_list_node<T>*  line_list_node<T>::Init_List(T a,int len)//<span style="color:#3366ff;">实现过程不需要加virtual</span>
{
	line_list_node *Head=new line_list_node(a);
	line_list_node *q=Head;
	for (int i=1;i<len;i++)
	{
		line_list_node *p=new line_list_node(a);
		q->next=p;
		q=p;
	}
	return Head;
}
template<typename T>
 line_list_node<T>*  line_list_node<T>::Init_List(T *a,int len)
{
	line_list_node *Head=new line_list_node(a[0]);
	line_list_node *q=Head;
	for (int i=1;i<len;i++)
	{
		line_list_node *p=new line_list_node(a[i]);
		q->next=p;
		q=p;
	}
	return Head;
}
 template<typename T>
 bool line_list_node<T>::Is_Empty(line_list_node<T>* a) 
 {
	 if (a) return false;
	 else return true;
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::Clear_List(line_list_node<T>* a)
 {
	 line_list_node<T>* p;
	 while(a)
	 {
		 p=a->next;
		 if(p)
		 {
			delete a;
			a=p;
		 }
		 else break;
	 }
	 delete a;
	 a=NULL;
	 return a;
 }
 template<typename T>
 T  line_list_node<T>::GetElem(line_list_node<T>* a,int i)
 {
	 int k=1;
	 while(a&&k<i)
	 {
		 k++;
		 a=a->next;
	 }
	 if(k==i&&a) return a->val;
	 else return -65535;
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::LocateElem(line_list_node<T>* a,T i)
 {
	 while (a)
	 {
		 if(a->val==i)
			 return a;
		 a=a->next;
	 }
	 return NULL;
 }
  template<typename T>
 void line_list_node<T>::AfterInsertElem(line_list_node<T>* a,T i)
 {
	 line_list_node<T>* p=new line_list_node<T>(i);
	 line_list_node<T>* q=a->next;
	 a->next=p;
	 p->next=q;
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::InsertElemTh(line_list_node<T>* a,int i,T j)
 {
	 line_list_node<T>*head=a;
	 int k=1;
	 while (a&&k<i-1)
	 {
		 a=a->next;
		 k++;
	 }
	 if(!a||i<=0) 
	 {
		cout<<"the ith is not in range";
		return head;
	 }
	 if(i==1)
	 {
		line_list_node<T>*q=new line_list_node<T>(j);
		q->next=a;
		return q;
	 }
	 else 
	 {
		 line_list_node<T>*q=new line_list_node<T>(j);
		 line_list_node<T>*p1=a->next;
		 a->next=q;
		 q->next=p1; 
		 return head;
	 }
	 
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::DeleteElem(line_list_node<T>* a,int i)
 {
	 line_list_node *head=a;
	 int k=1;
	 while(a&&k<i-1)
	 {
		 a=a->next;
		 k++;
	 }
	 if(!a||!a->next||i<=0)
	 {
		 cout<<"the ith is not in range";
		 return head;
	 }
	 if(i==1)
	 {
		 head=a->next;
		 a->next=NULL;
		 delete a;
		 return head;
	 }
	 else 
	 {
		line_list_node *p=a->next->next;
		line_list_node *q=a->next;
		a->next=p;
		delete q;
		return head;
	 }
 }
 template<typename T>
 int line_list_node<T>::SizeOfList(line_list_node<T>* a)
 {
	 int k=0;
	 while(a) 
	 {
		 a=a->next;
		 k++;
	 }
	 return k;
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::ReverseList(line_list_node<T>* a)
 {
	 line_list_node<T>* head=a;
	 vector<T>v1;
	 while(a)
	 {
		 v1.push_back(a->val);
		 a=a->next;
	 }
	 int len=v1.size(),i=len-1;
	 a=head;
	 while(i!=-1)
	 {
		 a->val=v1[i--];
		 a=a->next;
	 }
	 return head;
 }
 template<typename T>
 vector<T> line_list_node<T>::DeserializeList(line_list_node<T>* a)
 {
	vector<T> v1;
	 int i=0;
	 while(a)
	 {
		 v1.push_back(a->val);
		 a=a->next;
	 }
	 return v1;
 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::UniqueList(line_list_node<T>*a)
 {
	 vector<T> v1;
	 line_list_node<T>* head=a;
	 v1.push_back(a->val);
	 line_list_node<T>* last=a;
	 a=a->next;
	 while(a)
	 {
		 vector<T>::iterator ite;
		 for (ite=v1.begin();ite!=v1.end();ite++)
		 {
			 if(a->val==*ite)
			 {
				line_list_node<T>* p=a->next;
				last->next=p;
				delete a;
				a=p;
				break;
			 }
		 }
		 if(ite==v1.end())
		 {
			 v1.push_back(a->val);
			 a=a->next;
			 last=last->next;
		 }

	 }
	 return head;

 }
 template<typename T>
 line_list_node<T>* line_list_node<T>::NextNode(line_list_node<T>* a)
 {
	 if(a) return a->next;
	 else return NULL;
 }
#endif
#include "data_structure.h"
int main()
{
	line_list_node<int> *a=new line_list_node<int>(1);
	int b[]={1,1,3,3,4,5,5};
	a=a->Init_List(b,7);
	a=a->UniqueList(a);
	return 0;
}
测试程序,希望有什么错误可以指正,谢谢!!!



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值