链表逆置、合并和相关其他函数

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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈笑死哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值