用单链表实现集合的操作
1、若 p->data>q->data,说明还未找到,需在表 B 中继续查找; 2、若 p->data<q->data,说明表 B 中无此值,处理表 A 中下一结点; 3、若 p->data=q->data,,说明找到了公共元素。 (3)求集合 A 和 B 的并集,集合 A∪B 中包含所有或属于集合 A 或属于集合 B 的元素。因此,对单链表 B 中的每一个元素 x,在单链表 A 中进行查找,若存在 和 x 不同的元素,则将该结点出入到单链表 A 中。 (4)求集合 A 和 B 的差集。根基集合的运算规则,集合 A-B 中包含所有属于集 合 A 而不属于集合 B 的元素。因此,对单链表 B 中的每个元素 x 在单链表 A 中进 行查找,若存在和 x 相同的结点,则将该结点从链表 A 中删除。 在主函数中,首先建立两个有序单链表表示集合 A 和 B,然后依次调用相应函数 实现集合的判等、交、并和差等运算,并输出运算结果。
//判断是否相等 //求交集
//求并集 //求差集
void PrintList();
void Show(int i);
private:
Node<T> *first;
};
template<class T>
LinkList<T>::LinkList(T a[],int n){
Node<T> *s;
first = new Node<T>;
//工作指针 p 初始化
while(p != NULL){
cout<<p->data;
p = p->next;
}
cout<<endl;
}
int menu(){
//菜单函数
int m;
do { cout<<"请输入对应数字(1、判断是否相等 2、求交集 3、求并集 4、求差集 5、结
束运行)"<<endl;
q = q->next;}
else{
pre->next = p->next;
p = pre->next;
q = q->next;
}
}
}
template<class T>
void LinkList<T>::PrintList(){ //遍历输出所有元素
Node<T> *p;
p=first->next;
Node<T> *pre,*p,*q,*pra;
pre = A; pra = B; p = A->next; q = B->next;
while(p!=NULL && q!=NULL){
if(p->data < q->data){
pre = p;
p = p->next;
}
else if(p->data > q->data){
cin>>m;
}while(m<1||m>5);
return m;
}
int a[]={5,4,3,2,1},b[]={6,4,2};
int n = 5,m = 3;
LinkList<int> SL(a,n); LinkList<int> sl(b,m);
LinkList<int> s(a,n); LinkList<int> S(b,m);
cout<<"相等"<<endl; } cout<<"不相等"<<endl; } break; case 2:{ Node<T> *p,*q; p = SL.first; q = sl.first; SL.PrintList(); sl.PrintList(); SL.Interest(p,q); SL.PrintList(); cout<<endl; cout<<"已求交集"<<endl;} break; case 3:{ Node<T> *p,*q; p = s.first; q = S.first; s.PrintList(); S.PrintList(); s.Sum(p,q); s.PrintList(); S.PrintList(); cout<<"已求并集"<<endl;} break; case 4:{ Node<T> *p,*q; p = l.first; q = L.first; l.PrintList();L.PrintList(); l.Subtraction(p,q); l.PrintList(); cout<<"已求差集"<<endl;} break; case 5:{ bl = false; } break;
if(p->data < q->data){
pre->next = p->next;
p = pre->next;}
else if(p->data > q->data){
q = q->next;}
else{
pre = p;
p = p->next;
q = q->next;
}
}
}
template<class T>
//建立有 n 个元素的单链表
~LinkList(); int Ifdeng(Node<T> *A, Node<T> *B); void Interest(Node<T> *A, Node<T> *B); void Sum(Node<T> *A, Node<T> *B); void Subtraction(Node<T> *A, Node<T> *B);
代码:
#include<iostream> using namespace std; template<class T> struct Node{
T data; Node<T> *next; }; template <class T> class LinkList{ public:
LinkList(T a[],int n);
pre = p;
p = p->next;}
else if(p->data > q->data){
q = q->next;}
else{
pre->next = p->next;
p = p->next; q = q->next;
}
}
}
template<class T>
//求差集
void LinkList<T>::Subtraction(Node<T> *A,Node<T> *B){
Node<T> *pa,*pb; pa=A->next; pb=B->next; while(pa!=NULL && pb!=NULL){
if(pa->data==pb->data){ pa=pa->next;
pb=pb->next;
}
else
break;
}
if(pa==NULL && pb==NULL)
//求并集
void LinkList<T>::Sum(Node<T> *A,Node<T> *B){
Node<T> *pre,*p,*q;
pre = A; p = A->next;
q = B->next;
while(p!=NULL && q!=NULL){
if(p->data < q->data){
return 1;
else
return 0;
}
template<class T>
//交集
void LinkList<T>::Interest(Node<T> *A,Node<T> *B){
Node<T> *pre,*p,*q;
pre = A;p =A ->next;q = B->next;
while(p!=NULL && q!=NULL){
LinkList<int> l(a,n); LinkList<int> L(b,m);
static bool bl = true; template<class T> void LinkList<T>::Show(int i){
switch(i){ case 1:{
Node<T> *pa,*pb; pa= s.first; pb= S.first; s.PrintList(); S.PrintList(); while(0){
} } void main(){
cout<<"集合 a[]={5,4,3,2,1}"<<endl; cout<<"集合 b[]={3,1}"<<endl;
cout<<endl; while(bl == true){