1、两个集合并集问题
- 获取LA、LB的表长m、n。
- 从LB中第一个数据元素开始,循环n次执行:从LB中查找第i(1≤i≤n)个数据元素赋值给e;然后在LA中查找元素e,如果不存在,则将e插入在表LA的最后。
2、算法描述
status MergeList(List &LA,List LB)
{
m = ListLength(LA);
n = ListLength(LB);
for(i=0; i<n; i++)
{
GetElem(LB,i,e); //取LB中的第i个元素赋值给e
if(!LocateElem(LA,e)) //判断LA有无e元素
ListInsert(LA,++m,e); //不存在则将e插入LA中
}
}
3、顺序存储实现文章来源:https://www.toymoban.com/news/detail-725655.html
#include <stdio.h>
#define MAXSIZE 100
typedef struct
{
int *elem;
int length;
} Sqlist;
int i,j;
int InitList(Sqlist &L)
{//初始化顺序表
L.elem = new int[MAXSIZE];
if(!L.elem) return 0;
L.length = 0;
return 1;
}
int CreateList(Sqlist &L,int n)
{//创建顺序表
if(n>MAXSIZE || n<1) return 0;
printf("enter %d elem:\n",n);
for(i=0;i<n;i++)
{
int e;
scanf("%d",&e);
L.elem[i]=e;
L.length++;
}
return 1;
}
int GetElem(Sqlist L,int i,int &e)
{//按位置查找元素,用e返回值
if(i>L.length) return 0;
e=L.elem[i-1];
return 1;
}
int LocateElem(Sqlist L,int e)
{//元素e存在则返回1,否则返回0
for(i=0;i<L.length;i++)
{
if(L.elem[i] == e) return 1;
}
return 0;
}
int ListInsert(Sqlist &L,int n,int e)
{//在第n个位置插入元素e
if(n<0 || n>L.length+1) return 0;
for(i=L.length-1;i>=n-1;i--)
L.elem[i+1] = L.elem[i];
L.elem[n-1] = e;
L.length++;
return 1;
}
int MergeList(Sqlist LA,Sqlist LB,Sqlist &LC)
{//顺序表合并
if(LA.length+LB.length > MAXSIZE) return 0;
LC.elem=new int[LA.length+LB.length];
int *pa,*pb,*pc,*pa_last,*pb_last;
pc=LC.elem;
pa=LA.elem;
pb=LB.elem;
pa_last=LA.elem+LA.length-1;
pb_last=LB.elem+LB.length-1;
while(pa<=pa_last && pb<=pb_last)
{
if(*pa < *pb)
{
*pc++ = *pa++;
LC.length++;
}
else
{
*pc++ = *pb++;
LC.length++;
}
}
while(pa<=pa_last)
{
*pc++ = *pa++;
LC.length++;
}
while(pb<=pb_last)
{
*pc++ = *pb++;
LC.length++;
}
return 1;
}
int main()
{
Sqlist LA,LB,LC;
InitList(LA);InitList(LB);InitList(LC);
int a,b,e;
printf("LA length= ");
scanf("%d",&a);
printf("LB length= ");
scanf("%d",&b);
CreateList(LA,a);CreateList(LB,b);
MergeList(LA,LB,LC);
printf("Mergelist:");
for(i=0;i<LC.length;i++)
{
printf("%d ",LC.elem[i]);
}
printf("\n");
printf("Collection:");
for(j=1;j<=b;j++)
{
GetElem(LB,j,e);
if(!LocateElem(LA,e))
ListInsert(LA,++a,e);
}
for(i=0;i<LA.length;i++)
{
printf("%d ",LA.elem[i]);
}
return 1;
}
4、链式存储实现文章来源地址https://www.toymoban.com/news/detail-725655.html
#include <stdio.h>
typedef struct LNode
{
int data;
LNode *next;
} LNode,*Linklist;
LNode *p;
int InitList(Linklist &L)
{//初始化列表
L = new LNode;
L->next = NULL;
return 1;
}
int CreatList_H(Linklist &L,int n)
{//用尾插法创建列表
int i;
LNode *r;
printf("enter %d elem:",n);
for(i=0;i<n;i++)
{
p = new LNode;
scanf("%d",&p->data);
p->next = r->next;
r->next = p;
r = p;
}
return 1;
}
int ListLengh(Linklist L)
{//求长度
int i=0;
p = L->next;
while(p){
p = p->next;
++i;
}
return i;
}
int GetElem(Linklist L,int n,int &e)
{//按位置获取元素值,用e返回
p = L->next;
int i=1;
while(p && i<n)
{
p = p->next;
i++;
}
if (!p || i>n) return 0;
e = p->data;
return 1;
}
int LocateElem(Linklist L,int e)
{//存在元素e则返回1,否则返回0
p = L->next;
while(p){
if(p->data == e) return 1;
p = p->next;
}
return 0;
}
void ListInsert(Linklist &L,int e)
{//用前插法插入元素e
p = new LNode;
p->data = e;
p->next = L->next;
L->next = p;
}
int MergeList(Linklist LA,Linklist LB,Linklist &LC)
{
LNode *pa,*pb,*pc;
pa=LA->next;
pb=LB->next;
pc=LC;
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pc;
return 1;
}
int main()
{
Linklist LA,LB,LC;
InitList(LA);InitList(LB);InitList(LC);
int a,b;
printf("LA length= ");
scanf("%d",&a);
printf("LB length= ");
scanf("%d",&b);
CreatList_H(LA,a);CreatList_H(LB,b);
MergeList(LA,LB,LC);
int i,j,e;
LNode *q=LC->next;
printf("Mergelist:");
while(q)
{
printf("%d ",q->data);
q=q->next;
}
for(i=1;i<=b;i++)
{
GetElem(LB,i,e);
if(!LocateElem(LA,e)) ListInsert(LA,e);
}
int n;
n = ListLengh(LA);
p = LA->next;
printf("\ncollection:");
for(j=0;j<n;j++)
{
printf("%d ",p->data);
p = p->next;
}
return 1;
}
到了这里,关于C语言实现两个集合合并及有序集合的并集(顺序存储、链式存储)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!