线性表之顺序存储

线性表:零个或者多个元素的有序队列
从定义里我们就可以看出,线性表是一个序列,就代表他们之间是有顺序的。
就像幼儿园小朋友放学回家,手搭手站成一列一样,每个小朋友的前后都会有一个小朋友,除了最后一个小朋友(他前面有小朋友,后面没有小朋友)和第一个小朋友(他前面没有小朋友,后面有小朋友)
在数据结构中我们把这种关系叫做直接前驱和直接后继,线性表中第一个元素没有直接前驱,最后一个元素没有直接后继,其余的都是一对一的关系。
根据存储结构,我们把线性表分为两类

  1. 顺序存储
  2. 链式存储
    今天我们就来讨论一下线性表的顺序存储
    何为顺序存储?
    通俗的来讲,就是在内存中开辟连续的地址单元,说起来连续的地址单元,首先我们想到的就是数组,所以我们就可以利用数组来实现顺序链表的实现。
#define MAXSIZE 100
typedef int ElemType;//为了方便以后修改数据
typedef struct
{
    ElemType data[MAXSIZE];
    int length;//用来记录链表的长度
} SqList;

上面就是链表顺序存储的结构代码
有了结构代码,我们就可以写出单链表的各种操作了
单链表的创建

SqList creat(SqList list)
{
    list.length=-1;//链表的初始化
    int a;
    scanf("%d",&a);
    while(a!=-1&&list.length<=MAXSIZE-1)//当a为-1的时候结束链表的输入
    {
        list.length++;
        list.data[list.length]=a;
        scanf("%d",&a);
    }
    return list;
}

在单链表的某一位置插入值

SqList Insert(SqList list,int i,ElemType x)//i为插入的位置,x为插入的元素
{
    if(list.length>=MAXSIZE-1)
        printf("链表已经满了\n");
    if(i<0)
        printf("元素插入的位置不对\n");
    for(int n=list.length; n>=i-1; n--)
    {
        list.data[n+1]=list.data[n];
    }
    list.data[i-1]=x;
    list.length++;
    return list;
}

删除单链表某一位置的值

SqList Delet(SqList list,int n)//n为删除的位置
{
    if(n<0||n>=MAXSIZE)
        printf("删除的位置不对");
    for(int i=n-1; i<=list.length; i++)
    {
        list.data[i]=list.data[i+1];
    }
    list.length--;//删除了一个所以要减一
    return list;
}

得到单链表某一位置的值

int GetElem(SqList list,int position)//在这里要注意,顺序表中位置和下标的关系,因为数组是从0开始存的,而位置是从1开始的,所以位置=下标+1
{
    return list.data[position-1];
}

--------------------------------------------------------------------
下面给出完整代码

#include<stdio.h>
#define MAXSIZE 100
typedef int ElemType;//为了方便以后修改数据
typedef struct
{
    ElemType data[MAXSIZE];
    int length;//用来记录链表的长度
} SqList;
SqList creat(SqList list);//链表的新建
SqList Insert(SqList list,int i,ElemType x);//插入操作
SqList Delet(SqList list,int n);//删除操作
int GetElem(SqList list,int position);//查找操作
void print(SqList list);
int main()
{
    SqList listA;
    listA=creat(listA);
    print(listA);
    listA=Insert(listA,1,9);
    print(listA);
    listA=Delet(listA,5);
    print(listA);
}
SqList creat(SqList list)
{
    list.length=-1;//链表的初始化
    int a;
    scanf("%d",&a);
    while(a!=-1&&list.length<=MAXSIZE-1)//当a为-1的时候结束链表的输入
    {
        list.length++;
        list.data[list.length]=a;
        scanf("%d",&a);
    }
    return list;
}
SqList Insert(SqList list,int i,ElemType x)//i为插入的位置,x为插入的元素
{
    if(list.length>=MAXSIZE-1)
        printf("链表已经满了\n");
    if(i<0)
        printf("元素插入的位置不对\n");
    for(int n=list.length; n>=i-1; n--)
    {
        list.data[n+1]=list.data[n];
    }
    list.data[i-1]=x;
    list.length++;
    return list;
}
SqList Delet(SqList list,int n)//n为删除的位置
{
    if(n<0||n>=MAXSIZE)
        printf("删除的位置不对");
    for(int i=n-1; i<=list.length; i++)
    {
        list.data[i]=list.data[i+1];
    }
    list.length--;//删除了一个所以要减一
    return list;
}
int GetElem(SqList list,int position)//在这里要注意,顺序表中位置和下标的关系,因为数组是从0开始存的,而位置是从1开始的,所以位置=下标+1
{
    return list.data[position-1];
}
void print(SqList list)
{
    for(int i=0; i<=list.length; i++)
        printf("%d ",list.data[i]);
    printf("\n");
}

博主是一个小萌新,也许会有错误的地方和不完善的地方,写博客就是为了和大家交流,如果有不对的地方请大家指正!随时和博主交流!

posted @ 2020-11-13 20:36  莫恼卿卿  阅读(347)  评论(0)    收藏  举报