利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B。 算法是 void union(List &La,Lis

如题所述

第1个回答  2013-10-21
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int status;
typedef int ElemType;
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OK 1
#define OVERFLOW -2
#define list_init_size 100
#define listincrement 10
typedef struct{
ElemType *elem;
int length;
int listsize;
}sqlist;
status equal(ElemType a,ElemType b)
{if(a==b)
return TRUE;
else
return FALSE;
}
int listlength(sqlist l)
{ return l.length;}
status listinsert(sqlist *l,int i,ElemType e)
{
ElemType *newbase,*q,*p;
if(i<1||i>(*l).length+1)
return ERROR;
if((*l).length>=(*l).listsize){
newbase=(ElemType*)realloc((*l).elem,((*l).listsize+listincrement)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
(*l).elem=newbase;
(*l).listsize+=listincrement;
}
q=&((*l).elem[i-1]);
for(p=&((*l).elem[(*l).length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++(*l).length;
return OK;
}
status initlist(sqlist *l){
(*l).elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
if(!(*l).elem)
exit(OVERFLOW);
(*l).length=0;
(*l).listsize=list_init_size;
return OK;
}
status getelem(sqlist l,int i,ElemType *e)
{ if(i<1||i>l.length)
exit(ERROR);
*e=*(l.elem+i-1);
return OK;
}
int LocateElem(sqlist L,ElemType e,status(*compare)(ElemType,ElemType))
{
ElemType *p;
int i=1;
p=L.elem;
while(i<=L.length&&!compare(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
void print(ElemType *c)
{
printf("%d ",*c);
}
status ListTraverse(sqlist l,void(*vi)(ElemType *))
{
ElemType *p;
int i;
p=l.elem;
for(i=1;i<=l.length;i++)
vi(p++);
printf("\n");
return OK;
}
void Union(sqlist *la,sqlist lb)
{
int la_len,lb_len;
int i;
ElemType e;
la_len=listlength(*la);
lb_len=listlength(lb);
for(i=1;i<=lb_len;i++)
{ getelem(lb,i,&e);
if(!LocateElem(*la,e,equal))
listinsert(la,++la_len,e);
}
}
void main()
{
sqlist la,lb;
int j,i;
i=initlist(&la);
if(i==1)
for(j=1;j<=6;j++)
i=listinsert(&la,j,j);
printf("la= ");
ListTraverse(la,print);
initlist(&lb);
for(j=1;j<=5;j++)
i=listinsert(&lb,j,2*j);
printf("lb= :");
ListTraverse(lb,print);
Union(&la,lb);
printf("la :");
ListTraverse(la,print);
}

...和Lb分别表示两个集合A和B,现要求一个新的集合A=A&B.就是A并B...
如果这两个数组是整型数组,那么可以用一个布尔数组纪录A和B当中的数(如果有则把对应的元素设为TRUE),然后从头到尾扫描布尔数组,把布尔值为TRUE的放入另一个数组当中(或覆盖掉A)就可以了。如果这两个数组不是整型,而是实型的话,那么我建议你使用二叉排序树来实现,它使查找每个元素的时间复杂度降...

...和LB分别表示两个集合A和B,现要求一个集合A=A并B
利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A∪B。void union(List &La,List Lb) { La-len=listlength(La);Lb-len=listlength(Lb);for(I=1;I<=lb-len;I++) { getelem(lb,I,e);if(!locateelem(la,e,equal))listinsert(la,++la-en,e)} } ...

问题描述:假设两线性表LA和LB分别表示两集合A和B,要求新集合A=A并...
int a[]={1,5,8,12,5,-5,32};int b[]={3,5,1,-3,10};list< int > set1(a,a+sizeof(a)\/sizeof(int));list< int > set2(b,b+sizeof(b)\/sizeof(int));list< int > result;set1.sort();set2.sort();\/\/交集 set_intersection(set1.begin(),set1.end(),set2.beg...

线性表的合并 java
使用ArrayList作为LA 、LB线性结构类型,则其可以自动进行扩大表操作,而不用判断增加容量的大小。循环LB IF(LB[I]在LA中不存在) 那么 将LB[I]放入LA END LB循环

用线性表La和Lb分别表示集合A和集合B,现要求一个新的集合A=AUB。
a[],int n) { \/\/ 用数组创建集合int i;pSet S,p;S = p = InitSet();for(i = 0; i < n; ++i) {p->next = GetNewNode();p->next->data = a[i];p = p->next;}p->next = NULL;return S;}void CreateSet2(Set S) { \/\/ 用键盘输入数据创建集合SElemType data;...

有序表的合并(顺序有序表,链式有序表)
1、顺序有序表:用两个线性表LA和LB分别表示集合A和集合B,利用两个指针pa和pb,分别指向LA和LB的第一个元素,如果pa所指的元素小于等于pb所指的元素(*pa<=*pb),则将pa所指元素存入到pc所指的存储空间中,并将pa和pc所指单元向下移动(pa++;pc++;),同理若pa所指的元素大于pb所指的元素,则...

高手帮帮忙:已知线性表la和lb中的数据元素按值非递减有序排列,现要求将...
你可以试着再自己写一个更好的。include<stdio.h> include<stdlib.h> define MAXSIZE 10 typedef struct { int elem[MAXSIZE];int len;}sqlist;void merge(sqlist *la,sqlist *lb,sqlist *lc){ int i,j,k;i=j=k=0;if(la->len+lb->len<=MAXSIZE){ while(i<la->len&&j<lb->...

两个顺序表sa,sb,其元素均为递增有序,将此列表归并成sc,并保持递增顺序...
要求将这个线性表合并为一个表Lc,Lc的元素也按照从小到达升序排列 \/ \/*算法:首先建立顺序表Lc,使得Lc的大小等于La+Lb.依次扫描顺序表la lb,比较当前的元素值,将值小的复制给lc,直到一个顺序表扫描完。将未完成的顺序表余下部分直接赋值给lc \/ include<stdio.h> include<stdlib.h> typedef ...

高手帮帮忙:已知线性表la和lb中的数据元素按值非递减有序排列,现要求将...
有连个表 la[i]和lb[j] 算法实现为 for[k=0,x=0,y=0;k<i+j;k++]{ if(la[x]>=lb[y]){lc[k]=lb[y];y++;} else{lc[k]=la[x];x++;} }

有序排列的链表La和Lb归并为一个新的线性表Lc,下面程序错误在哪里?链 ...
对数输入要取地址呀***scanf("%d",La.elem[i]);***?应该是这样吧scanf("%d",&La.elem[i]); 下同!!

相似回答