码迷,mamicode.com
首页 > 其他好文 > 详细

线性表

时间:2021-01-22 12:04:37      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:type   部分   信息   修改   结构   als   索引   关系   while   

错题集

顺序表

  • 线性表的顺序存储是一种()。
    A. 随机存取的存储结构
    B. 顺序存取的存储结构
    C. 索引存取的存储结构
    D. 散列存取的存储结构
    【答案】: A
    【解释】:存取方式指的是读写方式。顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以很方便地访问任意一个元素,这就是随机存取的概念。
    【知识补充】:

  • Q:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
    A:
    解答:
    算法思想:搜索整个顺序表,查找最小元素并记住其位置,搜索结束后用最后一个元素填补空出的原最小值元素的位置。
    代码:
bool Del_Min(sqList &L,ElemType & value){
      //删除顺序表L中最小元素结点,并通过引用型参数返回其值
      //若删除成功,则返回true,否则,返回false
      if(L.length==0)
            return false;
      value =L.data[0];
      int idx=0;
      for(int i=1;i<L.length;i++){
            if(L.data[i]<value){
                  value = L.data[i];// value记录当前最小元素
                  idx = i;
            }
      }
      L.data[i] = L.data[L.length-1];//空出的位置由最后的元素填补
      L.length--;
      return true;
}

*Q:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1).
*A:
算法思想: 扫描顺序表的前半部分元素,将其与后半部分对应元素交换。
代码:

void Reverse(sqList &L){
      Elemtype tmp;//辅助变量
      for(int i=0;i<L.length/2;i++){
            tmp = L.data[i];
            L.data[i] = L.data[L.length-i-1];
            L.data[L.length-i-1] = tmp;
      }
}

*Q:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
A:
*解法一:用k记录顺序表L中不等于x的元素的个数,边扫描L边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度。

void delete_x(sqList &L,Elemtype x){
//本算法实现删除顺序表L中所有值为x的数据元素
      int k = 0;//记录值不等于x的元素个数
      for(int i = 0; i < L.length; i++){
            if(L.data[i] != x){
                  L.data[k] = L.data[i];
                  k++;
            }
      }
      L.length = k;
}

*解法二:用k记录顺序表L中等于x的元素个数,边扫描L边统计k,并将不等于x的元素前移k个位置,最后修改顺序表L的长度。

void delete_x(sqList &L,Elemtype x){
      int k = 0;//k值记录值等于x的元素个数
      while(i < L.length){
            if(L.data[i] == x){
                  k++;
            }
            else
                  L.data[i-k] = L.data[i];//当前元素前移k个位置
            i++;
      }
      L.length = L.length - k;//顺序表长度递减
}

解法3:设头尾指针分别从顺序表头尾遍历,如果头指针遍历到元素值等于x,那么将尾指针对应元素值放到头指针位置,直到头尾指针相遇。
这种做法可能会导致原顺序表中的位置关系发生变化。

void delete_x(sqList &L,Elemtype x){
     int i=0;//定义头指针从头遍历顺序表
     int j = L.length-1;//定义尾指针从后遍历顺序表
     while(i<j){
           if(L.data[i]==x){
                 while(L.data[j] == x && i < j)
                        j--;//j从后向前找到第一个不等于x的元素
                 if(i>=j)  break;//如果头尾指针相遇则停止!
  
                 L.data[i] = L.data[j];
                 j--;                                     
           }
           else
                  i++;//头指针向后遍历
      }
      L.length = i+1;
}

线性表

标签:type   部分   信息   修改   结构   als   索引   关系   while   

原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/14309390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!