链表的实现

#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
今日推荐