求两个集合交集的算法用链表用c语言或c++都可以

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 11:30:43
求两个集合交集的算法用链表用c语言或c++都可以

求两个集合交集的算法用链表用c语言或c++都可以
求两个集合交集的算法
用链表
用c语言或c++都可以

求两个集合交集的算法用链表用c语言或c++都可以
我这里有一个很强的,是以前的作业,功能有很多!
有问题来找小斌
QQ:504449327
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
#include
#include
#include
#include
typedef struct NodeType
{
ElemType data;
struct NodeType *next;
} NodeType,*LinkType;
typedef struct
{
LinkType head,tail;
int size;
}OrderedList;
ElemType a[100]="magazine";
ElemType b[100]="paper";
OrderedList L1,L2,L3;
Status MakeNode(LinkType &p,ElemType e)/*函数功能,创建一个结点,用p指向它,并把e的值赋给date*/
{
p=(LinkType)malloc(sizeof(NodeType));
if(!p)
return FALSE;
p->data=e;
p->next=NULL;
return TRUE;
}
Status InitList(OrderedList &L) /*函数功能,建立空栈*/
{
if(MakeNode(L.head,' '))
{
L.tail=L.head;
L.size=0;
return TRUE;
}
else
{
L.head=NULL;
return FALSE;
}
}
Status LocateElem(OrderedList L, ElemType e, LinkType &p)
{
NodeType *pre;
if(L.head) /*栈建立成功*/
{
pre=L.head;
p=pre->next;
while(p && p->data {
pre=p;
p=p->next;
}
if(p && p->data==e)/*找到和e相等的date,p指向这个结点*/
{
return TRUE;
}
else /*如果找不到,p指向刚好比e小的结点*/
{
p=pre;
return FALSE;
}
}
else
return FALSE;
}
void InsertAfter(OrderedList L, LinkType q, LinkType s) /*在结点q之后插入s结点*/
{
if(L.head && q && s)
{
s->next=q->next;
q->next=s;
if(L.tail==q)
L.tail=s;
L.size++;
}
}
void CreateSet(OrderedList &T, char *s)/*将s中的元素按从小到大的顺序插入到T控制的链表中*/
{
unsigned i;
LinkType p ,q;
if(InitList(T)) /*建立一个空栈*/
{
for(i=0;i<=strlen(s);i++)
{
if(s[i]>='a' && s[i]<='z' && !LocateElem(T,s[i],p))
{
if(MakeNode(q,s[i]))
{
InsertAfter(T,p,q);
}
}
}
}
}
Status Print(LinkType p)/*输出一个链表*/
{
if(p)
{
printf("%c",p->data);
return TRUE;
}
else
return FALSE;
}
void ListTraverse(LinkType p, Status (*visit)( LinkType ))
{
printf("%c",'\t');
while(p)
{
visit(p); //这句看不懂
p=p->next;
}
printf("%c",'\n');

}
void Append(OrderedList &L,LinkType s)
{
if(L.head && s)
{
if(L.tail!=L.head)
L.tail->next=s;
else
L.head->next=s;
L.tail=s;
L.size++;
}
}
void Union(OrderedList &T,OrderedList S1,OrderedList S2)
{
LinkType p1,p2,p;
if(InitList(T))
{
p1=S1.head->next;
p2=S2.head->next;
while( p1 && p2)
{
if(p1->data<=p2->data)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
if(p1->data==p2->data)
p2=p2->next;
p1=p1->next;
}
else
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p2->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
}
}
while(p1)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}
while(p2)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p2->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
}
}
}
void Intersection(OrderedList &T,OrderedList S1,OrderedList S2)
{
LinkType p1,p2,p;
if(!InitList(T))
T.head=NULL;
else
{
p1=S1.head->next;
p2=S2.head->next;
while( p1 && p2)
{
if(p1->datadata)
p1=p1->next;
else if(p1->data>p2->data)
p2=p2->next;
else
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
p1=p1->next;
}
}
}
}
void Difference(OrderedList &T,OrderedList S1,OrderedList S2)
{
LinkType p1,p2,p;
if(!InitList(T))
T.head=NULL;
else
{
p1=S1.head->next;
p2=S2.head->next;
while( p1 && p2)
{
if(p1->datadata)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}
else if(p1->data>p2->data)
p2=p2->next;
else
{
p1=p1->next;
p2=p2->next;
}
}
while(p1)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}

}
}
void ReadCommand(char &cmd)
{
printf("\n ------------------------------------------------------------------------\n");
printf("\n\t\t\t\t操 作 提 示");
printf("\n ------------------------------------------------------------------------\n");
printf("\tMakeSet1------1\t\t\t\tMakeSet2--------2\n\tUnion---------u\t\t\t\tIntersection----i\n\tDifference----d\t\t\t\tQuit------------q\n\tDisplay-------y");
do{
printf("\n\n\t请选择操作:");
cmd=getch();
printf("\n--------------------------------------------------------------------------\n");
}while(cmd!='1' && cmd!='2' && cmd!='u' && cmd!='i' && cmd!='d' && cmd!='q' && cmd!='y');
}
void Interpret(char &cmd)
{
system("cls");
switch(cmd)
{
case '1':
printf("\n\t请输入字符串:");
gets(a);
printf("\t原始字符串:");
printf("\t%s\n",a);
CreateSet(L1, a);
printf("\t构建的集合:");
ListTraverse(L1.head->next,Print);
break;
case '2':
printf("\n\t请输入字符串:");
gets(b);
printf("\t原始字符串:");
printf("\t%s\n",b);
CreateSet(L2, b);
printf("\t构建的集合:");
ListTraverse(L2.head->next,Print);
break;
case 'u':
CreateSet(L1, a);
CreateSet(L2, b);
Union(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t并集:");
ListTraverse(L3.head->next,Print);
break;
case 'i':
CreateSet(L1, a);
CreateSet(L2, b);
Intersection(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t交集:");
ListTraverse(L3.head->next,Print);
break;
case 'd':
CreateSet(L1, a);
CreateSet(L2, b);
Difference(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t差集:");
ListTraverse(L3.head->next,Print);
break;
case 'y':
printf("\n\t原始字符串:\n");
printf("\t\t%s\n\t\t%s\n",a,b);
CreateSet(L1, a);
CreateSet(L2, b);
printf("\t由字符串构建的集合:\n");
printf("\t");
ListTraverse(L1.head->next,Print);
printf("\t");
ListTraverse(L2.head->next,Print);
Union(L3,L1,L2);
printf("\t并集:");
ListTraverse(L3.head->next,Print);

Intersection(L3,L1,L2);
printf("\t交集:");
ListTraverse(L3.head->next,Print);

Difference(L3,L1,L2);
printf("\t差集:");
ListTraverse(L3.head->next,Print);
break;
}
}
void main()
{
char cmd;
do
{
ReadCommand(cmd);
Interpret(cmd);
}while(cmd!='q');
}

两个集合交集即相同的部分

交集为 {X/X=k1ε1+k2ε2...+knεn且 X=m1η1+m2η2...+mnηn, k1,k2..kn 不同时为零且m1,m2...mn 不同时为零} 只要两线性空间相交,交集就不为零 ,不知道对不对啊,毕业很久了。。

求两个集合交集的算法用链表用c语言或c++都可以 用C语言编两个集合的交集 本人碰见一道C语言难题,利用C语言实现:求任意两个集合的交集、并集、差集, c语言两个集合交集超时!已经知道两个按照大小顺序排列的集合,集合元素个数为N(1 本人碰见一道C语言难题,寻大神帮助,利用C语言实现:求任意两个集合的交集、并集、差集,兄弟感激不尽 集合的交集和并集运算 求C语言大神 求fleury算法的伪代码 或C语言实现 C语言求两个字符集合的交集和并集编程,从键盘分别输入两个都不多于20个元素的字符集合a和b,计算并输出集合a和b 的交集和并集,其中的元素从小到大排列,若交集为空则输出NULL.例如,输入:1 牛顿算法和拉格朗日插值算法的C语言实现求如下两个算法的C语言实现:牛顿算法拉格朗日插值算法 求平均值的算法.C语言 C语言课设题目,求两个集合的异或、非运算,字母为集合的元素,集合有这种运算吗? 如何用C语言做出“完成集合运算的并集,交集,补集?” 给定一个集合,查找元素是否在集合中出现.求C语言算法 用单链表求两个集合的交集 集合A=1 ,集合B=2 问这两个集合有没有交集?那么集合C=1,2 ,集合D=2,3 他们的交集又是什么?是2呢 还是2和空集? C++求两个集合的交集#includevoid main(){ int a[5],b[5],c[5]; int i,j,k; int *p1,*p2,*p3; cout 求C语言算法2的N次方,N 这两个数据结构(c语言)题怎么做?求集合A和集合B的并集C.如A=(2,4,6,7,9)和B=(1,5,7,8)的并集为C=(2,4,6,7,9,1,5,8).算法分析:用两个顺序表La 和Lb分别表示集合A和B.求集合A和集合B的并集就是将La和Lb