线性表的顺序存储结构

线性表的基本概念

线性结构习惯称为线性表,线性表是n(n>=0)个数据元素构成的有限序列,表中除第一个元素外的每一个元素,有且只有一个一个前件;除最后一个元素外,有且只有一个后件。

非空数据表具有:

  • 只有一个根节点,首元素无前件
  • 有且只有一个终端节点,末尾元素无后件
  • 除收尾节点外,其他所有节点有且只有一个前件和一个后件

线性表的顺序存储结构

通常,线性表可以采用顺序存储和链式存储两种存储结构

顺序存储是存储线性表最简单的结构,具体做法是将线性表中的元素一个接一个地存储在一片相邻的存储区域中。这种顺序存储的线性表也被称为顺序表

顺序表具有一下两个基本特征:

  • 线性表中所有元素所占的存储空间是连续的
  • 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的

在顺序表中,前件和后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面

顺序存储结构的插入和删除

主要思路:

插入

  • 判断插入元素位置是否合理
  • 在最后一个元素开始遍历,分别将元素往后移一位
  • 修改指定位置的元素
    在这里插入图片描述

删除

  • 判断删除元素位置是否合理
  • 在末尾开始遍历,分别向前移动一个位置
  • 删除指定位置的元素

代码实现
#include <stdio.h>
#include <stdlib.h> //malloc()
#include <iso646.h> // or
#include <stdbool.h> // true false
#define MAXSIZE 10

typedef int ElemType;


// 定义线性表
typedef struct 
{
    /* data */
    ElemType *elem;
    int len;
}SqList;

// 初始化线性表
bool IniSqList(SqList *l)
{
    l->len=0;
    l->elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
    if(l->elem==NULL)
        return false;
    return true;
}


// 输出线性表内容
void ShowSqList(SqList *l)
{
    for(int i=0;i<l->len;i++)
        printf("%d ",l->elem[i]);
}

// 获取某个元素
int GetData(SqList *l,int index)
{
    if(index<0 or index>l->len)
        return false;
    return l->elem[index];
}

// 插入数据
bool InsertData(SqList *l,int index,ElemType a)
{
    if(l->len==MAXSIZE)  // 判断表是否满
        return false;
    if(index<1 or index >l->len+1) // 判断表插入位置是否合理
        return false;
    
    if(index<=l->len)
    {
        for(int i=l->len;i>=index;i--)
        {
            l->elem[i]=l->elem[i-1];
        }
        l->len++; // 长度+1
        l->elem[index-1]=a; // 插入新元素
    }
    return true;
}

// 删除指定数据
bool DeleteData(SqList *l,int index)
{
    if(index<0 or index>l->len) // 判断表删除位置是否合理
        return false;
    for(int i=index-1;i<l->len-1;i++)
    {
        l->elem[i]=l->elem[i+1];
    }
    l->elem[l->len-1]=NULL; // 删除末尾元素
    l->len--;   // 长度-1
}

// 加载数据
void LoadSqList(SqList *l,int index)
{
    for(int i=0;i<index;i++)
    {
        l->elem[i]=i+1;
        l->len++;
    }
}

int main(void)
{
    SqList list;
    IniSqList(&list);
    LoadSqList(&list,7);
    ShowSqList(&list);
    printf("\n");
    // InsertData(&list,1,9);
    DeleteData(&list,1);
    ShowSqList(&list);

    getchar();
    return 0;
}

实现效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meaauf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值