#include <stdlib.h>
#include <iostream>
using namespace std;
template <class T> //结点类的定义
struct LinkNode {
T data;
LinkNode<T> *link;
LinkNode(LinkNode<T> *ptr=NULL){link=ptr;} //附加头结点的构造函数
LinkNode(T &x,LinkNode<T> *ptr=NULL) {data=x;link=ptr;} //节点的构造函数
};
template <class T> //链表的定义
class List{
private:
LinkNode<T> *first; //头指针
public:
List() {first=new LinkNode<T>;} //first指向附加头结点的地址(构造函数)
List(T &x) {first=new LinkNode<T>(x);} //first指向首节点的地址(构造函数)
List(const List<T> & L); //复制构造函数
List<T> & operator=(List<T> &L); //赋值函数
~List(){makeEmpty();} //析构函数
LinkNode<T> *getHead() const {return first;} //返回头节点
void makeEmpty(); //将表置为空表
bool isEmpty() const {return first->link==NULL? true:false;} //判表空
bool isFull() const {return false;} //判表满(表一般不会出现满的情况
int Length() const; //计算表的长度
LinkNode<T> *Search(T &x)const; //搜索含数据x的元素地址
LinkNode<T> *Locate(int i)const; //搜索第i个元素的地址
bool getData(int i,T&x)const; //取出第i个元素
bool setData(int i,T &x); //用x修改第i个元素的值
bool Insert(int i,T &x); //在第i个元素后插入x
bool Remove(int i); //删除第i个元素
void Union(List<T> L1,List<T> L2); //实现两个链表的并集
void Intersection(List <T> L1, List<T> L2); //实现两个链表的交集
void Union1(List<T> l1,List<T> l2); //实现两个有序链表的合并
void Sort(List<T> L1); //进行排序
void Samedel(); //删除相同的元素
void jose(int n,int s,int m); //josephus问题的求解
void Input(); //输入函数
void Output(); //输出函数
};
template<class T>
List<T>::List(const List<T> &L) {
T value;
LinkNode<T> *cp=L.getHead();
LinkNode<T> *cpp=first=new LinkNode<T>; //
while(cp->link!=NULL) {
value=cp->link->data;
cpp->link=new LinkNode<T>(value);
cp=cp->link;
cpp=cpp->link;
}
cpp->link=NULL;
}
template <class T>
void List<T>::makeEmpty() {
LinkNode<T> *q=NULL;
while(first->link!=NULL) {
q=first->link;
first->link=q->link;
delete q;
}
}
template<class T>
int List<T>::Length()const {
LinkNode<T> *p=first->link;
int count=0;
while(p!=NULL) {
count++;
p=p->link;
}
return count;
}
template <class T>
LinkNode<T> * List<T>::Search(T &x)const {
LinkNode<T> *p=first->link;
while(p!=NULL) {
if(p->data==x) break;
else p=p->link;
}
return p;
}
template<class T>
LinkNode<T> *List<T>::Locate(int i)const{
if(i<0) return NULL;
LinkNode<T> *p=first;
while(p!=NULL&&i>0) {
p=p->link;
i--;
}
return p;
}
template <class T>
bool List<T>::getData(int i,T&x) const {
//if(i<=0) return false;
LinkNode <T>*p=Locate(i);
if(p==NULL) return false;
x=p->data;
return true;
}
template <class T>
bool List<T>::setData(int i,T&x) {
//if(i<=0) return false;
LinkNode <T>*p=Locate(i);
if(p==NULL) return false;
p->data=x;
return true;
}
template <class T>
bool List<T>::Insert(int i,T &x) {
LinkNode <T>*p=Locate(i);
if(p==NULL) return false;
LinkNode<T> *q=new LinkNode<T>(x);
q->link=p->link;
p->link=q;
return true;
}
template <class T>
bool List<T>::Remove(int i){
LinkNode<T> *p=Locate(i-1);
if(p==NULL||p->link==NULL) return false;
LinkNode<T> *del=p->link;
p->link=del->link;
delete del;
return true;
}
template <class T>
void List<T>::Output() {
LinkNode<T> *current=first->link;
while(current!=NULL) {
cout<<current->data<<" ";
current=current->link;
}
cout<<endl;
}
template<class T>
void List<T>::Input() {
LinkNode<T> *p=NULL,*last=first;
cout<<"输入你要输入的元素个数:";
int a;
T x;
cin>>a;
makeEmpty();
while(a--) {
cin>>x;
p=new LinkNode<T>(x);
last->link=p;
last=p;
}
last->link=NULL;
}
template <class T>
void List<T>:: Union(List<T>L1,List<T>L2) {
int m=L2.Length();
int n=L1.Length();
T x;
LinkNode<T> *p=NULL;
for(int i=1;i<=m;i++) {
L2.getData(i,x);
p=L1.Search(x);
if(p==NULL) {
L1.Insert(n,x);
n++;
}
}
if(L1.Length()==0)
cout<<"并集为空集";
else {
cout<<"并集为:";
L1.Output();
}
}
template <class T>
void List<T>::Intersection(List<T> L1,List<T> L2) {
int n=L1.Length();
int i=1;
T x;
LinkNode<T> *p=NULL;
while(i<=n){
L1.getData(i,x);
p=L2.Search(x);
if(p==NULL) {
L1.Remove(i);
n--;
}
else i++;
}
if(L1.Length()==0)
cout<<"交集为空集"<<endl;
else {
cout<<"交集为:";
L1.Output();
}
}
template <class T>
void List<T>::Sort(List<T> L1) {
int i=1,j=0;
int length=L1.Length();
LinkNode<T> *p=NULL;
T d;
for(i=1;i<length;i++) {
p=L1.first;
for(j=0;j<=length-1-i;j++) {
if(p->link->data>p->link->link->data) {
d=p->link->data;
p->link->data=p->link->link->data;
p->link->link->data=d;
}
p=p->link;
}
}
cout<<"排序后的链表为:";
L1.Output();
}
template <class T>
void List<T>::Union1(List <T>l1,List<T>l2)
{
int m=l2.Length();
int n=l1.Length();
T x;
LinkNode<T> *p=NULL;
for(int i=1; i<=m; i++)
{
l2.getData(i,x);
p=l1.Search(x);
if(p==NULL)
{
l1.Insert(n,x);
n++;
}
}
cout<<"有序表合并后";
l1.Sort(l1);
}
template<class T>
void List<T>::Samedel() {
int m=this->Length();
int i=1;
LinkNode<T> *p=NULL;
LinkNode<T> *q=NULL;
T x;
while(i<=m) {
this->getData(i,x);
p=this->Search(x);
q=Locate(i);
if(p!=NULL&&p!=q) {
this->Remove(i);
m--;
}
else i++;
}
cout<<"删除相同的元素后表的内容为:"<<endl;
this->Output();
}
template <class T>
void List<T>::jose(int n,int s,int m) {
LinkNode<T> *last=first->link;
LinkNode<T> *p=this->Locate(s);
LinkNode<T> *q=NULL;
while(1){
last=last->link;
if(last->link==NULL) break;
}
last->link=first->link;
if(m!=0) {
for(int i=1;i<n;i++) {
for(int j=s;j<m;j++) {
q=p;
p=p->link;
}
q->link=p->link;
delete p;
p=q->link;
}
cout<<"最后的赢家是:"<<p->data<<endl;
}
else
cout<<"最后的赢家是:"<<Locate(n)->data<<endl;
}
int main()
{
List<int> l1;
List<int> l2;
l1.Input();
l2.Input();
l1.Intersection(l1,l2);
l1.Union(l1,l2);
l1.Union1(l1,l2);
cout<<"L1";
l1.Samedel();
cout<<"L1的元素为";
l1.Output();
l1.Remove(2);
cout<<"删除第2个元素后的L1为:";
l1.Output();
int x=999;
l1.Insert(1,x);
cout<<"插入第1个元素后的链表为:";
l1.Output();
List<int> l3;
l3.Input(); //L3个数规定为9,因游戏规定个数为9
l3.jose(9,1,0);
List<int> l4;
l4.Input(); //L3个数规定为9,因游戏规定个数为9
l4.jose(9,1,8);
List<int> l5;
l5.Input(); //L3个数规定为9,因游戏规定个数为9
l5.jose(9,1,10);
return 0;
}
链表的实现
猜你喜欢
转载自blog.csdn.net/jthello123/article/details/80297961
今日推荐
周排行