线性表及其顺序表示

线性表及其顺序表示

什么是线性表

  1. 线性表(LInear List)是由同类型数据元素构成有序序列的线性结构;
  2. 线性表没有元素时,称为 空表
  3. 表中元素个数称为线性表的 长度
  4. 表起始位置称为 表头 ,表结束位置称为 表尾

线性表有什么用

存储数据有一种常用的方法,就是数组。使用数组存储同类型的数据具有代码简单且可读性强,调试方便等特点,但也有很多缺点。比如,数组的大小必须提前确定,如果遇到具体数据数量不定的实际问题时,必须使用指针申请动态数组的方法实现。再比如,如果遇到有效项很少的数据集,比如稀疏矩阵,使用数组会造成空间的大量浪费(大量的0被迫存在数组中)。
而线性表则克服了这些缺点。线性链表不需要提前设置固定的数据总数,来一个数据就能储存一个数据。并且可以通过只储存非零项的方式避免空间的浪费。当然,它也有逻辑抽象,调试困难等一系列缺点。在实际问题中要根据问题的具体情况选择最为合适的数据结构。

线性表的顺序存储的表示和实现

  • 利用数组的 连续存储空间 顺序存放线性表的各元素
typedef struct LNode *List
struct LNode
{
    ElemType data[MAXSIZE];
    int last; //last表示数组中当前最后一个元素的所在位置,last <=  MAXSIZE - 1
};
struct LNode L;
List PtrL;

访问下标为i的元素:
L.data[i]Ptrl -> data[i]
线性表长度:
L.last + 1Ptrl -> last + 1

  • 初始化(构建一个空的线性表)
List Initial(List PtrL)
{
    PtrL = (List)malloc(sizeof(struct LNode));
    PtrL -> last = -1;
    return PtrL;
}
  • 查找线性表中的某个元素并且返回其下标
int Find(ElemType x, List PtrL)
{
    int i = 0;
    while(i <= PtrL -> last && PtrL -> data[i] != x)
        i ++;
    if(i > PtrL -> last)
    {
        printf("There is no such an element!\n");
        return -1;
    }
    else
        return i;
}
  • 在第i(1 <= i <= n + 1)个位置插入一个值为x的新元素
    思路:现将第下标为i-1开始往后的所有元素往后挪一个位置,再把x放进下标为i-1的位置中。
void Insert(List PtrL, int i, ElemType x)
{
    if(PtrL -> last == MAXSIZE -1)
    {
        printf("The list is full!\n");
        return;
    }
    if(i < 1 || i > PtrL -> last + 2)
    {
        printf("It is an illegal position!");
        return;
    }
    for(int j = PtrL -> last; j >= i - 1; j --)
        PtrL -> data[j + 1] = PtrL -> data[j];
    PtrL -> data[i - 1] = x;
    PtrL -> last ++;
    return;
}
  • 删除第i(1 <= i <= n + 1)个元素
    思路:将下标为i的元素开始往后的所有元素往前挪一个位置。
void Delete(List PtrL, int i)
{
    int j;
    if(PtrL -> last < i - 1 || i < 1)
    {
        printf("There is no such an element!");
        return;
    }
    while(j = i; j <= PtrL -> last; j ++)
        PtrL -> data[j - 1] = PtrL -> data[j];
    PtrL -> last --;
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值