函数实现一维数组基本操作

论如何用一个代码实现一堆数字的排序,删除,插入,查找。

这当然少不了我们在数组上的操作,将这些看成一个个小功能,接下来我们为了使结构直观,这里我用函数来实现这些功能

首先是声明

//功能 
void Function();
//排序 
void Sort(int i,int num);
//查找 
void Find(int z);
//插入 
void Insert(int x);
//删除 
void Delete(int y);

现在我们来一个一个分析,首先是排序

void Sort(int i,int num)		//num表示数的个数,i为数组下标
 {
 	int min=0,t=0,j;
 	for(i=0;i<num-1;i++)
 	{
 		min=i;									//借助min这个小标查找最小的数
		for(j=i+1;j<num;j++)
		{
		 if(arr[min]>arr[j])
		 {
		 min=j;									//min是大的时候就赋小的给它
		 }
		}
		 t=arr[i];							//交换i和min。实现排序
		 arr[i]=arr[min];
		 arr[min]=t;
				
	}
 	printf("排序后的顺序为:\n");
 	for(i=0;i<num;i++)
 	{
 	printf("%d\t",arr[i]);			//打印
	}
	printf("\n");
 }

这个函数就实现了数组的排序,接下来是插入

void Insert(int x)
 {
 	int j;
 	printf("请输入你要插入的数:\n");
 	scanf("%d",&x);
 	for(i=0;i<num;i++)
 	{
 		if(arr[i]>x)				//确定插入位置
 		{
 			break;
		 }
	 }
 	for(j=num-1;j>=i;j--)		//将确定x位置后的数全部后移动一位,腾出位置
 	{
 		arr[j+1]=arr[j];	
	}
	 arr[i]=x;							//再插入x
	 printf("插入%d后,新的顺序为:\n",x);
	 num++;									//注意插入一个数数组元素个数加一
	 for(i=0;i<num;i++)			//输出出来
	 {
	 	printf("%d\t",arr[i]);
	 }
	printf("\n");
 }

这个我们是默认从小到大的顺序才能插入,所以我们用这个函数之前记得先使用排序

完成后接下来是删除

void Delete(int y)
 {
 	int j;
 	printf("请输入你要删除的数:\n");
 	scanf("%d",&y);
 	for(i=0;i<=num;i++)
 	{
 		if(arr[i]==y)				//查找
 		break;
	 }
 	if(i>num)							//全都查一遍后i>num表示没有这个元素,提示不存在
 	printf("预删除的数不存在\n");
 	else
	 {
	 	for(j=i;j<num;j++)
	 	{
	 		arr[j]=arr[j+1];		//类似插入的逆过程
		 }
		 printf("删除%d后,新的顺序为:\n",y);
		 num--;								//少一个元素
		 for(i=0;i<num;i++)			
		 {
		 	printf("%d\t",arr[i]);
		 }
	  } 
	printf("\n");  
 }

删除元素前要查找到这个元素,所以我们这里间接完成了查找的函数,但这有一个bug,就是查找到一个后就break跳出了

void Find(int z)
 {
 	printf("请输入你要查找的数:\n");
 	scanf("%d",&z);
 	for(i=0;i<=num;i++)
 	{
 		if(arr[i]==z)
 		{
 		printf("查找成功,%d是第%d个数\n",z,i+1);
 		break; 
 		}
	}
 	if(i>num)
 	printf("您查找的数不存在\n");
}

这里意思一样,找到一个就跳出,

最后有意思的来了,原本这些函数可以直接使用在主函数中,但我想使用一个功能函数,可以选择这些功能随便使用,看下面:

void Function()
 {
 int x,y,z; 
 char input[10];				//定义一个字符串数组
 	printf("请选择您要进行的操作:\n");
 	printf("******0.排序******\n") ;
 	printf("******1.插入******\n") ;
 	printf("******2.查找******\n") ;
 	printf("******3.删除******\n") ;
 	printf("******4.退出******\n") ;
 	while(1)										//这让我们可以重复使用
 	{
 		begin:
	 	scanf("%s",input);				//这里判断是否功能选择正确,正确就调用
	 	if(strcmp(input,"排序")==0)
	 	{
	 		Sort(i,num);
		 }
	 	else if(strcmp(input,"插入")==0)
	 	{
	 		Insert(x); 
		 }
		 else if(strcmp(input,"查找")==0)
	 	{
	 		Find(z); 
		 }
		 else if(strcmp(input,"删除")==0)
	 	{
	 		Delete(y); 
		 }
		 else if(strcmp(input,"退出")==0)
	 	{
	 		break; 																//跳出很关键
		 }
		 else {																	//错误就提示重新选择
		 	printf("请勿选择无关操作,请重新选择\n");
		 	goto begin;														//goto的作用体现出来了
		 }
		 printf("请继续选择操作:\n");
	}
		 	printf("操作结束,感谢使用!\n");					//退出就结束
 }

这里制作了一个类似游戏主界面的调用功能函数,咳咳无聊敲的。

然后我们看主函数,我建议这里边看边想过程

int main ()
{
	printf("您要输入的数字个数为:\n") ;
	scanf("%d",&num) ;											//自定义数的个数
	printf("请输入%d个数字:\n",num);					//输入这些数
	for(i=0;i<num;i++) 
	{
		scanf("%d",&arr[i]);
	}
	
	Function();
	
	return 0;
 } 

我们这里灵活定义数的个数,然后用数组和循环实现数组初始化,也就是这些数的初始状态。

看完这里你是不是会想主函数里没定义num和i?先等等

让我们接着看总代码:

//设计一个代码实现n个数的排序,插入,删除,查找。

