线性表的定义和基本操作
学习目标:
- 线性表
- 定义
- 基本操作
1. 线性表的定义
线性表是具有相同的数据类型的n个元素的有限序列,其中n为表长,当n=9时线性表是一个空表
直接前驱
直接后继
2. 先行表的基本操作
基本操作
1、initList(&L);
2、DestoryList(&L)
3. ListInsert(&L, i, e)
4. ListDelete(&L, i, &e)
5. LocateElem(L, e)
6. GetElem(L, e)
其他操作
- Length(L)
- PrintList(L)
- Empty(L)
线性表存储/物理结构
- 线性表
- 存储/物理结构
- 顺序表
· 定义 及 代码实现
· 基本操作实现 - 链表
- 顺序表
- 存储/物理结构
顺序表定义
顺序表——用顺序存储的方式实现线性表的顺序存储
顺序表的实现方式——静态分配
静态分配的局限性较大,以为之前已经分配了内存,因此可能出现内存不够用的情况,建议直接放弃治疗
上代码
#include <stdio.h>
#define MaxSize 10
#define ElemType int
typedef struct SqList {
ElemType data[MaxSize];
int length;
} SqList;
SqList initList(SqList l);
int main() {
SqList L;
L = initList(L);
return 0;
}
/**
* 初始化线性表
* @param l
* @return
*/
SqList initList(SqList l) {
for (int i = 0; i < MaxSize; ++i) {
l.data[i] = 0; // 覆盖系统分配内存中的脏数据
}
l.length = 0; // 顺序表的初始长度为0
return l;
}
顺序表的实现方式——动态分配
key: 动态申请和释放内存空间
C —— malloc free 函数
L.data = (Element *) malloc (sizeof(ElemType) * initSize);’
#include <stdlib.h>
#define InitSize 10 // 顺序表的初始长度为10
typedef struct {
int *Data;
int MaxSize;
int length;
} SqListDongTai;
SqListDongTai InitList(SqListDongTai L);
SqListDongTai IncreaseSize(SqListDongTai l, int i);
int main() {
SqListDongTai L;
L = InitList(L);
// 往顺序表中加入几个元素 之后发现预留的内存空间不够,于是增大动态空间
L = IncreaseSize(L, 5);
return 0;
}
SqListDongTai IncreaseSize(SqListDongTai l, int i) {
int *p = l.Data;
l.Data = (int *) malloc((l.MaxSize + i) * sizeof (int));
for (int j = 0; j < l.length; ++j) {
l.Data[j] = p[j]; //经原来的数据复制到新的数据空间
}
l.MaxSize = l.MaxSize + i;
free(p);
return l;
}
/**
* 初始化动态数组
* @param L
* @return
*/
SqListDongTai InitList(SqListDongTai L) {
L.Data = (int *) malloc(InitSize * sizeof(int));
L.length = 0;
return L;
}
总结一下
顺序表的特点
- 随机访问,即可以子啊O(1)的时间内找到第i个元素
- 存储密度高,每个节点都只存储数据元素
- 拓展容量很不方便
- 插入、删除操作很不方便