线性表大题(一)

线性表大题

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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封心心心心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值