*改版原因
1.昨天的代码搜索时没有使用哨兵元素,故加入哨兵元素以熟练相关操作;
1.适用哨兵元素:
本程序里,删除函数使用了查找,对MYdelete做修改:
原代码:
void MYdelete(int* a, int key,int N)
{
int flag = 0;
for (int i = 0; i <= N - 1; i++)
{
if (key == a[i]) {
for (; i < N - 1; i++) {
a[i] = a[i + 1];
}
flag = 1;
break;
}
}
修改代码:
void MYdelete(int* a, int key, int N)
{
a[0] = key;
int i = N ;//N-1改为N
while (a[i] != key)//利用哨兵元素做查找
{
i--;
}
if(i==0)printf("删除失败:没有这个数\n");
else {
while (a[i] != a[N])//利用哨兵元素做删除,注意是N不是N-1
{
a[i] = a[i + 1];
i++;
}
}
}
注意事项:
使用哨兵元素后,a[0]为无效数,无法判断要查找的数是不是a[0].
在定义数组的时候,做如下修改:
原代码:
int N = 10;
for (int i = 0; i < N; i++)
{
scanf_s("%d", &a[i]);
}
修改代码:
int N = 10;
for (int i = 1; i <= N; i++)//因为使用了哨兵元素,所以数组下标从1开始
{
scanf_s("%d", &a[i]);
}
在insert和show函数中,也只需把下标改为 从0开始,去得到N即可。
修改的完整代码和运行截图:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[50] = { 0 };//建立全局变量
void sequence(int* a, int n)//排成升序
{
int temp;
for (int i = 1; i <= n - 1; i++)
for (int j = i + 1; j <= n; j++)
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
void MYdelete(int* a, int key, int N)
{
a[0] = key;
int i = N ;
while (a[i] != key)//利用哨兵元素做查找
{
i--;
}
if(i==0)printf("删除失败:没有这个数\n");
else {
while (a[i] != a[N])//利用哨兵元素做删除
{
a[i] = a[i + 1];
i++;
}
}
}
void insert(int* a, int key, int pos, int n)
{
for (int i =n-1; i >= pos; i--) {
a[i + 1] = a[i];
}
a[pos] = key;
}
void show(int* a, int n)
{
for (int i = 1; i <= n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
printf("请输入十个数字,每个数字输入后敲回车\n");
int N = 10;
for (int i = 1; i <= N; i++)//因为使用了哨兵元素,所以数组下标从1开始
{
scanf_s("%d", &a[i]);
}
printf("不排序\n");
show(a, N);
sequence(a, N);
printf("升序:\n");
show(a, N);
printf("你想要删除什么元素呢\n");
int key1;
scanf_s("%d", &key1);
MYdelete(a, key1, N);
show(a, N-1);
printf("你想要插入什么元素呢\n ");
int key2, pos;
scanf_s("%d", &key2);//如果%d后面有空格 输入后无法跳转的
printf("到哪个位置\n");
scanf_s("%d", &pos);
insert(a, key2, pos, N-1);
printf("不排序\n");
show(a, N);
sequence(a, N);
printf("升序:\n");
show(a, N);
return 0;
}