顺序表:顺序表 (SqList, Sequence List),即顺序线性表。
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。
/* [Daily Coding] Fall in love coding! */
// 顺序表的初始化
#include"stdio.h"
#include"malloc.h" // malloc
#include"stdlib.h" // exit
#define List_InitSize 100
#define List_Increment 10
typedef struct{
int *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(int)为单位)
}SqList;
// 【A段代码】调用示例:SqList* L = Init_SqList01();
SqList* Init_SqList01()
{
SqList* L = (SqList*)malloc(sizeof(SqList));
L->elem = (int*)malloc(List_InitSize * sizeof(int));
L->length = 0;
L->listsize = List_InitSize;
return L;
}
// 【B段代码】调用示例:SqList L = Init_SqList02();
SqList Init_SqList02()
{
SqList L;
L.elem = (int*)malloc(List_InitSize * sizeof(int));
L.length = 0;
L.listsize = List_InitSize;
return L;
}
// 【C段代码】调用示例:
// SqList l;
// Init_SqList03(&l);
void Init_SqList03(SqList *L)
{
L->elem = (int*)malloc(List_InitSize * sizeof(int));
if (!L->elem)
{
exit(-2);
}
L->length = 0;
L->listsize = List_InitSize;
}
/*
// 有return语句和没有return语句的区别,你能看得出来吗?
int Init_SqLite03_ret(SqList *L)
{
L->elem = (int*)malloc(List_InitSize * sizeof(int));
if (!L->elem)
{
exit(-2);
}
L->length = 0;
L->listsize = List_InitSize;
return 0;
}
*/
// 【D段代码】调用示例:
// SqList l;
// Init_SqList04(&l);
void Init_SqList04(SqList *L)
{
(*L).elem = (int*)malloc(List_InitSize * sizeof(int));
if (!(*L).elem)
{
exit(-2);
}
(*L).length = 0;
(*L).listsize = List_InitSize;
}
void DestroyList(SqList *L)
{
free(L->elem); // free((*L).elem);
L->elem = NULL; // (*L).elem = NULL; // 置空防止野指针
L->length = 0; // (*L).length = 0;
L->listsize = 0; // (*L).listsize = 0;
}
int main()
{
SqList* La = Init_SqList01(); // 操作符为 "->"
SqList Lb = Init_SqList02(); // 操作符为 "."
SqList Lc; // 操作符为 "."
Init_SqList03(&Lc);
SqList Lc_ret; // 操作符为 "."
Init_SqList03(&Lc_ret);
SqList Ld; // 操作符为 "."
Init_SqList04(&Ld);
printf("La.length=%d, La.listsize=%d\n", La->length, La->listsize);
printf("Lb.length=%d, Lb.listsize=%d\n", Lb.length, Lb.listsize);
printf("Lc.length=%d, Lc.listsize=%d\n", Lc.length, Lc.listsize);
/*
printf("\n");
printf("Lc_ret.length=%d, Lc_ret.listsize=%d\n", Lc_ret.length, Lc_ret.listsize);
printf("\n");
*/
printf("Ld.length=%d, Ld.listsize=%d\n", Ld.length, Ld.listsize);
// 测试 - 销毁函数
DestroyList(La);
printf("La.length=%d, La.listsize=%d\n", La->length, La->listsize);
return 0;
}
代码解读
- A段代码,
SqList* Init_SqList01()
, 有返回值,且返回的为指针。所以直接调用的时候,用的是箭头符号->
,建议大家直接这样记:指针类型用箭头。- B段代码,
SqList Init_SqList02()
, 有返回值,且返回的不是指针。所以直接调用的时候,用的是.
- C段代码,
void Init_SqList03(SqList *L)
, 没有返回值,需要传入参数,且传入的是一个地址。用该函数处理完后,即可直接使用传入的变量。- D段代码,
void Init_SqList04(SqList *L)
, 没有返回值,需要传入参数,与C段代码不同在于,实现的时候,绕了个弯(由L->elem
变为了(*L).elem
)。
- 销毁函数,
void DestroyList(SqList *L)
,malloc
对应的是free
,传入参数-待销毁顺序表的指针
,其他操作表示还原初始状态。
注:
初稿完成时间:2023年01月31日
预估有效期限:forever
(水平有限,欢迎评论补充、沟通探讨^_^,progress together。)
-完-