test.h
#include<bits/stdc++.h>
#ifndef TEST_H
#define TEST_H
using namespace std;
template <class T>
class Node
{
public:
T data;
Node<T> *next;
Node(T data=0){this->data=data;this->next=NULL;}
};
template <class T>
class LinkList
{
Node<T> *head;
public:
LinkList(); //无参构造函数
LinkList(T a[],int n); //有参构造函数
void Evaluation(T a[],int n); //为了给无法调用构造函数但又需要给链表赋值的特殊情况
~LinkList(); //析构函数
int Listlength(); //求链表长度
T Get(int pos); //按位查找返回第pos个元素
int Locate(T x); //按值查找,返回值为x的序号
void PrintList(); //遍历链表并依次输出
void Insert(int i,T item); //在第I个位置插入item元素
T Delete(int i); //删掉第I个元素
void Invert(); //链表逆序
void Merge(LinkList &li1,LinkList &li2); //链表合并
void Split(int pos,LinkList &li1); //链表分段
};
template<class T>
LinkList<T>::LinkList()
{
head=new Node<T>;
head->next=NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T> *q=NULL;
Node<T> *p=head;
while( p!= NULL )
{
q= p->next;
delete p;
p = q;
}
}
template<class T>
void LinkList<T>::Evaluation(T a[],int n)
{
head=NULL;
Node<T> *p=head;
for(int i=0;i<n;i++)
{
Node<T> *tmp=new Node<T>(a[i]);
if(head==NULL)
head=tmp;
else
p->next=tmp;
p=tmp;
}
p->next=NULL;
}
template<class T>
LinkList<T>::LinkList(T a[],int n)
{
head=NULL;
Node<T> *p=head;
for(int i=0;i<n;i++)
{
Node<T> *tmp=new Node<T>(a[i]);
if(head==NULL)
head=tmp;
else
p->next=tmp;
p=tmp;
}
p->next=NULL;
}
template<class T>
void LinkList<T>::PrintList()
{
Node<T> *p=head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
template<class T>
int LinkList<T>::Listlength()
{
Node<T> *p=head;
int length = 0;
while (p)
{
length++;
p=p->next;
}
return length;
}
template<class T>
T LinkList<T>::Get(int pos)
{
int length=this->Listlength();int tmp=pos;
if(tmp>length || tmp<=0){return -1;}
Node<T> *p=head;
int tmp1=1;
while(tmp1!=pos)
{
p=p->next;
tmp1++;
}
return p->data;
}
template<class T>
int LinkList<T>::Locate(T x)
{
int length=this->Listlength();int tmp=0;Node<T> *p=head;
for(int i=0;i<length;i++)
{
if(p->data==x)
{
tmp=i+1;
break;
return tmp;
}
p=p->next;
}
if(tmp==0)
return -1;
}
template<class T>
void LinkList<T>::Insert(int i,T item)
{
int length=this->Listlength();Node<T> *p=head;
if(length==0) {cout<<"链表为空,默认从第一个开始插入"<<endl;p->data=item;}
if(i<1) {cout<<"无法插入第"<<i<<"个元素,请重新输入插入序号"<<endl;}
else if(i>length)
{
cout<<"序号过大,已超出数组最大长度,默认添加在最后一位"<<endl;
int tmp1=1;
while(tmp1!=length){p=p->next;tmp1++;}
Node<T> *tmp=new Node<T>(item);
p->next=tmp;
p=tmp;
}
else
{
int tmp2=1;while(tmp2<i-1){p=p->next;tmp2++;}
Node<T> *s=new Node<T>(item);
s->next=p->next;p->next=s;
}
}
template<class T>
T LinkList<T>::Delete(int i)
{
int tmp=this->Listlength();Node<T> *p=head;
if(i<0 || i>tmp) {return -1;}
else if(i>tmp) {return -2;}
else
{
int tmp1=1;
while(tmp1<i-1){p=p->next;tmp1++;}
Node<T> *s=new Node<T>;
s=p->next;
T x=s->data;
p->next=s->next;
delete s;
return x;
}
}
template<class T>
void LinkList<T>::Invert()
{
Node<T> *p, *q;
p = head;q = head->next;p->next=NULL;
while (q!=NULL)
{
p = q;
q = q->next;
p ->next = head;
head = p;
}
}
template<class T>
void LinkList<T>::Merge(LinkList &li1,LinkList &li2)
{
Node<T> *p1,*p2,*p3;
p1=li1.head->next;p2=li2.head;p3=li1.head;
while((p1!=NULL) && (p2!=NULL))
{
if((p1->data)<(p2->data)){p3->next=p1;p1=p1->next;p3=p3->next;}
else if((p1->data)>(p2->data)){p3->next=p2;p2=p2->next;p3=p3->next;}
else if((p1->data)=(p2->data)){p3=p3->next;p1=p1->next;p2=p2->next;}
}
if(p1!=NULL){p3->next=p1;}
if(p2!=NULL){p3->next=p2;}
}
template<class T>
void LinkList<T>::Split(int pos,LinkList &li1)
{
Node<T> *p=head;Node<T> *q;
int tmp1=1;int k=this->Listlength()-pos;T a[1000];int i=0;
if(k<=0){cout<<"输入数值超出链表长度,无法分段!";}
else if(pos<=0){cout<<"输入的分段位置非法,无法分段!";tmp1=1000;}
while(tmp1!=pos+1)
{
p=p->next;tmp1++;
if(tmp1==pos){q=p;}
}
while(p!=NULL){a[i]=p->data;p=p->next;i++; }
li1.Evaluation(a,k);q->next=NULL;
}
#endif
main.cpp
#include<iostream>
using namespace std;
template<class T>
struct Node //单链表的结点结构(数据域和指针域)
{
T data;
Node<T> *next;
};
template<class T>
class LinkList
{
Node<T> *head; //单链表的头指针
public:
LinkList(); //建立带头结点的空链表
LinkList(T a[],int n); //建立有n个元素的单链表
~LinkList(); //析构函数
int ListLength(); //求单链表的长度
T Get(int pos); //按位查找,取单链表中第pos个结点的元素值
int Locate(T item); //按值查找,求单链表中值为item的元素序号
void PrintLinkList(); //遍历单链表,按序号依次输出各元素
void Insert(int i,T item); //在单链表中第i个位置上插入元素为item的结点
T Delete(int i); //在单链表中删除第i个结点
void Invert(); //逆置单链表
friend void Merge(LinkList<T>&L1,LinkList<T>&L2); //合并有序单链表,声明为友元函数
void Sort();
};
template<class T>
LinkList<T>::LinkList()
{
head=new Node<T>;
head->next=NULL;
}
template<class T>
LinkList<T>::LinkList(T a[],int n)
{
/*head=new Node<T>; //生成头结点
rear=head; //指针r用于指向当前单链表的最后一个结点
for(int i=0;i<n;i++) //为每个数组元素生成一个新结点,并插入到链表尾部
{
s=new Node<T>;
s->data=a[i];
rear->next=s;
rear=s;
}
rear->next=NULL;*/ //单链表建立完毕,将最后一个结点的指针域置空
head = new Node<T>;
head->next = NULL;
for (int i = 0; i < n; i++)
{
Node<T>* p;
p = new Node<T>;
p->data = a[i];
p->next = head->next;
head->next = p;
}
}
template<class T>
int LinkList<T>::ListLength()
{
Node<T>* p;
int num=0;
p=head->next;
while(p)
{
p=p->next;
num++;
}
return num;
}
template<class T>
T LinkList<T>::Get(int pos)
{
Node<T>* p;
p=head->next;
int j=1; //p初始化为第1个数据结点的地址,j初始化为1
while(p&&j<pos)
{
p=p->next;
j++;
}
if(!p||j>pos)
{
cerr<<"查找位置非法";
exit(1);
}
else return p->data;
}
template<class T>
int LinkList<T>::Locate(T item)
{
Node<T>* p;
p=head->next;
int j=1;
while(p&&p->data!=item)
{
p=p->next;
j++;
}
if(p)
return j;
else
return 0;
}
template<class T>
void LinkList<T>::PrintLinkList()
{
Node<T>* p;
p=head->next;
while(p)
{
cout<<p->data<<endl;
p=p->next;
}
}
template<class T>
void LinkList<T>::Insert(int i,T item)
{
Node<T>* p;
p=head;
int j=0;
while(p&&j<i-1) //找到第i-1个结点的位置
{
p=p->next;
j++;
}
if(!p)
{
cerr<<"插入位置非法";
exit(1);
}
else
{
Node<T>* s; //得先定义一个新结点
s = new Node<T>; //生成元素为item的新结点s
s->data=item;
s->next=p->next; //用后插法将s插入到结点p的后面
p->next=s;
}
}
template<class T>
T LinkList<T>::Delete(int i)
{
Node<T>* p;
p=head;
int j=0;
while(p&&j<i-1) //查找第i-1个结点
{
p=p->next;
j++;
}
if(!p||!p->next)
{
cerr<<"删除位置非法";
exit(1);
}
else
{
Node<T>* q;
int x;
q=p->next;
x=q->data;
p->next=q->next;
delete q;
return x;
}
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T>* p;
p=head;
while(p)
{
Node<T>* q; //需要给q先定义为指针变量
q=p;
p=p->next;
delete q;
}
head=NULL;
}
template<class T>
void LinkList<T>::Invert()
{
Node<T>* p;
p=head->next;
head->next=NULL; //将逆置后的单链表初始化为空表
while(p!=NULL) //遍历单链表中的结点
{
Node<T>* q;
q=p;
p=p->next;
q->next=head->next; //将结点插入到逆置后的单链表的表头
head->next=q;
}
}
template<class T>
void Merge(LinkList<T>&L1,LinkList<T>&L2)
{
Node<T>* p1 = L1.head->next;
Node<T>* p2 = L2.head->next;
Node<T>* p3 = L1.head;
while((p1!=NULL)&&(p2!=NULL))
{
if((p1->data)<(p2->data))
{
p3->next=p1;
p1=p1->next;
p3=p3->next;
}
else
{
p3->next=p2;
p2=p2->next;
p3=p3->next;
}
}
if(p1!=NULL)
p3->next=p1;
if(p2!=NULL)
p3->next=p2;
delete L2.head;
L2.head=NULL;
}
template<class T>
void LinkList<T>::Sort()
{
Node<T>* p;
p = head->next;
Node<T>* q=NULL;
while (p)
{
Node<T>* tempp = p;
p = p->next;
Node<T>* prev, * tempq;
for (prev = NULL, tempq = q; tempq != NULL; prev = tempq, tempq = tempq->next)
if (tempq->data > tempp->data)
break;
tempp->next = tempq;
if (prev == NULL)
q = tempp;
else
prev->next = tempp;
}
head->next = q;
}
int main()
{
int *a;
int num;
cout << "请输入链表元素的个数:"; //创建长度为num的链表
cin >> num;
if (num <= 0)
{
cout << "创建失败!" << endl;
return 0;
}
cout << "创建长度为" << num << "的链表" << endl;
a=new int[num];
for (int i = 0; i < num; i++)
{
cin >> a[i];
}
LinkList <int> l(a, num);
l.PrintLinkList();
//int l1=l.Get(6);
int l1=l.Get(3);
cout<<"查找到的元素是:"<<l1<<endl;
int item,l2;
cout<<"输入想要查询的数据:";
cin>>item;
l2=l.Locate(3);
cout<<"查询到数据的序号为:"<<l2<<endl;
l.Insert(2,8);
cout << "插入结点后的链表为:" << endl;
l.PrintLinkList();
l.Delete(4);
cout << "删除结点后的链表为:" << endl;
l.PrintLinkList();
l.Invert();
cout << "逆置后的链表为:" << endl;
l.PrintLinkList();
int *b;
int n2;
cout << "请输入链表元素的个数:";
cin >> n2;
b=new int[n2];
for (int j = 0; j < n2; j++)
{
cin >> b[j];
}
LinkList <int> ll(b, n2);
Merge(l,ll);
cout << "合并后的链表为:" << endl;
l.Sort();
l.PrintLinkList();
return 0;
}