#ifndef __Student_h__
#define __Student_h__
typedef int DataType;
#define MaxSize 100
typedef struct
    {
     DataType List[MaxSize];
     int size;
    }SeqList;
    void ListInitiate(SeqList *L)//初始化
    {
     L->size=0;
    }
    int ListLength(SeqList L)//求长度
    {
     return L.size;
    }
    int ListInsert(SeqList *L,int i,DataType x)//插入数据
    {
     int j;
     if(L->size>=MaxSize)
     {
     printf("顺序表已满无法插入!\n");
     return 0;
     }
     else if(i<0||i>L->size)
     {
     printf(" 参数 i 不合法!\n");
     return 0;
     }
     else
     {
     for(j=L->size;j>i;j--)
     L->List[j]=L->List[j-1];
     L->List[i]=x;
     L->size++;
     return 1;
     }
    }
    int ListDelete(SeqList *L,int i,DataType *x)//删除数据
    {
     int j;
     if(L->size<=0)
     {
     printf("顺序表已空无法删除!\n");
     return 0;
     }
     else if(i<0||i>L->size-1)
     {
     printf(" 参数 i 不合法!\n");
     return 0;
     }
     else
     {
     *x=L->List[i];
     for(j=i+1;j<=L->size-1;j++)
     L->List[j-1]=L->List[j];
     L->size--;
     return 1;
     }
    }
    int ListGet(SeqList *L,int i,DataType *x)//取数据
    {
     if(i<0||i>L->size-1)
     {
     printf(" 参数 i 不合法!\n");
     return 0;
     }
     else 
     {
     *x=L->List[i];
     return 1;
     }
    }
int LocateElem(SeqList *L,int e)//判断顺序表L中是否存在和e元素相等的元素
{
int i;
if(!L->size) return 0;
for(i=0;i<L->size;i++)
if(L->List[i]==e)
{
return (i+1);
break;
}
if(i==L->size)
{
printf("no Elem");
return 0;
}
}
void deleteSame(SeqList *L)//删除顺序表L中相同元素个数
{
for(int i=0;i<L->size;i++)
{
for(int j=i+1;j<=L->size;j++)
{
if(L->List[i]==L->List[j])
{
for(int k=j;k<L->size;k++)//后面的元素往前移
{
L->List[k]=L->List[k+1];
L->size--;
}
}
}
}
}
void  union1(SeqList *La,SeqList Lb)//求La 和Lb集合的并集
{
int La_len=La->size;
int Lb_len=Lb.size;
int e;
for(int i=1;i<=Lb_len;i++)
{
ListGet(&Lb,i,&e);
if(LocateElem(La,e))
ListInsert(La,++La->size,e);
}
}
#endif 
上面是头文件
下面是测试函数
#include "stdio.h"
#include "Student.h"
#define MaxSize 100
typedef int DataType;void main(void)
{
   SeqList myList,Lb;
   int i,x;
   ListInitiate(&myList);
   ListInitiate(&Lb);
   for(i=0;i<10;i++)
   ListInsert(&myList,i,i+1);
   ListInsert(&myList,ListLength(myList),11);
   for( i=0;i<5;i++)
   ListInsert(&Lb,i,i+1);
   //ListDelete(&myList,4,&x);
   printf("\n第一个顺序表的元素如下:\n");
    deleteSame(&myList);
   for(i=0;i<ListLength(myList);i++)
   {
    ListGet(&myList,i,&x);
    printf("%5d",x);
   }
   printf("\n第一个顺序表的长度:%d\n",ListLength(myList));
   printf("\n第二个顺序表的元素如下:\n");
   for(i=0;i<ListLength(Lb);i++)
   {
    ListGet(&Lb,i,&x);
    printf("%5d",x);
   }
  /* for(i=1;i<11;i++)
   {
printf("\n元素%d所对应的下表为:%d\n",i,LocateElem(&myList,i));
   }*/
   union1(&myList,Lb);
   deleteSame(&myList);
   printf("\n合并后的顺序表元素如下:\n");
   for(i=0;i<ListLength(myList);i++)
   {
    ListGet(&myList,i,&x);
    printf("%5d",x);
   }
   /*for(i=0;i<15;i++)
   {
    ListGet(&myList,i,&x);
    printf("%5d",x);
   }*/
虽然可以运行 但是以上求并集的函数 好像有错误 不能得出准确答案,由于本人动手能力很差,所以请各位高手不吝赐教~~~}

解决方案 »

  1.   

    void  union1(SeqList *La,SeqList Lb)//求La 和Lb集合的并集 
    { //就是把在La中没有出现的Lb中元素插入La中
      int La_len=La->size; 
      int Lb_len=Lb.size; 
      int e; 
      for(int i=1;i <=Lb_len;i++) 
      { 
        ListGet(&Lb,i,&e); 
        if(!LocateElem(La,e)) //所以这里修改下就OK啦
          ListInsert(La,++La->size,e); 
      } 
    }