#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;
}
单链表及其应用
猜你喜欢
转载自blog.csdn.net/qq_38717135/article/details/79891779
今日推荐
周排行