#include<stdio.h>
#include<string.h> 													//功能中比较了字符串,使用字符串库函数

//功能 
void Function();
//排序 
void Sort(int i,int num);
//查找 
void Find(int z);
//插入 
void Insert(int x);
//删除 
void Delete(int y);
																					//这里我们整个代码都使用了num和i
	int num,i;															//所以我们定义它们为全局变量
	int arr[10000];													//数组也一样赋10000,控制长度足够

int main ()
{
	printf("您要输入的数字个数为:\n") ;
	scanf("%d",&num) ;
	printf("请输入%d个数字:\n",num);
	for(i=0;i<num;i++) 
	{
		scanf("%d",&arr[i]);
	}
	
	Function();
	
	return 0;
 } 
 
 
 void Sort(int i,int num)
 {
 	int min=0,t=0,j;
 	for(i=0;i<num-1;i++)
 	{
 		min=i;
		for(j=i+1;j<num;j++)
		{
		 if(arr[min]>arr[j])
		 {
		 min=j;	
		 }
		}
		 t=arr[i];
		 arr[i]=arr[min];
		 arr[min]=t;
				
	}
 	printf("排序后的顺序为:\n");
 	for(i=0;i<num;i++)
 	{
 	printf("%d\t",arr[i]);
	}
	printf("\n");
 }
 
 void Insert(int x)
 {
 	int j;
 	printf("请输入你要插入的数:\n");
 	scanf("%d",&x);
 	for(i=0;i<num;i++)
 	{
 		if(arr[i]>x)
 		{
 			break;
		 }
	 }
 	for(j=num-1;j>=i;j--)
 	{
 		arr[j+1]=arr[j];	
	}
	 arr[i]=x;
	 printf("插入%d后,新的顺序为:\n",x);
	 num++;
	 for(i=0;i<num;i++)
	 {
	 	printf("%d\t",arr[i]);
	 }
	printf("\n");
 }
 
 
 void Delete(int y)
 {
 	int j;
 	printf("请输入你要删除的数:\n");
 	scanf("%d",&y);
 	for(i=0;i<=num;i++)
 	{
 		if(arr[i]==y)
 		break;
	 }
 	if(i>num)
 	printf("预删除的数不存在\n");
 	else
	 {
	 	for(j=i;j<num;j++)
	 	{
	 		arr[j]=arr[j+1];
		 }
		 printf("删除%d后,新的顺序为:\n",y);
		 num--;
		 for(i=0;i<num;i++)
		 {
		 	printf("%d\t",arr[i]);
		 }
	  } 
	printf("\n");  
 }
 
 
 void Find(int z)
 {
 	printf("请输入你要查找的数:\n");
 	scanf("%d",&z);
 	for(i=0;i<=num;i++)
 	{
 		if(arr[i]==z)
 		{
 		printf("查找成功,%d是第%d个数\n",z,i+1);
 		break; 
 		}
	}
 	if(i>num)
 	printf("您查找的数不存在\n");
}
 
 void Function()
 {
 int x,y,z; 
 char input[10];
 	printf("请选择您要进行的操作:\n");
 	printf("******0.排序******\n") ;
 	printf("******1.插入******\n") ;
 	printf("******2.查找******\n") ;
 	printf("******3.删除******\n") ;
 	printf("******4.退出******\n") ;
 	while(1)
 	{
 		begin:
	 	scanf("%s",input);
	 	if(strcmp(input,"排序")==0)
	 	{
	 		Sort(i,num);
		 }
	 	else if(strcmp(input,"插入")==0)
	 	{
	 		Insert(x); 
		 }
		 else if(strcmp(input,"查找")==0)
	 	{
	 		Find(z); 
		 }
		 else if(strcmp(input,"删除")==0)
	 	{
	 		Delete(y); 
		 }
		 else if(strcmp(input,"退出")==0)
	 	{
	 		break; 
		 }
		 else {
		 	printf("请勿选择无关操作,请重新选择\n");
		 	goto begin;
		 }
		 printf("请继续选择操作:\n");
	}
		 	printf("操作结束,感谢使用!\n");
 }

接下来就是运行了,让我们看看:

您要输入的数字个数为:
10
请输入10个数字:
10 9 8 7 6 5 4 3 2 1
请选择您要进行的操作:
******0.排序******
******1.插入******
******2.查找******
******3.删除******
******4.退出******
排序
排序后的顺序为:
1       2       3       4       5       6       7       8       9       10
请继续选择操作:
插入
请输入你要插入的数:
11
插入11后,新的顺序为:
1       2       3       4       5       6       7       8       9       10      11
请继续选择操作:
删除
请输入你要删除的数:
1
删除1后,新的顺序为:
2       3       4       5       6       7       8       9       10      11
请继续选择操作:
查找
请输入你要查找的数:
11
查找成功,11是第10个数
请继续选择操作:
查找
请输入你要查找的数:
12
您查找的数不存在
请继续选择操作:
退出
操作结束,感谢使用!

--------------------------------
Process exited after 123.2 seconds with return value 0
请按任意键继续. . .

这里我选择10个数字,分别是1 2 3 4 5 6 7 8 9 10 

然后选择排序,结果如上所示

再选择插入11和删除1的操作,同样看到上面

然后查找11和12,11显示成功和所在位置,12显示不存在,如上所示

最后退出,提示结束

当然也可以继续使用功能,这里就你们自己去玩玩吧

最后像上面说的,这个代码还有很多不足,但也足够实现功能,实现的方法也多种多样

试试看其他方法,也可以改进功能,来完善它吧!

  • 45
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值