zoukankan      html  css  js  c++  java
  • 线性表的顺序存储结构

    1 线性表的顺序存储结构,是指用一段地址连续的存储单元依次存储线性表的数据元素。既然线性表的每个数据元素类型都相同,所以可以用一维数组来实现顺序存储结构,即把第一个元素存储在下标为0的位置上,接着把线性表相邻的元素存储在数组中相邻的位置。
    2 线性表顺序存储的结构代码

    #define MAXSIZE 20        //存储空间初始分配量
    typedef int ElemType;     //ElemType表示类型,这里假设为int
    typedef struct {
        ElemType data[MAXSIZE];    //数组存储数据元素,最大值为MAXSIZE
        int length;                //线性表当前长度
    } SqList;

    说明:描述顺序存储结构需要三个属性
    (1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
    (2)线性表的最大存储容量:数组长度MAXSIZE
    (3)线性表的当前长度:length

    3 顺序存储结构的插入和删除

    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    typedef int Status;

    (1)用e返回数组L中第i个数据元素的值

    Status getElem(SqList L, int i, ElemType *e) {
      if (L.length <= 0 || i < 1 || i > L.length) {
          return ERROR;
      }  
      *e = L.data[i - 1];
      return OK;
    }

    时间复杂度为O(1).

    (2)在线性表第i个位置插入元素e
    /* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length + 1 */
    /* 操作结果:在L中第i个位置之前插入e,L的长度加1 */

    Status ListInsert(SqList *L, int i, ElemType e) {
      int k;
      if (L->length == MAXSIZE) {    //线性表已满
          return ERROR;
      }
      if (i < 1 || i > L->length + 1) {    //插入的位置不在范围内
          return ERROR;
      }
      if (i <= L-> length) {    //不是插入在队尾
          for (k = L-> length - 1; k >= i - 1; k--) {
              L->data[k + 1] = L->data[k];
          }
      }
      L->data[i - 1] = e;
      L->length ++;
      return OK;
    }

    (3) 删除第i个位置的元素,并用e返回其值
    /* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length */
    /* 操作结果:删除L中第i个数据元素,L的长度减1 */

    Status ListDelete(SqList *L, int i, ElemType *e) {
      int
    k;   if (L->length == 0) {    return ERROR;   }   if (i < 1 || i > L-> length) {    return ERROR;   }   *e = L->data[i - 1];   if (i < L->length) { //不是删除队尾元素    for (k = i; k <= L->length - 1; i++) {    L->data[k-1] = L->data[k];    }   }   L->length --;   return OK; }

    (4)时间复杂度
    如果插入到最后一个位置,或者删除最后一个元素,时间复杂度为O(1)。最坏情况,即插入到第一个位置、或者删除第一个元素,此时时间复杂度为O(n).平均时间为(n-1)/2.故时间复杂度为O(n).

  • 相关阅读:
    Spring Boot & ES 实战,值得参考!
    什么是 Java 对象深拷贝?面试必问!
    一份完整的 MySQL 开发规范,进大厂必看!
    ASP.NET + MVC5 入门完整教程五 --- Razor (模型与布局)
    C# MVC扩展方法
    C#泛型应用及原理
    部分类及部分方法
    程序集
    类的可访问属性
    ASP.NET + MVC5 入门完整教程四---MVC 中使用扩展方法
  • 原文地址:https://www.cnblogs.com/muzijie/p/5617051.html
Copyright © 2011-2022 走看看