#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<cstdio>
using namespace std;
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void DispList(LinkList*L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
void DestroyList(LinkList *&L)
{
LinkList*p=L->next,*pre=L;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
///尾插法建表
void CreatListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
L=(LinkList*)malloc(sizeof(LinkList));
r=L;
for(int i=0; i<n; i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
///从小到大排序
void sort(LinkList *&L)
{
LinkList *pre,*p,*q;
p=L->next->next;
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL&&pre->next->data<p->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
///求集合的并
void Union(LinkList *ha,LinkList*hb,LinkList*&hc)
{
LinkList *pa=ha->next,*pb=hb->next,*pc,*s;
hc=(LinkList*)malloc(sizeof(LinkList));
pc=hc;
while(pa!=NULL &&pb!=NULL )
{
if(pa->data<pb->data)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pa->data;
pc->next=s;
pc=s;
pa=pa->next;
}
else if(pa->data>pb->data)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pb->data;
pc->next=s;
pc=s;
pb=pb->next;
}
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pa->data;
pc->next=s;
pc=s;
pa=pa->next;
pb=pb->next;
}
}
if(pb!=NULL)
pa=pb;
while(pa!=NULL)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pa->data;
pc->next=s;
pc=s;
pa=pa->next;
}
pc->next=NULL;
}
///求两个有序集合的交用尾插法
void InterSect(LinkList *ha,LinkList*hb,LinkList*&hc)
{
LinkList *pa=ha->next,*pb,*pc,*s;
hc=(LinkList*)malloc(sizeof(LinkList));
pc=hc;
while(pa!=NULL)
{
pb=hb->next;
while(pb!=NULL&&pb->data<pa->data)
pb=pb->next;
if(pb!=NULL &&pb->data==pa->data)///B节点在A节点中复制A节点
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pa->data;
pc->next=s;
pc=s;
}
pa=pa->next;
}
pc->next=NULL;
}
///求两个有序集合的差
void Subs(LinkList *ha,LinkList*hb,LinkList*&hc)
{
LinkList *pa=ha->next,*pb,*pc,*s;
hc=(LinkList*)malloc(sizeof(LinkList));
pc=hc;
while(pa!=NULL)
{
pb=hb->next;
while(pb!=NULL&&pb->data<pa->data)
pb=pb->next;
if(!(pb!=NULL &&pb->data==pa->data))///B节点不在A节点中复制A节点
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=pa->data;
pc->next=s;
pc=s;
}
pa=pa->next;
}
pc->next=NULL;
}
int main()
{
LinkList *ha,*hb,*hc;
ElemType a[]= {'c','a','e','h'};
ElemType b[]= {'f','h','b','g','d','a'};
printf(" 集合的运算如下:\n");
CreatListR(ha,a,4);
CreatListR(hb,b,6);
printf(" 原集合A: ");
DispList(ha);
printf(" 原集合B: ");
DispList(hb);
sort(ha);
sort(hb);
printf(" 有序集合A: ");
DispList(ha);
printf(" 有序集合B: ");
DispList(hb);
Union(ha,hb,hc);
printf(" 集合的并C: ");
DispList(hc);
InterSect(ha,hb,hc);
printf(" 集合的交C: ");
DispList(hc);
Subs(ha,hb,hc);
printf(" 集合的差C: ");
DispList(hc);
DestroyList(ha);
DestroyList(hb);
DestroyList(hc);
return 0;
}
The data structure uses a singly linked list to represent the union and intersection of sets
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=326348344&siteId=291194637
Recommended
Ranking