很长很长的一道题。题目详情 - 习题10-11 有序表的增删改查操作 (pintia.cn)
做了一天后对答案的时候才发现自己看错题了!!!!
我写错的答案多添了个条件:
结果的最大长度为原长度Count。就算是删了几位后继续增添,长度都只会是最开始输入的Count位。
也就是说,就算是增添这个功能被我改成不是单纯的增添多一位数再排序。
我的增添功能而是分成了两种——
① 当现位数长度<初始长度Count时,插入后现位数长度+1,再大小排序。
②若现长度==Count初始长度时,(即长度的最大值)。如果新添数大于最小一位,则插入后淘汰掉最小的一位。如果增添的数比a【0】小,则淘汰最大一位,以此排序保证长度不会变动。

int k = 0;//新全局变量,主要从Del那接收删掉后的数组长度。
int insert(int a[], int value)
{
for (int i = 0;i < Count;i++)//检查是相同
{
if (a[i] == value) return -1;
}
int cp[MAXN] = { 0 };
for (int i = 0;i < Count;i++) //copy a数组
{
cp[i] = a[i];
}
int k = 0;
while (0<=a[k])//输入的最初位数
{
k++;
}
///-----------------现a长度不为初始长度的情况-----------//
while (Count < k)//如果不是最初位数就加一位,是的话不变
{
Count++;int b = 0;
if (value > a[Count-2])//输入值最小情况
{
a[Count - 1] = value;
}
else if (value < a[0])
{
for (int i = 0;i < Count;i++)//输入值最大情况
{
a[i + 1] = cp[i];
}
a[0] = value;
}
else if(value > a[0] && value < a[Count - 2])//在数中间的情况
{
for (int i = 0;i < Count - 1;i++)
{
if (value > a[i] && value < a[i + 1])
{
b = i;
for (b = i;b < Count;b++)
{
a[i + 2] = cp[i + 1];
}
a[i + 1] = value;
break;
}
}
}
return a;
}
///-----------------现长度为初始长度的情况-----------//
if (value < a[0])//输入值最小情况
{
for (int i = 0;i<Count;i++)
{
a[i + 1] = cp[i];
}
a[0] = value;
}
else if (value > a[Count-1])//输入值是最大的情况
{
for (int i = Count-1;i>0;i--)
{
a[i-1] = cp[i];
}
a[Count-1] = value;
}
else if (value > a[0] && value < a[Count-1]) //在数中间的情况
{
for (int i = 0;i < Count;i++)
{
if (a[i] <value && a[i+1]>value)
{
int b = i;
for (i = b;i > 0;i--)
{
a[i - 1] = cp[i];
}
a[b] = value;
break;
}
}
}
return a;
}
int del(int a[], int value)
{
int flag = 0;
for (int i = 0;i < Count;i++) //找value在不在数组里
{
if (value == a[i])//如果找到,flag标1
{
a[i] = 0;//找到后把相应数值变成0
flag = 1;
}
}
while (flag == 0) return -1;//没找到,退出。
int cp[MAXN] = { 0 };
for (int i = 0;i < Count;i++) //copy a数组
{
cp[i] = a[i];
}
for (int i = 0; i < Count; i++) //利用复制过来的cp数组完成a中的新排序
{
if (a[i] == 0)
{
int b = i;
for (b;b < Count - 1;b++)
{
a[b] = cp[b + 1]; //如果a里i项为0,则用cp中的i+1项代替。
}
Count--;
break;
}
}
}
int modify(int a[], int value1, int value2)
{
int flag = 0;
for (int i = 0;i < Count;i++) //找value1 value2在与不在数组中。
{
if (value2 == a[i])
{
return -1;
}
if (value1 == a[i]) //如果找到相同的数则改变flag值。
{
flag = 1;
}
}
while (flag = 0) return -1; //value1没有对应的一项,退出。
for (int i = 0;i < Count;i++)
{
if (value1 == a[i])
{
a[i] = value2;
}
}
int cp[MAXN] = { 0 };
for (int i = 0;i < Count;i++) //copy a数组
{
cp[i] = a[i];
}
int max = 0;int k = 0;int o = 1;
max = cp[0]; //设置数组的第一个数字为最大值,然后与其他数字比较。
while (1)
{
for (int i = 0; i < Count; i++)
{
if (max < cp[i])
{
max = cp[i];
k = i;
}
}
a[Count - o] = cp[k]; //最大的位数放入a数组的最大位。
cp[k] = -9999; //不再考虑刚才放入的一项。
max = 0;
o++;
if (Count - o < 0) break;
}
return a;
}
int query(int a[], int value)
//二分法在有序数组a中查找元素value,
{
int left = 0;int right = Count-1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] == value)
{
return mid;
}
else if (mid < value)
{
left = mid + 1;
}
else if (mid > value) {
right = mid + 1;
}
}
return -1;
}
感觉自己的水平就很明显,还是很弱很弱,还需继续做题打磨。
在插入功能部分我没有用直接找最大值一一放入数组来来完成排序。 我是用两个数组交错赋值以此挪位实现。
但是在修改功能部分我用了寻找最大值来重新一一放入数组实现排序,果然是方便简单多了。
因为做了太久了,也不想重新按照题目条件改动了,继续做别的题了。