实验一:顺序表的基本操作。
编写一个完整的程序,实现顺序表的建立、插入、删除、输出等基本运算。
(1) 建立一个顺序表,含有n个数据元素。
(2) 输出顺序表及顺序表的长度。
(3) 在顺序表中删除值为x的结点或者删除给定位置i的结点。
(4) 将顺序表就地逆置,即利用原表的存储空间将线性表(a1,a2,...,an)逆置为(an,an-1,...,a1)。
(5) 将顺序表按升序排序。
(6) 设顺序表中的数据元素递增有序,将x插入到顺序表的适当位置上,以保持该表的有序性。
(7) 将两个顺序有序表A和B合并为一个有序表C。
(8) 在主函数中设计一个简单的菜单,分别测试上述算法。
code:
/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 3
#define addMax 20
int *a,*b,*c,len=0,k;//k代表a的空间
/*int cmp(const void*a,const void*b)
{
return *(int *)a-*(int*)b;
}*/
void create()//建立顺序表
{
int n,i;
printf("请输入n,及n个数\n");
a=(int *)malloc(Max* sizeof(int));
scanf("%d",&n);
len=n;
k=Max;
for(i=0;i<n;i++)
{
while(n>=k)
{
a=(int *)realloc(a,((addMax+Max)* sizeof(int)));
k=addMax+Max;
}
scanf("%d",&a[i]);
}
printf("操作完成\n");
}
void output()//输出表,及长度
{
int i;
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
printf("顺序表的长度为%d\n",len);
printf("操作完成\n");
}
void delete1()//删除值为x节点
{
int x,i;
printf("请输入要删除的数\n");
scanf("%d",&x);
for(i=0;i<len;i++)
if(x==a[i])
a[i]=a[i+1];
len=len-1;
printf("操作完成\n");
}
void delete2()// 删除第i节点
{
int m,i;
printf("请输入要删除的数的位置\n");
scanf("%d",&m);
for(i=m-1;i<len;i++)
a[i]=a[i+1];
len=len-1;
printf("操作完成\n");
}
void nizhi()//表的逆序
{
int i,temp;
for(i=0;i<len/2;i++)
{
temp=a[i];
a[i]=a[len-i-1];
a[len-i-1]=temp;
}
//for(i=0;i<len;i++)
printf("操作完成\n");
}
void shengxu()//升序
{
int i,j,temp;
for(i=1;i<len;i++)
for(j=0;j<len-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j+1]=a[j];
a[j]=temp;
}
}
printf("操作完成\n");
}
void insert()
{
int i,x;
printf("请输入你要插入的数\n");
scanf("%d",&x);
while(len>k)//空间不够,继续追加
{
a=(int *)realloc(a,((1+k)* sizeof(int)));
k=1+k;
}
for(i=len-1;i>=0;i--)
{
if(x>=a[i])
a[i+1]=x;
else
a[i+1]=a[i];
}
len++;
printf("操作完成\n");
}
void merge()
{
int i,j,n,blen;
printf("请输入表b的长度,及数值\n");
scanf("%d",&n);
shengxu();
b=(int *)malloc(Max* sizeof(int));
blen=Max;
for(i=0;i<n;i++)
{
while(n>=blen)
{
b=(int *)realloc(b,((addMax+blen)* sizeof(int)));
blen=addMax+blen;
}
scanf("%d",&b[i]);
}
for(i=0;i<len;i++)
printf("%d ",a[i]);
for(i=0;i<n;i++)
printf("%d ",b[i]);
c=(int *)malloc((len+n+1)* sizeof(int));
int p=0;
i=j=0;
while(i<len&&j<n)
{
if(a[i]<b[j])
{
c[p++]=a[i];
i++;
}
else if(a[i]>b[j])
{
c[p++]=b[j];
j++;
}
else
{
c[p++]=a[i];
i++;j++;
}
}
while(i<len)
c[p++]=a[i++];
while(j<n)
c[p++]=b[j++];
printf("表C为:\n");
for(i=0;i<p;i++)
printf("%d ",c[i]);
printf("\n");
printf("操作完成\n");
}
void tishi()
{
printf("****************************顺序表的基本操作***********************************\n");
printf("*温馨提示: ****\n");
printf("*输入0----直接退出 ****\n");
printf("*输入1----建立一个顺序表,含有n个数据元素 ****\n");
printf("*输入2----输出顺序表及顺序表的长度 ****\n");
printf("*输入3----在顺序表中删除值为x的结点 ****\n");
printf("*输入4----将顺序表就地逆置 ****\n");
printf("*输入5----将顺序表按升序排序 ****\n");
printf("*输入6----设顺序表递增有序,将x插入到顺序表的适当位置上,以保持该表的有序性****\n");
printf("*输入7----将两个顺序有序表A和B合并为一个有序表C ****\n");
//printf("*输入8----在主函数中设计一个简单的菜单,分别测试上述算法***********************\n");
printf("*输入8----删除给定位置i的结点 ****\n");
printf("请选择: ****\n");
}
int main()
{
int flag;
tishi();//提示信息
while(scanf("%d",&flag),flag)
{
switch(flag)
{
case 1:create(); break;
case 2:output(); break;
case 3:delete1();break;
case 4:nizhi(); break;
case 5:shengxu();break;
case 6:insert() ;break;
case 7:merge(); break;
case 8:delete2();break;
}
}
return 0;
}