线性结构
线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一一个被称作“第一个”的数据元素;(2)存在唯一一个被称作“最后一个”的数据元素;(3)除第一个之外,集合中的每个元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。
线性表
线性表是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限序列。线性表中元素的个数n(n≥0)定义为线性表的长度,n=0时称为空表。
线性表是一个相当灵活的数据结构,它的长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可以进行插入和删除等。
线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
global.h
#ifndef GLOBAL_H
#define GLOBAL_H
#include<stdio.h>
#define OK 1 // 通过
#define ERROR 0 // 错误
#define OVERFLOW -2 // 堆栈上溢
typedef int Status; // 函数类型,其值为状态码
typedef int ElemType; // 抽象数据类型
#endif // !GLOBAL_H
存储结构
由于线性表的长度可变,且所需最大存储空间随问题不同而不同,在C语言中可用动态分配的一维数组,如下描述。
#define LIST_INIT_SIZE 10 // 线性表存储空间初始分配量
#define LISTINCREMRNT 10 // 线性表存储空间的分配增量
// 线性表的动态分配顺序存储结构
typedef struct SqList
{
ElemType* elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量
}SqList;
上述定义中,数组指针elem指示线性表的基地址,length指示线性表的当前长度。顺序表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表的当前长度设为“0”。listsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足时,可进行再分配,即增加一个大小为存储LISTINCREMRNT个数据元素的空间。
Status InitList_Sq(SqList* L)
{
// 构造一个空的线性表L
L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType))