数据结构中有一种结构叫顺序结构,这种结构的数据在内存中是连续的。
其实这种结构就是数组。我们都知道,当你创建一个数组的时候,那么计算机就会在内存中开辟一个连续的空间。比如,int a[5]
,那么计算机就会在内存中开辟一个5个连续的空间用来存储数据。
数组的特点就是长度固定,可以通过索性快速搜索。但是数组也有缺点,比如我们定义的数组长度为5,那么我们就无法为他添加第6个数据,所以为了解决这个问题,我们要重新开辟一个具有6个长度的数组。所以我们需要对数组重新封装,封装出一个功能强大的数组,而这个强大的数组就是我们要学习的顺序表。
既然是数据结构,那么肯定是要定义结构体的。那么第一点就是如何定义出需要的结构体。首先我们先定义一个最简单的数组,比如:int arr[5]
,那这个就定义了一个数组。其次我们如何知道数组中元素的个数呢?我们在添加一个size变量即可,默认的时候size为0,每添加一个元素就执行size++,删除一个元素就执行size–。这样我们就定义出结构体了。
typedef struct {
int array[5];
int length;
} SeqList;
为了让这个结构体的可读性更好,我们把数字提取出来,作为全局常量来使用。
const int CAPACITY = 5; //CAPACITY是容量的意思
typedef struct {
int array[CAPACITY];
int length;
} SeqList;
定义好了结构体,我们就需要使用结构体了,首先我们需要声明这个结构体变量
SeqList list;
1. 初始化这个结构体init()
当我们声明SeqList的时候,编译器已经为list和length分配内存空间了,但是此时里面都是垃圾值,而list我们后面会通过操作把里面的值替换掉,所以不用初始化它,故我们只需要把这个length设为0即可。
void init(SeqList * list) {
list-> length = 0;
}
2. 判断顺序表是否为空isEmpty()
顺序表是否为空的标识是顺序的长度是否为0即可。返回布尔值,等于0为true,等于1为false。由于返回的是的布尔值,而c语言中没有bool类型,以及关键词true和false,所以我们需要自己定义。
#define true 1
#define false 0
typedef int bool;
bool isEmpty(SeqList * list) {
return list->length == 0;
}
3. 判断线性表是否已满isFull()
判断顺序表是否为满,只需要判断顺序表长度是否等于顺序表的容量
bool isFull(SeqList * list) {
return list->length == CAPACITY;
}
4. 获得元素get()
获得某个元素只需要使用数组下标即可
int get(SeqList * list, int index) {
return list->array[index];
}
如果要快速获得第一个或者最后一个元素,我们可以在添加以下两个方法
//获得第一个元素
int getFirst(SeqList * list) {
return list->array[0];
}
//获得最后一个元素
int getLast(SeqList * list) {
return list->array[list->length-1];
}
5.查找元素的下标
有时候我们需要根据元素来查找下标,如果找到则返回响应的下标,否则返回-1。
查找算法只需要从第一个元素开始,依次与e进行比较。
int locateElem(SeqList * list, int e) {
for(int i=0; i<list->length; i++) {
if(list->array[i] == e) {
return i;
}
}
return -1;
}
6. 插入元素
插入操作就是在顺序表的第index位置插入新的元素e。
在第index位置插入元素e,只需要把从第i个元素依次往后移动一个位置,然后把元素e赋值给第index位置的元素。移动元素时,先移动最后一个元素,再移动倒数第二个元素,以此类推。
例如有一个顺序表,[6,2,3,1]
如果我们要在第1