线性表的顺序存储结构

Posted kangna

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表的顺序存储结构相关的知识,希望对你有一定的参考价值。

首先让我们来认识顺序表

技术图片

在顺序存储结构中,以数据元素的长度为单位,所以每个元素之间的距离为L。
在顺序存储结构中,数据的存储位置和它们的物理位置一致,因此较为简单、自然
使用C语言描述顺序存储结构下的线性表代码如下:

    #define MAXSIZE 100  //线性表的最大长度
    typedef struct Linear_list
        {
            datatype elem[MAXSIZE];   //定义数组域
            int last;                //最后一个元素在表中的位置
        }SeqList;

需要注意的有以下问题

(1)数组的长度和线性表的长度不是一个概念。数组的长度是存放线性表的存储空间的长度,线性表的长度是线性表中数据元素的个数,它随着插入、删除等操作会发生变化,而数组的长度一开始就被定义且不可改变。
(2)线性表的当前长度:由于last表示最后一个元素1在表中的位置,而且元素是从0开始,所以当前长度为last+1。
(3)线性表的最大容量为一开始为线性表分配的MAXSIZE决定,后序不可更改。
(4)elem[]即用来存储数据的数组。

在C语言中,为了发挥指针的优势,我们可以定义一个指向SeqList类型的指针,即:

    SeqList *Lp;

Lp是一个指针变量,存储空间通过C Lp=(SeqList*)malloc(sizeof(SeqList)) 来获得。Lp是存放的顺序表的地址
技术图片

##顺序表的插入、删除、求表长等操作

1、在某一位置(如i)插入元素之后:

(1)将ai~an一直向下移动,为新元素让出位置
(2)将x置入空出的位置
(3)修改Last指针使其总指向最后一个元素
此处的逻辑关系应当很容易理解,博主在这里就不上流程图了
代码如下:

int  InsertList(SeqList *Lp,int i,datatype x)  //分别是表、插入的位置(在...之前)、插入的值
{
    int j;
    if(Lp->last==MAXSIZE)     //空间已满,无法继续存入元素了
        {
            printf("内存已满,无法继续存入");
            return(-1); 
        }
    if(i<1||i>Lp->last+2)
        {
            printf("位置错误,不能进行该操作哦"
);
            return(0);
        }
    for(j=Lp->last;j>=i-1;j--)
        {
            Lp->elem[j+1]=Lp->elem[j];   //往后移动
            Lp->elem[i-1]=x;            //插入元素
            Lp->last++;     //使Lp->last指向最后一个元素
            return(1);
}

2、删除某个元素
在删除线性表之后,长度为n线性表的长度会变为n-1;

(1)将ai+1~an顺序向上移动
(2)修改Lp-last指针,使其总指向最后一个元素
此处也比较简单,就不像后序非递归遍历二叉树那样上了流程图了,代码如下

int DeleteList(SeqList *Lp,int i)
{
    int j;
    if(i<1||i>Lp->last+1)   //判断输入数据的合法性
        {
            printf("不存在第%d个元素哦
",i);
            return 0;
        }
    for(j=i;j<=Lp->last,j++)
    Lp->elem[j-1]=Lp-elem[j];   //向上移动
    Lp->last--;
    return(1);
}

2、求表长
这里没什么好说的我们定义了Lp->last总指向最后一个元素,所以表长不言而喻了
技术图片

ex:创建一个递增顺序表并实现顺序表的基本功能
代码如下:

#include<stdio.h>
#define M 100    //数组长度
typedef int ElemType; 
typedef struct   //定义线性表
{
    ElemType list[M];
    int last;    //指向末尾的last元素 
}SeqList;
void InitList(SeqList *L) //创建空表 
{
    L->last=-1;  //初始化last元素 
}
void Scanflist(SeqList *L,int n) //输入递增的有序顺序表
{
    int i;
    for(i=0;i<n;i++)
    scanf("%d",&(L->list[i]));
    L->last=L->last+n;
}
int  LengthList(SeqList *L)
{
    int Len;  //初始化一个len值,用于记录列表长度
    Len=L->last+1;   //长度==last+1 last初始值为-1 
    return Len;
} 
int PositionList(SeqList *L,int x) //判断插入位置 
{
    int j;
    for(j=0;j<=L->last;j++)
        if(x<L->list[j]) //如果找到位置就返回地址
        return j+1;      //下标j表示j+1个元素,所以返回j+1 
    return(L->last+2); //插入位置合法,所以可以添加元素,所以线性表长度+1,即last+2 
}
int InsertList(SeqList *L,int i,int e)
{
    int k;
    if((i<1)||(i>L->last+2))
    {
        printf("您的输入有误");
        return 0;
    }
    if(L->last>=M-1)
    {
        printf("该表已满,无法再添加数据");
        return 0; 
    }
    for(k=L->last;k>=i-1;k--)
    
        L->list[k+1]=L->list[k];
        L->list[i-1]=e;
        L->last++;
        return(1);
    
 } 
int OutputList(SeqList *L)
{
    int i;
    printf("输出结果为:");
    for(i=0;i<=L->last;i++)
    printf("%d",L->list[i]);
    return(L->list[i]);
}
int main()
{
    int s,c;
    SeqList L;
    InitList(&L);
    printf("请输入顺序表长度:");
    scanf("%d",&s);
    printf("请输入递增顺序表:");
    Scanflist(&L,s);
    LengthList(&L);
    printf("表长为:%d
",LengthList(&L));
    printf("请输入要插入的元素:");
    scanf("%d",&c);
    InsertList(&L,PositionList(&L,c),c);
    OutputList(&L);
    printf("
");
}

技术图片

以上是关于线性表的顺序存储结构的主要内容,如果未能解决你的问题,请参考以下文章

线性表的链式存储(C代码实现)

线性表中的顺序存储与链式存储

Java数据结构(线性表)--线性表的顺序存储及其实现

线性表的顺序存储结构

2.2_线性表的顺序存储结构

线性表的链式存储结构 ( 链表 )