数据结构 线性表quiz

数据结构代码题目主要看思想,实际不能执行也不要紧。
在这里插入图片描述

//1.删除表内最小元素,唯一,返回被删元素,空出来的最后一个元素填补,顺序表空返回错误退出运行。

    bool del_minElem(sqList &L,elemType value)
         if(L.length= =0)                            ??注意这里是==
             return false;
         elem e=L.data[0];
         int pos =0;                                 ??注意初始化
         for(int i=1;i<L.length;i++)
         if(e >L.data[i])
              e=L.data[i];
              pos=i;
         L.data[pos]=L.data[L.length-1];             ??注意是pos不是e
         L.length --;
         return true;

//3 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法。
//该算法删除线性表中所有x数据元素

void del_x(SqList &L , ElemType x)
    int
    for(int i=0 ;i<L.length ;i++ )
        if (L.data[i]==x)
            for(int j=L.length;j>=i;j--)
                 L.data[i] =L.data[i+1];
        L.length --;
    return 0;


//书中答案:重新从0位置开始排跟x不相等的数据。
void del_x(SqList &L , ElemType x)
    int k=0;i=0;
    while (i<L.length)
        if (L.data[i] !=x)
            L.data[k] = L.data[i];
            k++;
    L.length=k;                         //??把 !=改成  == 就是删除不同的数据

// 4 删除给定值在s与t之间 s<t

bool  delete_s_t(SqList &L ,elem  s,elem t)
    if (s>=t || L.length ==0)
        return  false;
    for(int i =0;i<L.length ;i++)
        if(L.data[i]>s && L.data[i] <t)
            for(int j=L.length;j>=i;j--)
               L.data[i] =L.data[i+1];
            L.length --;
    return true;
//答案:要考虑顺序表,表本身是有序的,所以删除的时候必须是一个整体。
  算法思想:寻找值大于等于s的第一个元素(第一个删除的元素),寻找值大于t的元素(最后一个删除元素的下一个元素)
  删除之后需要将之后的元素前移。


bool  delete_s_t(SqList &L ,ElemType  s,ElemType t)
    int i,j;
    if(L.length ==0 || s>=t)
        return false;
    for(i=0;i<L.length && L.data[i]<s;i++)                  //寻找大于s的
    if(i>=l.length)                                         //可以考虑替换if(L.data[0]>=t || L.data[L.length]<=s)
        return false;
    for(j=i;j<L.length && L.data[j]<t;j++)                  //寻找大于t的;
    for(;j<L.length;i++,j++)                                //前移填补
        L.data[i]=L.data[j];
    L.length = i;
    return  ture;

//5 从顺序表中删除给定值 s与t 之间,包含s和t,要求s<t 的所有元素,若s或t不合理
或顺序表为空,显示错误信息并退出运行。

bool delete_s_t5(SqList &L ,ElemType  s,ElemType t)             //要声明两个变量
    if (s >t || L.length ==0)
        return  false;
    for(int i= 0; i<L.length ;i++)
        if(L.data[i]>=s && L.data[i] <=t)
            for(int j=i;j<L.length;j++)
                L.data[j]=L.data[j+1];
        L.length --;
    return ture;


//书上答案
bool delete_s_t5(SqList &L ,ElemType  s,ElemType t)
    int j,i;
    if (s >t || L.length ==0)
        return  false;
    for(int i= 0; i<L.length ;i++)
        if(L.data[i]>=s && L.data[i] <=t)
            k++;
        else
        L.data[i-k]=L.data[i];
    L.length-=k
    return ture;

//6 从有序数列中删除所有其重复的元素,使表中所有的值均不同加粗样式

bool del_repeat(sqList &L)
    int k,i,j;
    if(L.length= =0)                            ??注意这里是==
        return false;
    for(i=0;i<L.length;i++)
        for(j=0;j<L.length;j++)
            if (L.data[i]=L.data[j])
                k++;
            L.data[i-k]=L.data[i];
        L.length -=k;
    return ture;


//书中答案
bool del_repeat(SeqList &L)
    if(L.length= =0)
        return false;
    int i,j;
    for(i=0,j=1;j<L.length;j++)
        if (L.data[i] !=L.data[j])
            L.data[++i]=L.data[j];
    L.length=i+1;
    return ture;

//7 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表

