数据结构实验一——顺序表的实验和应用
1.上机环境:
vs2010
2.上机要求:
⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
3.代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define INCREAMENT 10
typedef struct{
int *elem;
int length,listsize;
}SqList;
void Initlist(SqList &L)
{
L.elem=(int *)malloc(MAXSIZE*sizeof(int));
if(!L.elem) exit(1);
L.length=0;
L.listsize=MAXSIZE;
}
int Get(SqList &L,int i);
void Insert(SqList &L);
int Delete(SqList &L,int i);
void Union(SqList &L1,SqList &L2,SqList &L3);//修改函数的参数
int main()
{
int choose,e,i;
int *q,*p;
SqList L1;
Initlist(L1);
printf("请输入集合A的长度和值:");
scanf("%d",&L1.length);
q=&(L1.elem[L1.length-1]);
for(p=&(L1.elem[0]);p<=q;p++)
scanf("%d",p);
do
{
printf("\n请选择您要进行的操作:\n[0]退出\n[1]取值\n[2]插入\n[3]删除\n[4]合并\n");
scanf("%d",&choose);
switch(choose)
{
case 0:break;
case 1:printf("请输入您要取值的位数:");scanf("%d",&i);
if(i<0||i>L1.length)
printf("\n取值位置非法!\n");
e=Get(L1,i);
printf("第%d位的值为%d\n",i,e);
break;
case 2:Insert(L1);break;
case 3:
printf("请输入你要删除元素的位置:");
scanf("%d",&i);
e=Delete(L1,i);
printf("删除的元素是%d",e);
break;
case 4:
SqList L2;
Initlist(L2);
printf("请输入集合B的长度和值:");
scanf("%d",&L2.length);
q=&(L2.elem[L2.length-1]);
for(p=&(L2.elem[0]);p<=q;p++)
scanf("%d",p);//输入L2,集合B的值和长度
SqList L3;
Initlist(L3);
Union(L1,L2,L3);
printf("并集C:");
for(p=&(L3.elem[0]);p<=&(L3.elem[L3.length-1]);p++)
printf("%d ",*p);
printf("\n");break;
default:printf("输入错误!\n");
}
}while(choose!=0);
system ("pause");
return 0;
}
int Get(SqList &L,int i)
{
int e;
e=L.elem[i-1];
return e;
}
void Insert(SqList &L)
{
int i,e;
int *q,*p;
int *newbase;
printf("请输入您要插入的值及其位数:");
scanf("%d%d",&e,&i);
if(i<1||i>L.length+1)
printf("插入值的位数非法!\n");
if(L.length>=L.listsize)
{
newbase=(int *)realloc(L.elem,(L.listsize+INCREAMENT) * sizeof(int));
if(!newbase) printf("存储分配失败!\n");
L.elem=newbase;
L.listsize+=INCREAMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
for(p=&(L.elem[0]);p<&(L.elem[L.length]);p++)
printf("%d ",*p);
printf("\n");
}
int Delete(SqList &L,int i)
{
int e,*p,*q;
if(i<0||i>L.length)
printf("删除位置非法!\n");
e=L.elem[i-1];
q=&(L.elem[L.length-1]);
for(p=&(L.elem[i-1]);p<q;p++)
*p=*(p+1);
--L.length;
for(p=&(L.elem[0]);p<&(L.elem[L.length]);p++)
printf("%d ",*p);
printf("\n");
return e;
}
void Union(SqList &L1,SqList &L2,SqList &L3)
{
int *p,*q,*t;
int flag;
L3.length=L1.length;
q=&(L3.elem[0]);//L3
for(p=&(L1.elem[0]);p<=&(L1.elem[L1.length-1]);p++,q++)//L1赋值给L3
*q=*p;
for(p=&(L2.elem[0]);p<=&(L2.elem[L2.length-1]);p++)//L2赋值给L3
{
flag=0;
for(t=&(L1.elem[0]);t<=&(L1.elem[L1.length-1]);t++)
if((*t)==(*p)) flag=1;
if(flag) continue;
*q=*p;
q++;
L3.length++;
}
}