嵌入式团队培训_线性结构
一、线性表
定义:零个或多个数据元素的有限序列
要求:第一个元素无前驱,最后一个元素无后继,其他元素都有且只有一个前驱和后继。
思考:循环链表?双向链表?
线性表的抽象数据类型ADT(书p45),其代码表示:
在list.h头文件中
#include <stdio.h>
//定义线性表长度大小
#define MAXSIZE 100
//增强代码可读性
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
/**
* 线性表的声明
*/
typedef struct list {
//数据元素
ElemType data[MAXSIZE];
//线性表的长度
int length;
}SqList;
//线性表CRUD功能声明
void initList(SqList* L); /*1.初始化一个空的线性表L*/
Status isEmpty(SqList L); /*2.判断线性表是否为空,空返回true*/
void clearList(SqList* L); /*3.清空线性表*/
int listLength(SqList L); /*4.返回线性表L的长度即元素个数*/
void getElem(SqList L,int i,ElemType* e); /*5.将线性表L中第i个位置元素值返回给e*/
int locateElem(SqList L,ElemType* e); /*6.将线性表L中元素值为e的,查找成功返回第i,否则返回0*/
Status listInsert(SqList* L,int i,ElemType e); /*7.在线性表L中第i个位置插入元素e,成功返回true*/
Status listDelete(SqList* L,int i,ElemType* e); /*8.在线性表L删除第i个位置的元素,并将其值返回给e,成功返回true*/
1、顺序存储
定义:用一段连续的地址存储单元依次存储线性表的数据元素。
要求:数据元素类型相同。
所以我们可以用一维数组来实现顺序存储结构。
第i个数据元素ai的存储位置:LOC(ai) = LOC(a1)+(i - 1)* c (c为每个数据元素占据的存储单元)
#define MAXSIZE 100 /*初始化空间分类量(内存分配)*/
//增强代码可读性
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
/**
* 线性表的声明
*/
typedef struct list {
//数据元素
ElemType data[MAXSIZE];
//线性表的长度
int length;
}SqList;
由于查找,修改操作过于简单,我们主要讲插入删除操作
首先分清这三个概念
下标:从0开始,例如a0,a1
第i个:从1开始,例如第一个元素(a0),第n个元素(an-1)
线性表长度L->length:数据元素的个数 n
/**
* 插入条件:线性表L已经存在,且1 <= i <= listLength(L)
* 操作:在线性表L中第i个位置之前插入元素e
* @param L 线性表L
* @param i 位置坐标
* @param e 插入元素
* @return 状态值
*/
Status listInsert(SqList* L,int i,ElemType e) {
//1.算法的健壮性
if (L->length == MAXSIZE) {
/*线性表已经满了*/
return ERROR;
}
/*或者if (listLength(*L) == MAXSIZE) {
return ERROR;
}*/
if (i < 1 || i > L->length + 1) {
/*i不在插入的范围内*/
return ERROR;
}
if (i <= L->length) {
/*此时i满足条件,并且不是在表尾进行插入*/
//将第i个位置后面的元素,依次后移才有位置进行插入
for (int k = L->length - 1; k >= i - 1; k++) {
L->data[k + 1] = L->data[k];
}
}
L->data[i - 1] = e; /*将新元素插入*/
L->length++;