数据结构与算法(线性表_顺序表存储结构)

本文详细介绍了线性表的概念、基本操作及顺序存储结构的特点,并通过C语言实例展示了顺序表的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   ——C描述
    以前经常听说,C语言的灵魂是指针,那么再扩大的来说,什么是程序的灵魂呢?大神们默默的说了一声:数据结构与算法。从现在开始我踏入了数据结构与算法的世界,首先开始学最简单的数据结构——线性表。
    逻辑上来说,线性表就是由n(n≥0)个数据元素a1、a2···an组成的有限序列。
    对于线性表,有以下几点需要说明:
    --数据元素的个数为n,也称为表的长度,当n=0的时候为空表
    --数据元素ai(1≤i≤n)表示各个元素,不同的场合,其含义也不尽相同
    --如果一个线性表非空,也就是n>0,在可以记作(a1,a2···an)
    --线性表中的数据元素都是同种数据类型

    其实我每次提到线性表,我就会想到数组,但是数组要进行添加删除是不行的。
    对一个非空的线性表又有一下逻辑结构特征:
    --有且仅有一个开始结点a1,没有直接前趋结点,有且仅有一个直接后继结点a2
    --有且仅有一个结束结点an,没有直接后继结点,有且仅有一个直接前趋结点an-1
    --其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋结点ai-1和一个直接后继结点ai+1
    
    而线性表的基本操作:
    ADT 线性表(List)
    Operation
    InitList(*L): 初始化操作,建立一个空的线性表L。
    ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false。
    ClearList(*L): 将线性表清空。
    GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e。
    LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
    ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e。
    ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。
    ListLength(L): 返回线性表L的元素个数。
    endADT
 
    顺序表分为顺序存储结构和链式存储结构,线性表的顺序存储结构是指一段地址连续的存储单元依次存储线性表的数据元素。
    顺序存储结构封装需要三个属性:
    
存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置。
    线性表的最大存储容量:数组的长度MaxSize。
    线性表的当前长度:length。

    假设顺序表中每个数据元素占用的是c个存储单元(字节),那么线性表中第ai个数据元素的存储位置是(LOC表示获得存储位置的函数):LOC(ai) = LOC(ai)+(i-1)* c。ai代表顺序表的最一个数据元素,也就是整个顺序表的首地址,假设为2000,那么第i个数据元素的地址,就是2000+(i-1)*c。减一,是因为程序有时候要面向的并不只是程序员,平常的人基数都是从1开始,而我们程序员都是从0开始。再做个假设,有一个程序员跟他的女朋友说,我只爱你一个人,那么对他的女朋友来说,是只有一个,而对程序员来说,可以看作两个,为什么呢?因为程序员平时习惯基数都是从0开始的。

    顺序表存储结构与链式存储结构是有区别的,区别的地方呢····略
   
#include<stdio.h>
#include<stdlib.h>
#define MAX 100     //线性表最大限度
typedef int DataType;
typedef struct      //封装线性表元素结构
{
    DataType list[MAX];     //线性表数据
    int size;       //线性表长度(用户需求)
}XList;
void ListInitiate(XList *L)     //初始化线性表
{
    L->size = 0;
}
void Listprint(XList *L,int n)      //打印线性表
{
    int i;
    printf("顺序表所有数据元素如下:");
    for(i = 0;i < n;i++)
    {
        printf("%d ",L->list[i]);
    }
    printf("\n");
}
int Listadd(XList *L,int x,int i)       //插入数据
{
    int y;
    if(L->size == MAX)      //判断线性表是否已满
    {
        printf("顺序表已满!\n");
    }
    else if(i < 0 || i > L->size)   //判断插入位置是否正确
    {
        printf("插入位置有错误!\n");
    }
    else
    {
        for(y = L->size;y > i-1;y--)    //实现插入
        {
            L -> list[y] = L -> list[y-1];
        }
        L->list[i-1] = x;
        L->size++;
    }
    return 0;
}
int Listdel(XList *L,int x)     //删除数据
{
    int y;
    if(L->size <= 0)        //判断线性表是否为空
    {
        printf("顺序表已经没有可删的元素了!\n");
    }                                                
    else if(L->size-1 < x || x < 0)     //判断删除位置是否正确
    {
        printf("删除的位置有误!\n");
    }
    else
    {
        for(y = x;y <= L->size-1;y++)       //实现删除
        {
            L->list[y-1] = L->list[y];
        }
        L->size--;
    }
    return 0;
}
int Listrt(XList *L)        //返回线性表数据元素位置
{
    return L->size;
}
int ListSearch(XList *L,int x)      //实现查找
{
    int i = 0;
    for(;i < L->size;i++)
    {
        if(L->list[i] == x)
        {
            printf("找到,%d在第%d个位置\n",x,i+1);
            return 0;
        }
    }
    printf("没有找到该数据\n");
    return -1;
}
void ListClear(XList *L)
{
    int i;
    for(i = 0;i < L->size;i++)
    {
        L->list[i] = 0;
    }
    L->size = 0;
}
int main(void)
{
    XList La;
    int x;      //x插入/删除数据
    int n,i;        //n用户需要的线性表长度
    ListInitiate(&La);      //初始化线性表
    printf("请输入顺序表长度(最大为%d):",MAX);  //->线性表数据元素增加code
    scanf("%d",&n);
    La.size = n;
    printf("请输入线性表的元素:");
    for(i = 0;i < n;i++)
    {
        scanf("%d",&La.list[i]);
    }                       //线性表数据元素code<-
    
    Listprint(&La,n);
    
    printf("请输入要插入顺序表的数据元素(x)以及位置(i):");
    scanf("%d %d",&x,&i);
    Listadd(&La,x,i);
    
    Listprint(&La,La.size);
    
    printf("请输入要删除顺序表的数据元素结点(x):");
    scanf("%d",&x);
    Listdel(&La,x);
    Listprint(&La,La.size);
    printf("返回线性表数据元素的个数:%d\n",Listrt(&La));
    printf("请输入需要查找的数据元素:");
    scanf("%d",&x);
    ListSearch(&La,x);
    
    printf("清空顺序表操作中···\n");
    ListClear(&La);
    system("pause");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值