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

来源:互联网 发布:一口吃个胖子 知乎 编辑:程序博客网 时间:2024/06/06 23:09

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的值比链表长度大时,返回-65535line_list_node<T>* LocateElem(line_list_node<T>* a,T i);//定位链表中第一个等于i的结点,没有定位成功则返回NULLvoid AfterInsertElem(line_list_node<T>* a,T i);//在结点a的后面插入元素iline_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的值比链表长度大时,返回-65535line_list_node<T>* LocateElem(line_list_node<T>* a,T i);//定位链表中第一个等于i的结点,没有定位成功则返回NULLvoid AfterInsertElem(line_list_node<T>* a,T i);//在结点a的后面插入元素iline_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
原创粉丝点击