void return_seqList(SeqList &L1 ,SeqList &L2)
    if(L1.length= =0)
        return L2;
    if(L2.length= =0)
        return L1;
    int i,j,k=0;
    SeqList L;
    for(i=0;i<L1.length;i++)
        for(j=0;j<L2.length;j++)
            if(L2.data[j]<L1.data[i])
                L.data[++k]=L2.data[j];
            else
                L.data[++k]=L1.data[i];
    return L;


    //书中答案
    bool Merge(SeqList A,SeqList B,SeqList C)
        //A,B合并成C
        if(A.length+B.length >C.maxSize())      //循环比较两个小的存入结果表
            return false;
        int i =0,j=0,k=0;
        while(i<A.length && j<B.length)
            if(A.data[i]<=B.data[j])
                C.data[k++]=A.data[i++];
            else
                C.data[k++]=B.data[j++];
        while(i<A.length)                           //剩余一个没有比完的顺序表
            C.data[k++]=A.data[i++];
        while(j<B.length)
            C.data[k++]=B.data[j++];
        C.length = k;
        return ture;

8.已知在一维数组A[m+n]中依次存放两个线性表(a1…am)和
(b1…bn)试编写一个函数,将数组中两个顺序表的位置互换,即将
(b1…bn)放在(a1…am)的前面。

答案:
思想:先将数组A[m+n]中元素原地置换再对n个元素和后m个元素分别使用逆置算法。

typedef int DataType;
void  Reverse(DataType A[],int left ,int right,int arraySize)
    if(arraySize ==0 ||)
        return false;
    int mid=(left+right)/2
    DataType temp;
    for(int i=0;i<mid-left;i++)
        temp = A[left+i];
        A[left+i]=A[right-i];
        A[right-i]=temp;

