数据结构与算法(四)

线性表的顺序表示与实现

 

(1)线性表的顺序表示

线性表的顺序表示是用一组地址连续的存储单元依次存储线性表的数据元素,通常这种结构称为顺序表。其特点为,逻辑上相邻的数据元素在物理上也相邻。

假设线性表的每个数据元素需要占据l个存储单元,以数据元素所占的第一个存储单元地址为该数据元素的位置,那么,对于线性表中的第i+1个元素,其与表中第i个元素的存储位置关系为:

LOC(a_{i+1})=LOC(a_{i})+l

同时,对于第i个元素,其与线性表第一个元素的位置关系为:

LOC(a_{i})=LOC(a_{1})+(i-1)*l

只要确定了顺序表的起始位置,线性表的任一数据元素都能随机存取。

在C语言中,使用动态分配的一维数组表示顺序表

typedef struct{
    Elemtype *elem;//Elemtype为线性表的数据类型
    int length;//线性表的长度
}sqList;

(2)顺序表基本操作的实现 

  

//创建顺序表
int InitList(sqList &L)
{
    L.elem = new Elemtype[100];//分配数组空间
    if(!L.elem){
        return 0;//分配失败后操作
    }
    L.length = 0;//空表长度为0
    return 1;
}

//顺序表取值
int GetElem(SqList L,int i,ElemType &e)
{
    if(i<1 || i>L.length){//检查位置的合法性
        return 0;
    }
    e = L.elem[i - 1];
    return 1;
}

//顺序表查找
int LocateElem(SqList L,ElemType e)
{//在顺序表L中查找值为e的元素,找到返回位置,未找到返回0
    for(i = 0;i < L.length;i++)
    {
        if(L.elem[i] == e)
        {
            return i + 1;
        }
        return 0;
    }
}

//顺序表插入
int ListInsert(Sqlist &L,int i,ElemType e)
{
    if(i<1 || i>L.length)//检查位置的合法性
    {
        return 0;
    }

    if(L.length == 100)//表已满
    {
        return 0;
    }

    for(j = L.length - 1;j >= i - 1;j--)
    {
        L.elem[j + 1] = L.elem[j];
    }
    L.elem[i - 1] = e;
    L.length++;
    return 1;
}

//顺序表删除
int ListDelete(SqList &L,int i)
{
    if(i<1 || i>L.length)//检查位置的合法性
    {
        return 0;
    }

    for(j = i;j <= L.length - 1;j++)
    {
        L.elem[j - 1] = L.elem[j];
    }
    L.length--;
    return 1;
}

对于查找操作,查找位置为i的元素时,需要执行i次

对顺序表中的所有元素,平均需要\frac{1}{n}\sum_{i=1}^{n}i=\frac{n+1}{2}次,其时间复杂度为O(n).

对于插入操作,在位置i插入时,需要执行n-i+1次

对所有的插入位置,平均需要\frac{1}{n+1}\sum_{i=1}^{n+1}(n-i+1)=\frac{n}{2}次,其时间复杂度为O(n).

对于删除操作,删除位置i的元素时,需要执行n-i次

对所有的删除位置,平均需要\frac{1}{n}\sum_{i=1}^{n}(n-i)=\frac{n-1}{2}次,其时间复杂度为O(n).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值