您的位置:首页 > 理论基础 > 数据结构算法

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

2015-10-17 18:49 471 查看
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;
}
测试程序,希望有什么错误可以指正,谢谢!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: