【考研数据结构】第二章 线性表--顺序表

2.2 线性表的顺序表示

2.2.1 顺序表的定义

(1)线性表的顺序存储(物理存储结构)又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

(2)顺序表的特点:

  1. 表中的元素的逻辑顺序和物理顺序相同。插入和删除元素需要移动大量的元素;
  2. 随机访问。即通过首地址和元素序号找到对应元素的时间恒为O(1);
  3. 存储密度高。每个结点只存储数据信息,不存储下一个元素的地址。

注:线性表中的元素的位序是从1开始的,而数组中元素的下标是从0开始的。

(3)顺序表的描述为

静态分配:

#define MaxSize 50                 //定义表的最大长度
typedef struct {
    ElemType data[size];            //元素
    int length;                    //长度
}SqList;                            //顺序表的类型定义

动态分配:

#define InitSize 100            //表长度的初始定义
typedef struct{                
    ElemType *data;             //指定动态分配数组的指针
    int MaxSize,length;        //数组的最大容量和当前个数
}SeqList;                      //动态分配定义

C语言的初始动态分配的语句为:

L.data = (ElemType*) malloc ( sizeof(ElemType) * InitSize);

2.2.2 顺序表上的基本操作的实现

(1)插入操作

//C语言C99之前是没有布尔类型定义,但是考试不要求完全实现,所以这里使用bool返回类型是没有问题的
//在顺序表中的第i个位置插入元素
bool insertList(SqlList &L,int i,ElemType e){
    if( i < 1 || i > L.length + 1 ){
        //判断插入位置,如果小于顺序表位序1或大于当前长度length+1造成不连续,不合法
        return false; 
    }
    if( L.length >= MaxSize ){
        //当前长度以达到最大值,无法插入
        return false;
    }
    for( int  j = L.length - 1; j >= i - 1; j-- ){
        //把data[i-1] - data[L.length - 1]后移一位
        L.data[j + 1] = L.data[j];
    }
    L.data[i - 1] = e;
    L.length++;
    return true;
}
//平均时间复杂O(n)

(2)删除操作

//删除顺序表中第i个元素,成功返回元素e,失败返回false
bool ListDelete(SqList &L,int i,Elemtype &e){
    if( i < 1 || i > L.length){
        //删除位置不合法
        return false;
    }
    e = L.data[i - 1];
    for(int j = i - 1;j <= L.length - 2;j ++){
        //将第i个元素后的元素整体前移一位
        L.data[j] = L.data[j + 1];
    }
    L.length--;
    return true;
}
//平均时间复杂O(n)

(3)按值查找

//按值在顺序表中查找元素.返回元素位序
int LocateElem(SqList L,ElemType e){
    int i = 0;
    for(;i < L.length;i ++){
        if(L.data[i] == e)
            return i + 1;    //返回元素位序,而不是数组下标
    }
    return 0;
}
//平均时间复杂O(n)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值