2.2 数据结构——线性表的顺序表示和实现

2.2.1线性表顺序存储定义

        线性表的顺序存储结构是指用一段连续的存储单元依次存储线性表中的数据元素。

线性表(a_{1}, a_{2},...,a_{n})的顺序存储结构的示意图如下:

a_{1}a_{2}...a_{i-1}a_{i}a_{i+1}...a_{n}

        假设线性表中的每个元素占L个单元,那么第i+1个数据元素的存储位置和第i个数据元素的存储位置满足关系:

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

2.2.2 线性表顺序存储的特点

        用物理位置相邻来表示数据元素之间的逻辑关系,任一数据元素都可以随机存取。

2.2.3 线性表的表示

#define MAXSIZE 100            //线性表的最大存储空间
typedef int ElemType;          //定义线性表数据元素的数据类型
typedef struct
{
    ElemType data[MAXSIZE];    //使用数组存储数据元素,数组的大小为MAXSIZE
    int length;                //线性表的长度
}Sqlist;

2.2.4 线性表的实现

1、线性表的初始化

/*Function name: Init_Sqlist
**Description:   线性表初始化
**Parameter:
**@L:            要初始化的线性表
**Return:        0:success, other:false
*/

int Init_Sqlist(Sqlist*L)
{
    L->data = (ElemType *)malloc(sizeof(Sqlist) * MAXSIZE); //给线性表的数据元素数量分配空间
    L->length = 0; 
    if (!L->data)
        return 1;
    else
        return 0;
}

2、判断线性表是否为空

/*Function name: SqlistEmpty
**Description:   判断线性表是否为空
**Parameter:
*@L:             线性表
**Return:        0:success,other:fail
*/
int SqlistEmpty(Sqlist L)
{
    if (L.length == 0)
        return 0;
    else
        return 1;
}

3、获取线性表中的数据元素

/*Function name: GetElem
**Description:   获取线性表的数据元素
*Parameter:
*@L:             线性表
*@index:        第index个数据元素
*@e:             传出参数,用于保存获取的数据元素
**Return:        0:success,other:fail
*/
int GetElem(Sqlist L, int index, ElemType *e)
{
    if (index < 1 || index > L.length)
        return 1;

    *e = L.data[index-1];
    return 0;
}

4、获取线性表第index个数据元素的直接前趋

/*Function name: PriorElem
**Description:   获取数据元素的直接前趋
**Paramter:
*@L:             线性表
*@index:         第index个数据元素
*@pre_e:         传出参数,用于保存第index个数据元素的直接前趋
**Return:        0:success,other:fail
*/
int PriorElem(Sqlist L, int index, ElemType *pre_e)
{
    if (index <= 2 || index > L.length)
        return 1;
    
    *pre_e = L.data[index-2];
    return 0;
}

5、获取线性表第index个数据元素的直接后继

/*Function name: NextElem
**Description:   获取第index个数据元素的直接后继
**Parameter:
*@L:             线性表
*@index:         第index个数据元素
*@next_e:        传出参数
**Return:        0:success,other:fail
*/
int NextElem(Sqlist L, int index, ElemType *next_e)
{
    if (index <= 0 || index >= L.length)
    return 1;

    *next_e = L.data[index];
    return 0;
}

6、插入数据元素

/*Function name: ListInsert
**Description:   插入数据元素
**Parameter:
*@L              线性表
*@index          数据元素插入的位置
*@e              插入数据元素的值
*Return          0:success,other:fail
*/
int ListInsert(SqlList *L, int index, ElemType e)
{
    if (L->length == MAXSIZE)
    return 1;

    if (index < 1 || index > L->length+1)
    return 1;

    if (index <= L->length)  //如果数据元素插入的位置不在表尾    {
        for (int i = L->length-1; i >= index-1; i--)
            L->data[i+1] = L->data[i];
    }
    
    L->data[index-1] = e;
    L->length++;
    return 0;
}

7、删除数据元素

/*Function name: ListDelete
**Description:   删除数据元素
**Parameter:
*@L              线性表
*@index          数据元素的位置
*@e              传出参数
**Return:        0:success,other:fail
*/
int ListDelete(Sqlist *L, int index, ElemType *e)
{
    if (L->length == 0)
        return  1;
    if (index < 1 || index > L->length)
    return 1;

    *e = L->data[index-1];
    if (index < L->length) //如果删除的数据元素不在表尾
    {
        for (int i = index-1; i < L->length-1; i++)
            L->data[i] = L->data[i+1];
    }
 
    L->length--;
    return 0;
}

8、获取线性表的长度

/*Function name: ListLength
**Description:   获取线性表的长度
**Parameter:
*@L              线性表
**Return:        线性表的长度
*/
int ListLength(Sqlist L)
{
    return L.length;
}

9、清空线性表

/*Function name: ClearList
**Description:   清空线性表
**Parameter:
*@L              线性表
*Return          void
*/
void ClearList(Sqlist *L)
{
    L->length=0;
}

10、销毁线性表

/*Function name: DestoryList
**Description:   销毁线性表
**Parameter:
*@L              线性表
*Return:         void
*/
void DestoryList(Sqlist *L)
{
    if (L->data)
        free(L->data);
}

2.3.5 线性表顺序存储的优缺点

优点:

1、不需要另外的存储空间来表示顺序表中的数据元素的逻辑关系;

2、可以快速存取表中的任一位置的数据元素。

缺点:

1、插入和删除操作需要移动大量数据元素;

2、当线性表长度变化较大时,很难确定存储空间的容量;

3、造成存储利用不充分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值