#define MAXSIZE 100 //最大长度,即该顺序表最长有100个元素
typedef struct
{
ElemType *elem; //指向数据元素的基地址(理解为顺序表的开头)
int length; //线性表的当前长度
}SqList; //顺序表的名称
L.elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
一些常见的问题
1. 为什么需要 ElemType *elem;
?
(1) 顺序表的本质是动态数组
顺序表的核心特点是 用一段连续的物理内存存储数据,类似于数组。但普通数组(如 ElemType elem[100];
)的大小是固定的,而顺序表通常需要 动态调整容量(例如 malloc
动态分配内存),因此必须使用 指针 来管理这块内存。
(2) ElemType *elem;
的作用
-
elem
是一个指针,指向顺序表存储数据的 首地址(即动态数组的开头)。 - 通过
elem
,可以访问顺序表中的所有元素(如elem[0]
、elem[1]
等)。 - 由于顺序表的长度可能变化(
length
),而最大容量固定(MAXSIZE
),elem
指向的内存空间是动态分配的,而非静态数组。
2. L.elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
解析
-
sizeof(ElemType)
:计算单个元素的大小(如int
占 4 字节)。 -
MAXSIZE
:顺序表的最大容量(如 100)。 -
malloc
:分配MAXSIZE * sizeof(ElemType)
字节的内存块。 -
(ElemType*)
:强制转换为ElemType*
类型,因为malloc
返回void*
。 -
L.elem
:将分配的内存首地址赋给elem
,此时elem
指向一块连续的、可存储MAXSIZE
个ElemType
元素的内存。
一个例子:图书管理系统
#define MAXSIZE 10000 //图书表可能达到的最大长度
//图书信息定义
typedef struct
{
char no[20]; //图书ID
char name[50]; //图书名字
float price; //图书价格
}Book;
//图书表
typedef struct
{
Book *elem; //存储空间的基地址
int length; //图书表中当前的图书个数
}SqList;