data structure 2 线性表的顺序表示和实现

1)线性的顺序存储结构

      - 向内存申请一块连续的存储单元,好比数组,就是顺序存储结构。也叫顺序映像。这种方法存储的线性表称作顺序表

      - 静态的顺序存储结构:数组。这就好比学生去春游,一个班的学生坐一辆大巴车,但是一辆不够,多余的学生就不能坐进大巴车。大巴车是不能变长的,(C语言中)数组也是不能变长的。

      - 动态的顺序存储结构:手动申请内存空间。现在是坐火车出游,一个车厢不够,那就再加一节车厢。malloc申请的空间被用完,就用realloc追加内存空间。

2)线性表的插入操作

      - 插入操作:线性表的插入运算是指在表的第 i (1 <= i <= n +1) 个位置上, 插入一个新节点 b,使长度为 n 的线性表变成长度为 n + 1 的线性表。

      - 算法思想:

                        1、检查 i 值是否超出所允许的范围 (1 <= i <= n + 1) ,若超出, 则进行“超出范围”错误处理;

                        2、将线性表的第 i 个元素和它后面所有元素均后移一个位置;

                        3、将新元素写入到空出的第 i 个位置上;

                        4、使线性表的长度增 1。

      - 算法部分代码实现:C++语法,需了解引用符号&。

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
#define LISTINCREMENT 10    //线性表存储空间的分配增量 
#define Status          int //状态
#define OVERFLOW        -1  //溢出
#define OK              1   //正确
#define ERROR           0   //错误
typedef int ElemType;       //ElemType设置为int类型

typedef struct {
    ElemType  *base;   //数组指针,指示线性表的基地址
    int length;   //当前长度
    int listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;

int ListInsert_Sq(Sqlist &L,int i,ElemType e){
    if(i<1||i>L.length+1) //判断i的合法性
        return ERROR;

    if(L.length>=L.listsize) //当前存储已满,增加分配
    {   
        L.base=(ElemType*)realloc(L.base,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!base) 
            exit(OVERFLOW);
        L.listsize+= LISTINCREMENT;
    } 

    for(int j=Sqlist.length; j>i-1; --j) //后移位置
    {
        L.base[j]=L.base[j-1];
    }
    L.base[j]=e;
    ++L.length; //线性表长度增1    
    return OK;
}

3)插入操作的时间复杂度分析

      - 算法时间主要花费在for循环上,当插入位置在表头时,所有元素后移,时间复杂度为O(n);当插入位置在表尾时,不需要移动任何元素,时间复杂度为O(1)。

      - 假设在表中任何位置 (1 <= i <= n+1) 上插入结点的机会是均等的,平均要移动表上一半元素,算法的平均时间复杂度为O(n)。

4)线性表的删除操作

      - 线性表的删除运算是指将线性表的第 i (1 <= i <= n) 个结点 删除,使长度为 n 的线性表变成长度为 n -1 的线性表。 

      - 算法思想:

                        1、检查 i 值是否超出所允许的范围 (1 <= i <= n),若超出,则进      行“超出范围”错误处理;

                        2、将线性表的第 i 个元素后面的所有元素均前移一个位置;

                        3、使线性表的长度减 1。

       - 算法部分代码实现:C++语法,需了解引用符号&。

Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
    if ((i < 1) || (i > L.length)) // 判断删除位置的合法性
        return ERROR;   
    for(int j = i - 1; j <= L.length - 1; ++j) // 移动元素
    {
        L.base[j] = L.base[j + 1];
    }
    --L.length; // 长度减1
    return OK;
}

5)删除操作的时间复杂度分析

      - 删除的位置在表头时,时间复杂度为O(n);删除位置在表尾时,时间复杂度为O(1)。在顺序表上做删除运算,平均约要移动表上 一半元素,平均时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值