假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/13 03:41:28

假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B
假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B

假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B
#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{
\x09ElemType *elem;
\x09int length;
\x09int 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)
{  
\x09ElemType *newbase,*q,*p;
\x09if(i<1||i>(*l).length+1)
\x09return ERROR;
\x09if((*l).length>=(*l).listsize){
\x09\x09newbase=(ElemType*)realloc((*l).elem,((*l).listsize+listincrement)*sizeof(ElemType));
    if(!newbase)  exit(OVERFLOW);
\x09 (*l).elem=newbase;
\x09 (*l).listsize+=listincrement;
}
q=&((*l).elem[i-1]);
for(p=&((*l).elem[(*l).length-1]);p>=q;--p)
\x09 *(p+1)=*p;
*q=e;
++(*l).length;
return OK;
}
status initlist(sqlist *l){
\x09(*l).elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
\x09if(!(*l).elem)
\x09\x09exit(OVERFLOW);
\x09(*l).length=0;
\x09(*l).listsize=list_init_size;
\x09return 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;
\x09ElemType e;
\x09la_len=listlength(*la);
\x09lb_len=listlength(lb);
\x09for(i=1;i<=lb_len;i++)
\x09{  getelem(lb,i,&e);
\x09   if(!LocateElem(*la,e,equal))
\x09\x09   listinsert(la,++la_len,e);
    }                                                                                                                                                                                                          
}
void main()
{
\x09sqlist la,lb;
   int j,i;
\x09i=initlist(&la);
\x09if(i==1)
\x09\x09for(j=1;j<=6;j++)
         i=listinsert(&la,j,j);
\x09\x09printf("la= ");
     ListTraverse(la,print);
      initlist(&lb);
\x09for(j=1;j<=5;j++)
       i=listinsert(&lb,j,2*j);
\x09\x09printf("lb= :");
     ListTraverse(lb,print);
\x09  Union(&la,lb);
\x09    printf("la :");
      ListTraverse(la,print);
}