单链表及其应用

#include <iostream>
#include <stdio.h>
#include<algorithm>
using namespace std;
class List; //前视定义,否则友元无法定义
class LinkNode
{
 friend  List; //链表结点类的定义
 private:
   LinkNode *link;
   int data;
 public:
   LinkNode (LinkNode *ptr = NULL)    {link=ptr;}
   LinkNode(const int & item, LinkNode *ptr = NULL){  data=item;link=ptr;}
   ~LinkNode(){};

};

class ListSon;
class LinkNodeSon:public LinkNode
{
    friend  ListSon;
    friend void hebing(ListSon &LA,ListSon &LB);


public:
    int data;
    LinkNodeSon *link;
    LinkNodeSon (LinkNodeSon *ptr = NULL)
    {
        link=ptr;
    }
    LinkNodeSon(const int & item, LinkNodeSon *ptr = NULL)
    {
        data=item;
        link=ptr;
    }
    ~LinkNodeSon() {};
};


class ListSon:public List           //单链表类的定义
{


public:
    int cnt=0;
    int un[40];
    LinkNodeSon *first; //指向首结点的指针
    ListSon (int x)
    {
        first = new LinkNodeSon (x);
    }
    ~ListSon ()
    {
        MakeEmpty();   //析构函数
    }
    void MakeEmpty ( );      //链表置空
    int Length ( ) const;        //求链表长度
    LinkNodeSon * getHead() const
    {
        return first;
    }
    LinkNodeSon *Find ( int x );
    LinkNodeSon *Locate ( int i );
    int GetData (int i,int &x);
    int Insert (int x, int i );
    int Remove (int x);
    void input(int  endTag);
    void output();
    void Intersection(ListSon LA,ListSon LB);
    void Union(ListSon LA,ListSon LB);
    int xiabiao(int x);
    void jiao(ListSon &LB);
};
void ListSon:: MakeEmpty ( ) //liaobiao置空
{
    LinkNodeSon *q;
    while (  first->link != NULL )
    {
        q = first->link;
        first->link = q->link;//将表头结点后第一个结点从链中摘下
        delete q;
    }


};




void ListSon :: input (int endTag)//shuru
{
    LinkNodeSon  *newnode;
    int val;
    cin>>val;
    while(val!=endTag)
    {
        if(!first->link)
        {
            first->link = new LinkNodeSon(val);
            newnode = first->link;
        }
        else
        {
            newnode->link = new LinkNodeSon(val);
            newnode = newnode->link;
        }
        cin>>val;
    }


}
void ListSon ::output ( )   //依次输出各结点的值
{
    LinkNodeSon  *p=first->link;
    while(p!=NULL)
    {
        cout<<" "<<p->data;
        p=p->link;
    }
}
LinkNodeSon* ListSon::Locate ( int i )//weizhi
{
    if ( i <  0 )
        return NULL;
    LinkNodeSon *p = first;
    int j = 0;
    while ( p != NULL && j < i ) // j = i 停
    {
        p = p->link;
        j++;
    }
    return p;
}
int ListSon::Insert (int i, int x)//charu
{
    LinkNodeSon *p = Locate ( i-1);
    if (p==NULL)
        return 0;
    LinkNodeSon *newNode = new LinkNodeSon (x);
    newNode->link=p->link;
    p->link=newNode;        //新结点插入第i个结点前
    return 1;
}
int ListSon::Remove (int x )//shanchu
{
    LinkNodeSon  *p=first;
    LinkNodeSon  *q;
    while(p->link->data!=x)
    {
        p=p->link;
    }
    q=p->link;
    p->link=q->link;
    delete q;
    return 1;
}


int ListSon::xiabiao(int x)
{
    LinkNodeSon *p=first->link;
    //int n=LA.Length();
    int i=0;
    while (p)
    {
        i++;
        if(p->data == x)
            return i;
        else
            p = p->link;
    }
    return 0;
}




void ListSon::jiao(ListSon &LB)
{
    //int n=LA.Length();
    LinkNodeSon *p=first->link;
    cout<<"A cross B is";
    while(p)
    {
        if(LB.xiabiao(p->data))
            cout<<" "<<p->data;
        p = p->link;
    }
    cout<<endl;
}
void Union(ListSon &LA,ListSon &LB)
{
    LinkNodeSon *p=LA.first->link;
    cout<<"A union B is";
    while(p)
    {
        cout<<" "<<p->data;
        LA.un[LA.cnt++] = p->data;
        p = p->link;
    }
    p = LB.first->link;
    while (p){
        if(!LA.xiabiao(p->data))
        {
            cout<<" "<<p->data;
            LA.un[LA.cnt++] = p->data;
        }
        p = p->link;
    }
    cout<<endl;
}


void hebing(ListSon &LA)
{
    cout<<"A union B in sequence is";
    sort(LA.un, LA.un+LA.cnt);
    for (int i=0; i<LA.cnt; ++i)
        cout<<" "<<LA.un[i];
    cout<<endl;
}
int main()
{
    int a,b,c,d,e,f,wei;
    ListSon la(0);
    ListSon lb(0);
    cin>>wei;
    la.input(wei);
    cout<<"A is created as:";
    la.output();
    cout<<endl;
    cin>>a;
    cin>>b;
    la.Insert(a,b);
    cout<<"After inserted A is";
    la.output();
    cout<<endl;
    cin>>c;
    la.Remove (c);
    cout<<"After deleted A is";
    la.output();
    cout<<endl;


    cin>>e;
    int result = la.xiabiao(e);
    if(!result)
        cout<<e<<" is not found"<<endl;
    else
        cout<<e<<" is located at index of "<<result<<endl;
    cin>>e;
    result = la.xiabiao(e);
    if(!result)
        cout<<e<<" is not found"<<endl;
    else
        cout<<e<<" is located at index of "<<result<<endl;
    cin>>f;
    lb.input(f);
    cout<<"B is created as:";
    lb.output();
    cout<<endl;
    la.jiao(lb);
    Union(la,lb);
    hebing(la);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值