#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);
}*/
虽然可以运行 但是以上求并集的函数 好像有错误 不能得出准确答案,由于本人动手能力很差,所以请各位高手不吝赐教~~~}
#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);
}*/
虽然可以运行 但是以上求并集的函数 好像有错误 不能得出准确答案,由于本人动手能力很差,所以请各位高手不吝赐教~~~}
{ //就是把在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);
}
}