大话数据结构学习①线性表的顺序存储结构



#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];
    int length;
} SqList;

// 初始化顺序表
Status InitList(SqList *L)
{
    L->length = 0;
    return OK;
}

// 返回顺序表的长度
int ListLength(SqList L)
{
    return L.length;
}

#define OK 1
#define ERROR 0
typedef int Status;

// 查找第i个元素的值
Status GetElement(SqList L, int i, ElemType *e)
{
    if (L.length == 0 || i < 1 || i > L.length)
    {
        return ERROR;
    }
    *e = L.data[i - 1];
    return OK;
}

//插入操作
Status ListInsert(SqList *L, int i, ElemType e)
{
    int k;
    if (L->length == MAXSIZE) // 顺序表已满
        return ERROR;
    if (i < 1 || i->L.length + 1) // i值不合法
        return ERROR;
    if (i <= L->length) //判断是否是最后一个元素
    {
        for (k = L->length - 1; k >= i - 1; k--) //倒叙移动
            L->data[k + 1] = L->data[k];         // 将i之后的元素向后移动一位
    }
    L->data[i - 1] = e; // 插入
    L->length++;        // 长度加1
}

//删除操作
Status ListDelete(SqList *L, int i, ElemType e)
{
    int k;
    if (L->length == 0) // 顺序表为空
        return ERROR;
    if (i < 1 || i > L->length) // i值不合法
        return ERROR;
    *e = L->data[i - 1]; // 将要删除的元素赋值给e
    if (i < L->length)   //是否是最后一个元素
    {
        for (k = i; k < L->length; k++) // 将i之后的元素向前移动一位
            L->data[k - 1] = L->data[k];
    }
    L->length--; // 长度减1
    return OK;   // 删除成功
}

线性表的顺序存储结构的优点:

  ①无需为表示表中元素之间的逻辑关系而额外的增加存储空间。

  ②可以快速的存取表中任何一个位置的元素。

线性表的顺序存储结构的缺点:

  ①插入和删除操作需要移动大量的元素。

  ②线性表的长度变化比较大的时候,难以确定存储空间的容量。

  ③造成存储空间的碎片。

线性表的定义:零个或者多个数据元素的有限序列。