void Exchange(DataType A[],int left ,int right,int arraySize)
    Reverse(A,0,m+n-1,arraySize)
    Reverse(A,0,n-1,arraySize)
    Reverse(A,n,m+n-1,arraySize)```





9.线性表(a1…an)中元素递增有序存储计算机内。要求设计一个算法
完成用最少的时间在表中查找数值为x的元素,若找到,则将其与其后继元素
位置相互交换,若找不到,则将其插入表中并使表中的元素仍然递增有序。

void  Reverse(SeqList &L, int low ,int high,ElemType x)  //这个是线性表 声明可以用数组[]
    int min=(low+high)/2;
    if(L.data[mid]=x)                               //这里应该==
        L.data[mid]=L.data[mid+1];                  //折半查找代码不熟
        L.data[mid+1]=x;
    else if(L.data[mid]>x)                             //x小应该在 low和mid之间找。
        low=(low+high)/2;
    else
        high=(low+high)/2;
    if(low>=high);
         if(L.data[mid]>x)
            for(int i=L.length;i>mid;i--)
                L.data[i+1]=L.data[i];
            L.length++;
            L.data[mid]=x;
         if(L.data[mid]>x)
            for(int i=L.length;i>mid+1;i--)
                L.data[i+1]=L.data[i];
            L.length++;
            L.data[mid+1]=x;
    return 0;
答案:折半查找效率最快
void SearchExchangeInsert(ElemType A[],ElemType x)
    int low=0,high=n-1,mid;
    while(low<high)
        mid=(low+high)/2;
        if(A[mid]==x) break;
        else if(A[mid]<x) low=mid+1;
        else high=mid-1;

        if(A[mid]==x && mid! = n-1)                 //若最后一个元素与x相等 则不存在与其后面交换操作
            t=A[mid];A[mid]=A[mid+1];A[mid+1]=t;                //答案里没有看到t的声明
        if(low>high)                                //查找失败
            for(i=n-1;i<high;i--)                   //后移元素,插入x
                A[i+1]=A[i];
                A[i+1]=x;

10.【2010真题】设将n(n>1)个整数存放到一维数组R中,设计一个在时间
和空间两方面都尽可能高效的算法。将R中保存的序列喜欢左移p(0<p<n)个
位置,即将R中的数据由(X0,X1…Xn-1)变换(Xp,Xp+1…Xn-1,X0
…Xp-1),要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度

思想:可将这个问题视为把数组ab转换成ba(a代表数组前p个元素,b代表数组
余下n-p个元素)。先将a逆置,再将b逆置,最后整个逆置。

void Reverse(int R[],int from ,int to)
    int i,temp;
    for(i=0;i<(to-from -1)/2;i++)           //转置R
        temp=R[from+i];
        R[from+i]=R[to-i];
        R[to-i]=temp;

void Converse(int R[],int n,int p)
    Reverse(R,0,p-1);                       //转置p
    Reverse(R,p,n-1);                       //转置除p外的
    Reverse(R,0,n-1);                       //转置最终的

时间复杂度:O(n),空间复杂度O(1);

11.【2011真题】一个长度为L(L>=I)的升序序列S,处在第L/2 向上取整
的位置数称为S的中位数。两个有序列的中位数是喊他们所有元素的升序序列
中位数。现在有等长升序序列A和B,设计一个在空间和时间两方面都尽可能高
效的算法,找出两个序列A和B的中位数。要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度

在这里插入图片描述

在这里插入图片描述

思想:排序两个序列,找到L/2 向上取整。
或者s1的个数之和比上2。然后再去序列里面找对应的值。

void mid_number(A[],B[])                            //没有数组的类型。1
    int i=0,j=0,k=0,mid;
    for(int i=0;i<(A.length+B.length)/2-1;i++)          //没有考虑A,B中数据取玩的情况
        if(A[k]<=B[j] || k>A.length)
            k++;
            if(k+j=(A.length+B.length)/2-1)
                R[mid]=R[k];
        else
            j++;
            if(k+j=(A.length+B.length)/2-1)
                R[mid]=R[j];
    return R[mid];
时间复杂度:O(n),空间复杂O(1);


答案
int M_Search(int A[],int B[],int n)
    int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;
    //分别表示A和B的首位数、末尾数和中位数。
    while(s1!=d1 ||s2!=d2)
        m1=(s1+d1)/2;
        m2=(s2+d2)/2;
        if(A[m1]=A[m2])
            return A[m1];
        if(A[m1]<B[m2])
            if((s1+d1)%2==0)
                s1=m1;
                d2=m2;
            else
                s1=m1+1;
                d2=m2;
        else
            if((s2+d2)%2==0)
                d1=m1;
                s2=m2;
            else
                d1=m1;
                s2=m2+1;
    return A[s1]<B[s2]?A[s1]:b[S2];


12.【2013统考真题】已知整数数列A=(a0,a1…an-1),其中0<=ai<n
(0<=i<n),若存在ap1=ap2=…apm=x且m>n/2(0<=pk<n,1<=k=<m),
则称x为A的主元素。假设A中的n个元素保存在一个一维数组中,请设计一个在
空间和时间两方面都尽可能高效的算法。找出A的主元素。若存在输出该元素,
否则输出-1.要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度

在这里插入图片描述
在这里插入图片描述

13.【2018统考真题】给定一个含n(n>=1)整数数组,找出数组中未出现的最小
正整数,要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度

在这里插入图片描述

14.【2020统考真题】定义三元组(a,b,c均为正数)的距离D=|a-b|+|b-c|
+|c-d|.给定三个非空集合S1,S2,S3,按升序分别存储在三个数组中。计算并
输出所有可能的三元组(a,b,c)(a∈S1,b∈S2,c∈S3),例:S1={-1.0.9},
S2{-25.-10,10,11}, S3={2,9,17,30,41}.最小距离是2,相应三元组为
(9,10,9)。要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构是计算机科学中重要的概念,而线性表是其中一个常见的数据结构。CSDN作为一个知名的技术平台,提供了丰富的关于数据结构线性表的学习资源。 首先,数据结构是一种组织和存储数据的方式。线性表是一种简单而常用的数据结构,它由多个数据元素按照一定的顺序组成。线性表中的数据元素之间存在一对一的关系,即每个元素只有一个直接前驱和一个直接后继。 在CSDN上,我们可以找到大量关于数据结构线性表的教程、文章和博客。这些资源不仅仅介绍了线性表的基本概念和特点,还提供了各种不同类型线性表的实现方式和应用场景。通过学习这些内容,我们可以深入理解线性表的原理和操作,并掌握如何在实际编程中有效地应用线性表。 另外,CSDN上还提供了很多与线性表相关的代码示例和项目案例。这些示例可以帮助我们更好地理解线性表的具体实现过程,在实际编程中有一定的参考价值。此外,我们还可以通过CSDN上的技术论坛或者博客互动,与其他技术人员交流经验,共同解决在线性表实现过程中遇到的问题。 总而言之,CSDN作为一个知名的技术平台,对于学习数据结构中的线性表具有重要的参考价值。通过CSDN上提供的学习资源、代码示例和讨论互动,我们可以更好地理解线性表的概念和实现方式,并能够在实际编程中灵活地应用线性表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值