知识点1 线性表
1 线性表的逻辑关系
线性逻辑结构,也称为线性表。线性表中的所有元素之间满足一对一的线性逻辑关系,具体如下
-
线性表中的起始元素有且仅有一个,该数据元素没有直接前驱,有且仅有一个直接后继。
-
线性表中的末尾元素有且仅有一个,该数据元素没有直接后继,有且仅有一个直接前驱。
-
线性表中的中间元素有且仅有一个直接前驱和直接后继。
2 线性表的定义
3 线性表的存储结构
线性表中的数据元素在内存中存储方式包含两种存储方式:
-
顺序存储结构:
所谓的顺序存储结构,指的是在内存中开辟连续存储空间,并将线性表中的元素按照存储位置序号连续存储。此时所构成的线性表称为顺序表。
类似于C语言程序中的数组,不同于数组的时候,需要保证元素连续存储。
-
链式存储结构:
所谓的链式存储结构,指的是采用非连续存储空间存储线性表中的所有数据元素,其中每一个数据元素需要存储当前元素的数据内容和后继数据元素存储空间的地址。可以通过数据元素存储空间的地址表示数据元素的逻辑关系。此时所构成的线性表称为链表。
类似于C语言中指针管理非连续内存块。
知识点2 顺序表
1 顺序表的基础操作
所谓的顺序表指的是线性逻辑结构的顺序存储。
1.1 构建顺序表的数据类型
/* 抽象数据类型的定义:需要存储数据元素的各个字段数据类型抽象并封装为整体
* 数据类型由实际需要存储数据元素进行类型的定义
*/
#if 1
/* 需要存储数据元素为学生信息,数据元素类型的定义 */
typedef struct Stu {
int id;
char name[32];
int score;
} data_t; /* 抽象数据类型名为data_t */
#else
/* 需要存储数据元素为int整型数据 *
typedef int data_t;
#endif
#define NUM 10
/* 顺序表存储空间的定义 */
typedef struct sqlist {
data_t data[NUM]; /* 连续存储空间的定义:使用数组表示 */
int last; /* 存储最后一个元素存储空间序号,默认为顺序表从起始元素序号0开始存储 */
} sqlist_t;
1.2 创建顺序表
/* 创建顺序表:
* 实质是开辟顺序表存储空间
* 1) 全局变量形式开辟,此时存储空间的生命周期为整个程序执行周期,存在空间利用率较低;
* 2) 局部变量形式开辟,此时存储空间的生命周期为函数调用周期,不能在其它函数中访问;
* 3) 动态管理,在需要使用的时候开辟空间,不需要的时候手动释放。
*/
sqlist_t *CreateSqList(void)
{
sqlist_t *list;
/* 动态开辟顺序表存储空间 */
list = malloc(sizeof(sqlist_t));
if (list == NULL)
return NULL;
/* 初始化顺序表存储空间元素 */
memset(list, 0, sizeof(sqlist_t)); /* 顺序表连续存储空间清零:将list起始地址开始的sizeof(sqlist_t)字节数据填充为数值0 */
list->last = -1; /* 置空表:末尾元素序号为默认起始元素序号(0)-1 */
return list; /* 返回顺序存储空间地址 */
}
1.3 顺序表遍历
所谓的顺序表的遍历,指的是从起始元素开始,依次顺序将顺序表中的所有数据元素访问且仅访问一次。
void DisplaySqList(sqlist_t *list)