淘先锋技术网

首页 1 2 3 4 5 6 7

线性表的顺序表示与实现

 

(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).