线性表大题
1、从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
思路:题干意思是空出的位置由最后一个元素填补,否则被删元素前的每一个元素都要往后移。
先要找出最小值,然后再删除最小值。
找出最小值就是通过遍历比较,遍历一圈完找到最小值。
为了删除最小值,所以要在原有找到最小值的基础上,增加一个pos来标识最小值的位置。
bool Del_min(SqList &L,ElemType &value){
//这里传入了两个引用
//SqList &L的传入是直接对顺序表原表进行删除操作,而不是删除一个复制的表
//本题中设计多返回的操作,需要返回两个部分,第一个部分是bool类型的数据,作为整个函数的返回类型,来表示程序是否出错;
//第二个部分是最小值元素,因此在参数中传入一个引用ElemType &value,在函数调用结束后,可以直接通过引用获取引用的值
//以下操作完成了题目中所要求的若顺序表为空,则显示出错信息并退出运行
if(L.length == 0)
return false;
value = L.data[0]; //先假设L.data[0]的元素最小,将值赋给value,表示最小值
int pos = 0; //记录该最小元素的位置
for(int i = 1;i<L.length;i++)//开始循环,让每一个元素都与该最小元素进行比较
if(L.data[i]<value){ //如果发现更小的元素,则将更小的值赋给value,并且记录下新的最小值的位置
value = L.data[i];
pos = i;
}
L.data[pos] = L.data[L.length -1];//空出的位置由最后一个元素填补
L.length--;
return true;
}
**注意:**本题也可以用函数返回值返回,两者的区别是:函数返回值只能返回一个值,而参数返回(引用传递参数)可以返回多个值。
2、设置一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
逆置不是排序,只是顺序调换,而不是进行排序。
void Reverse(SqList &L){
ElemType temp;
for(int i = 0;i<L.length/2;i++){
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];//i从0开始,
L.data[L.length - i - 1] = temp;
}
}
//同样是要区分length长度和下标之间的区别,长度是从1开始。而下标是从0开始,到length-1。
//我们要做的逆置是将第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调。
//第一个元素的下标是0,最后一个元素的下标是L.length-1.
//因此最重要的是要搞清楚,下标为i的元素对应的是下标为L.length - i - 1的元素。
3、对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
法一算法思路:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),扫描时将不等于x的元素移动到下标为k的位置,并更新k值。扫描结束后修改L的长度。
void Del_x(SqList &L,ElemType x){
int k = 0; //用k来记录值等于x的元素的个数。
for(i=0;i<L.length;i++)
if(L.data[i] != x){
L.data[k] = L.data[i];
k++;
}
L.length = k;
}
//为什么是for循环到L.length而不是L.length-1处?
//因为我们要循环到最后一个结点,也就是下标length-1处。因此我们要小于(L.length-1)+1处,也就刚好是L.length处
法二算法思路:法一是用k记录顺序表中不等于x的元素个数,也可以用k记录顺序表中等于x的元素个数,边扫描L边统计k,并将不等于x的元素前移k个位置。扫描结束后修改L的长度。
代码略。
4、从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
代码如下:
//注意本题与上题的区别,因为是有序表,所以删除的元素必然是相连的整体。
//算法思想:先寻找值大于或等于s的第一个元素,然后寻找值大于t的第一个元素,要将这段元素删除,只需要直接将后面的元素前移。
bool Del_s_t(SqList &L,ElemType s,ElemTypt t){
int i,j;
if(s>=t || L.length == 0)
return false;
for(i=0;i<L.length && L.data[i]<s;i++);
if(i>=L.length)
return false;
for(j=i;j<L.length && L.data[j]<=t;j++)
for(;j<=L.length;i++,j++)
L.data[i] = L.data[j];
L.length = i;
return true;
}
5、从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行
自己写:
//思路:和第三题法一思路一样,用k记录顺序表中不介于s和t之间的元素,将这些不需要删除的元素依次重新从0到k开始排序
bool Del_st(SqList &L,int x,int t){ //注意1.题中没有说明x,t是int型;因此改成ElemType
int k = 0;
if(s>=t || L == NULL ) //注意2.这里用L.length == 0更好
return false;
for(int i = 0; i<L.length;i++)
if(L.data[i]>t || L.data[i]<s){
L.data[k] = L.data[i];
k++;
}
return true;
}
322

被折叠的 条评论
为什么被折叠?



