数据结构试验 顺序表

编写一个完整的程序,实现顺序表的建立、插入、删除、输出等基本运算。

(1) 建立一个顺序表,含有n个数据元素。

(2) 输出顺序表及顺序表的长度。

(3) 在顺序表中删除值为x的结点或者删除给定位置i的结点。

(4) 将顺序表就地逆置,即利用原表的存储空间将线性表(a1,a2,...,an)逆置为(an,an-1,...,a1)。

(5) 将顺序表按升序排序。

(6) 设顺序表中的数据元素递增有序,将x插入到顺序表的适当位置上,以保持该表的有序性。

(7) 将两个顺序有序表AB合并为一个有序表C

在主函数中设计一个简单的菜单,分别测试上述算法

//因为之前没有写过这样的操作菜单,所以很多地方没做好。比如说输入输出的数据没有对齐,整个排版看起来有些拥挤,每一次操作都会输出一次菜单。
//实验目的是测试各个函数的作用,写的时候除了创建顺序表的函数,其他函数后面我都加了一个输出函数,将按要求改变后的顺序表直接输出了。
//我将a、b、c数组和n、m都设置成了全局变量,方便代码的操作。
//因为创建函数没有设置形参,在合并数组的时候,我是先将a数组赋值给b数组,数组合并后将c数组再复制给a数组输出。这个是我事先没考虑到,下次改进。
//输出菜单可以放在函数里面,主函数中的代码看起来会简洁很多,之前也没想到。
//写完之后发现把删除数据的函数给漏掉了,后面又加上了。
//测试数据:a数组:5   2 5 3 4 1 
//插入元素:第3位 7
//b数组:7    8 9 10 11 12 13 14
//删除数据: 第3位
#include<stdio.h>
#define N 105
int a[N],b[N],c[N*2];
int n,m;
void Creatlist()//创建函数
{
	int i;
	printf("输入数据数量:     ");
	scanf("%d",&n);
	printf("输入数据:         ");
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	return ;
}
void Printlist()//打印函数
{
	int i;
	printf("顺序表长度n:   %d\n",n);
	printf("顺序表:        ");
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
	return ;
}
void Inverlist()//逆序函数,逆序后直接输出
{
	int r,l;
	int temp;
	for(l=0,r=n-1;l<=r;l++,r--)
	{
		temp=a[r];
		a[r]=a[l];
		a[l]=temp;
	}
	Printlist();
	return ;
}
void Sortlist()//排序函数,用的是冒泡排序,因为不是实验重点,也就没太注意效率的问题。
{
	int i,j;
	int temp;
	for(i=n-1;i>=1;i--)
	{
		for(j=0;j<i;j++)
			if(a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
	}
	Printlist();
	return ;
}
void Insertlist()//插入函数
{
	int x,y;
	int temp0,temp1;
	int i;
	printf("插入数据的位置:	");
	scanf("%d",&x);
	printf("插入数据的数值:	");
	scanf("%d",&y);
	temp0=a[x-1];
	a[x-1]=y;
	for(i=x;i<n;i++)
	{
		temp1=a[i];
		a[i]=temp0;
		temp0=temp1;
	}
	a[i]=temp0;
	n++;
	Printlist();
	return ;
}
void Comlist()//合并函数,在这个函数中重新输入了一个数组
{
	int i,j,k;
	for(i=0;i<n;i++)
		b[i]=a[i];
	m=n;
	Creatlist();
	i=j=k=0;
	while(i<n||j<m)
	{
		if(a[i]<b[j]&&i<n&&j<m)
		{
			c[k++]=a[i];
			i++;
		}
		else if(a[i]>=b[j]&&i<n&&j<m)
		{
			c[k++]=b[j];
			j++;
		}
		else if(i==n)
		{
			c[k++]=b[j];
			j++;
		}
		else 
		{
			c[k++]=a[i];
			i++;
		}
	}
	for(i=0;i<k;i++)
		a[i]=c[i];
	n=k;
	Printlist();
	return ;
}
void Delelist()
{
	int x;
	int i;
	printf("需要删除的数据的位置:  ");
	scanf("%d",&x);
	a[x-1]=a[x];
	for(i=x;i<n-1;i++)
		a[i]=a[i+1];
	n--;
	Printlist();
	return ;
}
int main()
{
	int T;
	int flag;
	flag=1;
	while(1)//永真循环,在输入0是跳出
	{
		printf("*********目录*********\n");
		printf("创建一个顺序表:      1\n");
		printf("输出顺序表及其长度:  2\n");
		printf("将顺序表逆置:        3\n");
		printf("将顺序表升序排序:    4\n");
		printf("将一个值插入顺序表:  5\n");
		printf("将两个有序表合并输出:6\n");
		printf("删除表中的某个元素:  7\n");
		printf("结束操作:            0\n");
		printf("请输入操作代码:      ");
		scanf("%d",&T);
		switch(T)
		{
			case 1:Creatlist();break;
			case 2:Printlist();break;
			case 3:Inverlist();break;
			case 4:Sortlist();break;
			case 5:Insertlist();break;
			case 6:Comlist();break;
			case 7:Delelist();break;
			case 0:flag=0;break;
			default:printf("输入错误,请重新输入!\n");break;//输入数据不合法
		}
		printf("\n");
		if(!flag)
			break;
	}
	printf("谢谢使用!\n");
	return 0;
}


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值