顺序表(一直都不知道还有这玩意?)
所以以下是来自百度百科:
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中
其实我也不太懂,直到后来自己实现了一下这个结构,这貌似就是个容器的作用?相当于c++的vetcor?
我个人理解是,相当于咱们的钱包
如果有大佬进来的,明白的就用一个形象化的语言来描述一下作用…
他是个线性结构,其实也就是体现逻辑结构的动态数组之类的吧
下面来实现一下吧:
首先是顺序表的结构体封装:
包括了一个字符串数组,数组大小,顺序表大小:
struct linerlist {
char* element;
int arrlen;
int size;
};
创建并初始化顺序表:
struct linerlist* createlist(int capacity) {
if (capacity < 1) {
printf("创建顺序表失败");
return NULL;
}//安全性考虑
struct linerlist* list = (struct linerlist*)malloc(sizeof(struct linerlist));
list->arrlen = capacity;
list->element = (char*)malloc(sizeof(sizeof(list->arrlen)));
list->size = 0;
return list;
}
接下来就是实现插入,但是你想哈,插入元素多了,我们数组是不是就不够用了,我们是不是就得扩容,所以我们要实现的第一个函数是数组扩大,我们很轻松的想到一个函数realloc重设数组大小:
void changearray1D(char** array, int oldlen, int newlen) {//需要传数组指针
if (newlen < 0) {
printf("扩容失败");
return;
}//安全性考虑
int lenth = oldlen > newlen ? oldlen:newlen;
*array = realloc(*array, lenth * sizeof(char));
return;
}
那么我来画个图来看一下这个插入:
它是得把索引位置要往后移动的,所以我们用一个函数来实现一下这个移动方便调用:
void copyarrtail(char* array,int arrsize, int index) {
for (int i = arrsize; i > index; i--) {
array[i] = array[i - 1];
}
}
接下来是插入的函数:
void insertelement(struct linerlist* list, int theindex, char element) {
if (theindex<0 || theindex> list->arrlen) {
printf("索引无效");
}
if (list->size == list->arrlen) {
//顺序表大于数组长度
changearray1D(&list->element, list->arrlen, 2 * list->arrlen);
list->arrlen = list->arrlen * 2;
}
//存储,把当前索引下的元素移到后面去
copyarrtail(list->element, list->size, theindex);
list->element[theindex]=element;
list->size++;
}
接下来是删除元素的函数:画个图:
嘛,画的难看了,将就看吧,也就是在index后面的元素覆盖前面的一个元素,然后缩小size,实现伪删除就可以了
函数体:
void copyfrontnum(char* array, int arraynum, int index) {
for (int i = index; i < arraynum; i++) {
array[i] = array[i + 1];
}
}//跟上面的是一样的,写个覆盖的函数实现一下
void deleeteelement(struct linerlist* list, int index) {
if (index < 0 || index >= list->size) {
printf("无效索引\n");
return;
}//安全性考虑
copyfrontnum(list->element, list->size, index);
list->size--;
}
下面是主函数来检验一下我们写的是否成功
void print(struct linerlist* list) {
for (int i = 0; i < list->size; i++) {
printf("%c\t", list->element[i]);
}
printf("\n");
}
int main() {
struct linerlist* newlist = createlist(2);
insertelement(newlist, 0, 'a');
print(newlist);
insertelement(newlist, 1, 'b');
print(newlist);
insertelement(newlist, 2, 'c');
print(newlist);
deleeteelement(newlist, 1);
print(newlist);
}
输出结果:
好了,顺序表就到这里了,我就暂且理解为一个容器就可以了。。。
我真菜啊…