要求:
⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列
请本校学弟学妹不要抄我的代码当数据结构作业,这对其他同学是非常不公平的
#include<stdio.h>
#include<stdlib.h>
#define addsize 10
#define initsize 100
typedef int Elemtype;
typedef struct
{
Elemtype *elem; //存储空间基址
int length; //当前长度
int listsize; //总长度
} Sqlist;
int InitList(Sqlist &a); //构造空表
int ClearList(Sqlist &a); //置为空表
int listEmpty(Sqlist &a); //是否为空,是返回 1,不是返回0
int listlength(Sqlist a); //线性表长度
int GetElem(Sqlist a,int i,Elemtype &e);//线性表a中的第i个赋值给e
int LocateElem(Sqlist a,Elemtype e);//判断a中是否含有e ,有返回1,没有返回0
int Input(Sqlist &a); //输入数据
int Output(Sqlist a); //输出数据
int Merge(Sqlist a,Sqlist b,Sqlist &c); //无序合并
int Delete (Sqlist &c,int n); //去掉第n个数据
int Insert(Sqlist &c,int n,Elemtype e) ; //在第n个位置插入数据
int main()
{
Sqlist a,b,c;
Elemtype q;
int n,m;
InitList(a);
InitList(b); //初始化
InitList(c);
Input(a); //输入
Input(b);
printf("\n选择功能\n1.无序合并\t2.删除c表数据\t3.插入c表数据\n") ;
while((scanf("%d",&n))!=EOF)
{
if(n==1)
{
Merge(a,b,c);
Output(c);
}
else if(n==2)
{
printf("输入删除顺序表c的数据位置");
scanf("%d",&m);
Delete (c,m);
Output(c);
}
else if(n==3)
{
printf("输入插入的顺序表c的数据位置和数值");
scanf("%d %d",&m,&q);
Insert(c,m,q);
Output(c);
}
}
return 0;
}
int InitList(Sqlist &L) //构造空表
{
L.elem=(Elemtype*)malloc(initsize*(sizeof(Elemtype)));
if(!(L.elem)) printf("构造失败\n");
L.length=0;
L.listsize=initsize;
return 0;
}
int ClearList(Sqlist &L) //置为空表
{
L.elem=NULL;
if(!(L.elem)) printf("已经置为空表\n");
L.length=0;
L.listsize=initsize;
return 0;
}
int listEmpty(Sqlist &a) //是否为空,是返回 1,不是返回0
{
if(a.length==0) return 1;
else return 0;
}
int listlength(Sqlist a) //线性表长度
{
return a.length;
}
int GetElem(Sqlist a,int i, Elemtype &e)//线性表a中的第i个赋值给e
{
if(i<1||i>a.length) exit(0);
e=a.elem[i-1];
return 0;
}
int LocateElem(Sqlist a,Elemtype e)//判断a中是否含有e ,有返回1,没有返回0
{
int i=0;
while(i<a.length)
{
if(a.elem[i++]==e) return 1;
}
return 0;
}
int Input(Sqlist &l) //输入数据 .
{
int n,i=0;
printf("请输入顺序表元素个数并输入元素\n");
scanf("%d",&n);
while(n>l.listsize){
Elemtype * newbase;
newbase=(Elemtype *)realloc(l.elem,(l.listsize+addsize) *sizeof(Elemtype));
if(!newbase) exit(0);
l.elem=newbase;
l.listsize+=addsize;
}
while(n--){
scanf("%d",l.elem+i);
l.length++;
i++;
}
return 0;
}
int Output(Sqlist l) //输出数据 .
{
int i;
printf("链表为:\n");
for(i=0;i<l.length;i++){
printf("%d ",l.elem[i]);
}
printf("\n");
return 0;
}
int Merge(Sqlist a,Sqlist b,Sqlist &c) //无序合并
{
int i=0;
while(i<a.length)
{
c.elem[i]=a.elem[i];
c.length++;
i++;
}
i=0;
while(i<b.length)
{
if(LocateElem(a,b.elem[i])) {
i++;
continue;
}
else
{
c.elem[c.length]=b.elem[i];
c.length++;
}
i++;
}
return 0;
}
int Delete (Sqlist &c,int n) //去掉第n个数据
{
if(n<1||n>=c.length) exit (0); //搜索一下格式
else
while(n<c.length)
{
c.elem[n-1]=c.elem[n];
n++;
}
c.length--;
return 0;
}
int Insert(Sqlist &c,int n,Elemtype e) //在第n个插入数据
{
int i;
c.length++;
for(i=c.length;i>n-1;i--)
c.elem[i]=c.elem[i-1];
c.elem[n-1]=e;
return 0;
}