数据结构
实验:线性顺序表的实现与应用
一、实验目的
1、熟练掌握线性表的顺序存储结构的设计及其基本操作的实现。
二、实验原理
1、线性表的顺序存储结构及其应用。
三、实验设备
Win系统电脑一台
四、实验过程(程序清单)
1、线性表顺序存储的基本操作及应用。
#include<stdio.h>
#include<stdlib.h>
#define DATATYPE1 int
#define MAXSIZE 100
typedef struct {
DATATYPE1 data[MAXSIZE];//数据成员
int len;//last成员存储的表长度
}SEQUENLIST;//顺序表的结构体定义
void init0_sequelist(SEQUENLIST &a){
//顺序表初始化
a.len=0;
return;
}
void init_sequelist(SEQUENLIST &a){//&a引用调用
//顺序表赋值
int i,j,k;
printf("请输入顺序表元素,元素为整型,用空格分开,以-99为结束标志:");
i=0;j=0;k=0;//数组下标从0记起
scanf("%d",&i);
while(i!=-99){
j++;//计数器
a.data[k]=i;
k++;//下标
scanf("%d",&i);
}
a.len=j;
}
void print(SEQUENLIST &a) {
//顺序表输出,下标从1记起
int i;
for(i=0;i<=a.len-1;i++){//i<=a.last-1
printf("%d ",a.data[i]);
}
printf("\n");
}
int insert(SEQUENLIST &a, DATATYPE1 x, int i){
//1、将新元素x插到a表中指定的i位置上
int k;
if(i<1 || i>a.len+1 || a.len>=MAXSIZE){
return 0;
}
else{
for(k=a.len;k>=i;k--){
a.data[k]=a.data[k-1];
}
a.data[i-1]=x;
a.len=a.len+1;
return 1;
}
}
int deletel(SEQUENLIST &a,int i){
//2、在顺序表a中删除第i个元素
int k;
if(i<1 || i>a.len || a.len==0){
return 0;
}
else{
for(k=i;k<a.len;k++){
a.data[k-1]=a.data[k];
}
a.len--;
return 1;
}
}
int locate(SEQUENLIST &a,DATATYPE1 x){
//3、顺序表a中存在和给定值x相等的元素,返回该元素在表中的位置(从1算起)
//否则返回0
int k=0;
for(k=0;k<a.len;k++){
if(a.data[k]==x){
return k+1;
}
}
if(k>=a.len){
return k;
}
else{
return 0;
}
}
void insert_x_seqlist(SEQUENLIST &a,DATATYPE1 x){
//4、有序插入:将新元素x插到a表中适当位置上。
int i,m;
i=a.len;
while((i>=1) && (x<a.data[i-1]))i--;//找x所在的位置
for(m=a.len;m>=i+1;m--){
a.data[m]=a.data[m-1];//移动空间
}
a.data[i]=x;//插入x
a.len++;
}
void unite(SEQUENLIST &la,SEQUENLIST &lb){
//5、合并:直接合并(重复数据不参与合并)
int i;
for(i=1;i<=lb.len;i++){
if(!locate(la,lb.data[i-1])){
insert(la,lb.data[i-1],la.len+1);
}
}
}
void merge_sqlist(SEQUENLIST la,SEQUENLIST lb,SEQUENLIST &lc){
//6、非递减有序合并
int i,j,k;
i=j=k=1;
while(i<=la.len && j<=lb.len){//la和lb均不空
if(la.data[i-1]<=lb.data[j-1]){
lc.data[k-1]=la.data[i-1];
k++;
i++;
}
else{
lc.data[k-1]=lb.data[j-1];
k++;
j++;
}
}
while(i<=la.len){//lb已空,la非空
lc.data[k-1]=la.data[i-1];
k++;
i++;
}
while(j<=lb.len){//la已空,lb非空
lc.data[k-1]=lb.data[j-1];
k++;
j++;
}
lc.len=k-1;//lc表长
return;
}
void polynomial_add(SEQUENLIST a,SEQUENLIST b,SEQUENLIST &c){
//7、多项式a,b,c用顺序存储结构,0单元空闲不用//多项式相加
int m,n;
int p,q,r;
m=a.data[0];//表a非零系数项个数
n=b.data[0];//表b非零系数项个数
p=q=r=1;
while(p<=2*m && q<=2*n){
if(a.data[p]==b.data[q]){//指数相等,则系数相加
c.data[r+1]=a.data[p+1]+b.data[q+1];
if(c.data[r+1]!=0){
c.data[r]=a.data[p];
r=r+2;
}
p=p+2;
q=q+2;
}
else if(a.data[p]>b.data[q]){//指数不等
c.data[r+1]=a.data[p+1];
c.data[r]=a.data[p];
p=p+2;
r=r+2;
}
else{
c.data[r+1]=b.data[q+1];//指数不等
c.data[r]=b.data[q];
q=q+2;
r=r+2;
}
}
while(p<2*m){//如果表b元素已处理,表a中还有非零系数项 要处理
c.data[r]=a.data[p];
c.data[r+1]=a.data[p+1];
p=p+2;
r=r+2;
}
while(q<2*n){//如果表a元素已处理,表b中还有非零系数项 要处理
c.data[r]=b.data[q];
c.data[r+1]=b.data[q+1];
p=p+2;
r=r+2;
}
c.data[0]=r/2;//计算表c中非零系数项的个数
c.len=r;
}
//主函数调用
int main()
{ SEQUENLIST a,b,c;
int i,j=1;
int m;
DATATYPE1 x;
init_sequelist(a);
print(a);
while(j==1||j==2||j==3||j==4||j==5||j==6||j==7||j==8)
{ printf("***************顺序表********************\n\n");
printf("***********1、插入****************\n");
printf("***********2、删除****************\n");
printf("***********3、查找给定值所在的位置************\n");
printf("***********4、(例2-1)有序插入************************\n");
printf("***********5、(例2-2)Union合并************************\n");
printf("***********6、(例2-3)非递减有序合并********************\n");
printf("***********7、(例2-4)多项式相加************************\n");
printf("***********8、退出************************\n");
printf("****************请选择*********************\n");
scanf("%d",&j); getchar();
switch(j)
{ case 1:
print(a);
printf("请输入将要插入结点的位置:\n");
scanf("%d",&i); getchar();
printf("请输入将要插入结点的值:\n");
scanf("%d",&x); getchar();
insert(a,x,i);
printf("插入后顺序表为:\n");
print(a);
break;
case 2:
print(a);
printf("请输入删除的位置:");
scanf("%d",&i); getchar();
deletel(a,i);
printf("删除后的顺序表为:\n");
print(a);
break;
case 3:
print(a);
printf("请输入要查找的值:");
scanf("%d",&x); getchar();
m=locate(a,x);
// m=locate2(a,x);
printf("找到值所在位置为:%d\n",m);
break;
case 4:
print(a);
printf("请输入将要插入的元素内容: \n");
scanf("%d",&x); getchar();
//printf("请输入将要插入结点的值:\n");
//scanf("%d",&x); getchar();
insert_x_seqlist(a,x);
printf("插入后顺序表为:\n");
print(a);
break;
case 5:
print(a);
init_sequelist(b);
print(b);
unite(a,b);
printf("合并后的结果为: \n");
print(a);
break;
case 6:
print(a);
init_sequelist(b);
print(b);
//init_sequelist(c);
//print(&c);
printf("归并排序的结果为:\n");
merge_sqlist(a,b,c);
print(c);
break;
case 7:
// 第一个先输入非零系数项个数,再依次输入指数、系数、...
//例如 a=3x^2+2x b=2x^2 相加后验证的结果:c=5x^2+2x
//a表输入:2 2 3 1 2 b输入:1 2 2
//应得到输出结果:2 2 5 1 2
print(a);
init_sequelist(b);
print(b);
init0_sequelist(c);
//print(c);
printf("多项式相加后的结果为:\n");
polynomial_add(a,b,c);
print(c);
break;
case 8:
printf("结束并退出");
exit(0);
break;
}
}
}
五、实验结果
六、实验心得
1、掌握线性表的顺序存储结构及其基本操作的实现。
2、学习了非递减有序合并和多项式相加。