一、从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错误信息,并退出运行。
ElemType ElemMinDelete(SqList &L)
{
int i;
ElemType min;
min = L.data[0];
for (i = 0; i < L.length; i++)
{
if (L.data[i]<min)
{
min = L.data[i];
}
}
for (i = 0; i < L.length; i++)
{
if (L.data[i]==min)
{
L.data[i]=L.data[L.length];
}
}
return min;
}
所犯错误如下:
1.没有考虑到若顺序表为空则显示出错误信息并退出运行。
2.通过一个for循环找到最小值之后,没有必要在次遍历整个表。只需要对应地方进行赋值删除操作。
3.对于数组而言,由于第一个数据是a[0],最后一个数据为a[n-1],不是a[n]。
4.没有将顺序表的长度减1.
参考答案如下:
bool Del_Min(SqList &L, ElemType &value)
{
if (L.length==0)
{
return false;
}
value = L.data[0];
int pos = 0;
for (int i = 1; i < L.length; i++)
{
if (L.data[i]<value)
{
value = L.data[i];
pos = i;
}
}
L.data[pos] = L.data[L.length - 1];
L.length--;
return true;
}
二、设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)
个人求解:
bool Inverse(SqList &L)
{
ElemType e;
for (int i = 0; i < L.length; i++)
{
e = L.data[i];
L.data[i] = L.data[L.length - i];
L.data[L.length - i] = L.data[i];
}
return true;
}
注意:同样犯了数组边界的错误。此时程序也可以简写,参照答案,void类型就可以实现初步的功能。
void Inverse(SqList &L)
{
ElemType e;
for (int i = 0; i < L.length/2; i++)
{
e = L.data[i];
L.data[i] = L.data[L.length - i-1];
L.data[L.length - i-1] = L.data[i];
}
}