论如何用一个代码实现一堆数字的排序,删除,插入,查找。
这当然少不了我们在数组上的操作,将这些看成一个个小功能,接下来我们为了使结构直观,这里我用函数来实现这些功能
首先是声明
//功能
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显示不存在,如上所示
最后退出,提示结束
当然也可以继续使用功能,这里就你们自己去玩玩吧
最后像上面说的,这个代码还有很多不足,但也足够实现功能,实现的方法也多种多样
试试看其他方法,也可以改进功能,来完善它吧!