复习数据结构的第一天(线性表)

本文介绍了顺序表在C语言中的基本概念,包括顺序存储的定义、操作方法(插入、删除和查找)以及它们的时间复杂度分析。作者强调了理解顺序表结构和算法实现的重要性,同时提供了完整的代码示例。
摘要由CSDN通过智能技术生成

最近考研也是准备到专业课的内容上了,不过因为本人基础较差,大学期间也并没有深入的去了解编程,就把自己当小白一样去学习吧。顺便打卡记录一下,话不多说,直接上成果。

第一章 线性表

首先线性表的概念很简单,是具有相同特性元素的一个有限序列,线性表的存储结构分为顺序存储和链式存储两种。今天要学习的就是顺序存储,也就是简单的顺序表了。

顺序表的概念

很简单,就是把元素一个一个按照顺序依次存储在计算机的内存中。通俗来讲,可以把我们的计算机看作是还未装修的酒店,这时候有几对小情侣(我们需要存储的数据)要住进来,所以我们得先在酒店里装修几个大小相同的房间,大家都知道这一般的酒店房间呢都是挨着排列的,也是为了更好的去安排这些情侣入住,最后让他们开心一下。

这种结构最大的好处就是能够实现随机访问,并且占用连续的存储空间。

顺序表的定义

还是回到刚才那个例子,现在的酒店还是没有装修前的样子,要想让小情侣入住肯定得先装修几个非常good的房间了,因为酒店空间有限,我们需要先考虑一下建设的房间数。

#define Maxsize 10        //酒店一共有多少个房间

为了定义这些房间我们就称它为data(当然每个人想要的房间可能不一样,你也可以取其他名字),房间的编号就简单的称为 i 吧。这样我们就简单的定义了一个酒店房间,因为我们每个房间都是一样的,为了方便管理房间的入住,就用结构体这个东西来封装。

typedef struct room{    //定义每个房间
    int data[Maxsize];
    int length;
}room;

现在好了,房间的结构是修好了,但是我需要记录每个房间是不是已经入住了,一开始,肯定是空空如也的了。所以我们需要记录一下,就用length表示已经入住小情侣的房间。

void initsize(room *L)            //所有房间一开始没住人都是空的
{
    for(int i=0;i<Maxsize;i++)
    {
        L->data[i]=0;
    }
    L->length=0;
}

顺序表的插入和删除

好了,万事俱备,只欠东风,静静等待小情侣过来入驻。

int insert(room *L,int i,int e)
{
    if(i<0||i>L->length)                       //如果酒店房间爆满或者小情侣数量为负
    {
        return -1;                             //不好意思,谢绝入住
    }
    for(int j=L->length;j>=i;j--)
    {
        L->data[j+1] = L->data[j];
    }
    L->data[j] = e;                            //安排房间让小情侣入住
    (L->length)++;                             //情侣入住数量加1
    return 1;
}

 在快乐完之后,小情侣发生了一些口角,可能是女方发现男方不行吧,生气地嚷嚷要退房,这时男方极力挽留依然不起作用,只能流下伤心的泪水!!

这时作为管理者的我们能做到的也只有将他们离开的消息记录下来,毕竟这码子事不归咱管。为此,只能极力建议广大男同胞们感到不行的时候,一定记住菜就多练

int delete(room *L,int i)
{
    if(i<0||i>L->length||L->length==0)        //不合法输入
    {
        return -1;
    }
    for(int j=i;j<L->length;j--)               //后面的房间编号进行重排
    {
        L->data[j]=L->data[j+1];
    }
    (L->length)--;                            //情侣入住房间减1
    return 1;
}

 顺序表的查找

有时候呢,情侣可能临时办一点事需要出去一下但是呢回来不记得房间在哪了,只知道房间号,这时我们需要帮他们查找一下。

int findbyorder(room *L,int i)
{
    return L->data[i];
}

有时候呢,有些人不太检点,遇到正宫来抓🗡,来找的人只知道情侣名字不知道房间编号,我们为了真诚的爱情呢也会帮忙一下。

int findbydata(room *L,int data)
{
    for(int i=0;i<L->length;i++)
    {
        if(L->data[i]==data)
        {
            return i;
        }
    }
    return -1;
}

小结

这一天学会了顺序表的增删查改,关于这方面的时间复杂度,其实也很好算,插入的话最好时间复杂度就是在末尾插入,不需要移动后面元素,此时时间复杂度为O(1),最差时间复杂度就是在头部插入,此时时间复杂度为O(n),平均复杂度就不多赘述,计算过程也很简单,最后也是O(n)。删除的话跟插入差不多,这些时间复杂度都一样。按索引查找时间复杂度为O(1),按值查找为O(n)。

但是个人觉得这一章只是简单的基础,不必太去关注这些时间复杂度,我们更应该去关注的还是理解顺序表本身的结构以及算法实现过程。最后展示完整代码:

#include <stdio.h>
#define Maxsize 10

typedef struct{
    int data[Maxsize];
    int length;
}sqlist;
void initsize(sqlist *L)
{
    int i;
    for(i=0;i<Maxsize;i++)
    {
        L->data[i]=0;
    }
    L->length=0;
}
int insert(sqlist *L,int i,int data)
{
    if(i>L->length||i<0||L->length==Maxsize)//判断是否是合法输入
    {
        return -1;
    }
    int j;
    for(j=L->length-1;j>=i;j--)
    {
        L->data[j+1]=L->data[j];
    }
    L->data[i]=data;
    L->length++;
    return 1;
}
int delete(sqlist *L,int i)
{
    if(i>L->length||i<0||L->length==0)
    {
        return -1;
    }
    int j;
    for(j=i;j<L->length;j++)
    {
        L->data[j]=L->data[j+1];
    }
    L->length--;
    return 1;
}
int main()
{
    sqlist L;
    initsize(&L);
    insert(&L,0,1);
    insert(&L,1,2);
    printf("表里的内容是:\n");
    for(int i=0;i<L.length;i++)
    {
        printf("%d\n",L.data[i]);
    }
    printf("删除后的表:\n");
    delete(&L,0);
    for(i=0;i<L.length;i++)
    {
        printf("%d\n",L.data[i]);
    }
    return 0;
}

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值