最近考研也是准备到专业课的内容上了,不过因为本人基础较差,大学期间也并没有深入的去了解编程,就把自己当小白一样去学习吧。顺便打卡记录一下,话不多说,直接上成果。
第一章 线性表
首先线性表的概念很简单,是具有相同特性元素的一个有限序列,线性表的存储结构分为顺序存储和链式存储两种。今天要学习的就是顺序存储,也就是简单的顺序表了。
顺序表的概念
很简单,就是把元素一个一个按照顺序依次存储在计算机的内存中。通俗来讲,可以把我们的计算机看作是还未装修的酒店,这时候有几对小情侣(我们需要存储的数据)要住进来,所以我们得先在酒店里装修几个大小相同的房间,大家都知道这一般的酒店房间呢都是挨着排列的,也是为了更好的去安排这些情侣入住,最后让他们开心一下。
这种结构最大的好处就是能够实现随机访问,并且占用连续的存储空间。
顺序表的定义
还是回到刚才那个例子,现在的酒店还是没有装修前的样子,要想让小情侣入住肯定得先装修几个非常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;
}