线性表基础:
-
定义
线性表:指具有相同特征的一组数据元素的有限序列;其中数据元素之间的逻辑关系为线性结构。( a 1 , a 2 , a 3 , . . . a i − 1 , a i , a i + 1 , . . . , a n − 1 , a n ) (a_{1},a_{2},a_{3},...a_{i-1},a_{i},a_{i+1},...,a_{n-1},a_{n}) (a1,a2,a3,...ai−1,ai,ai+1,...,an−1,an)
如线性表 a a a 所示:
a i a_{i} ai 为数据元素,其中 i i i 为元素下标,指示了元素在线性表中的位置;
a 1 a_{1} a1 为线性表的起始结点, a n a_{n} an 为线性表的终端结点;
n n n 为线性表表长,当 n = 0 n = 0 n=0 时,线性表 a a a 为空表。#线性表中的数据元素允许是简单类型,也允许是复杂类型。
#同一线性表中的元素必然具有相同的特征。 -
线性表的逻辑特征
* 非空线性表中,只有一个开始结点 a 1 a_{1} a1 (其没有直接前驱,只有一个直接后继 a 2 a_{2} a2);
* 非空线性表中,只有一个终端结点 a n a_{n} an (其没有直接后继,只有一个直接前驱 a n − 1 a_{n-1} an−1);
* 非空线性表中,其余的内部结点 a i a_{i} ai 均有且只有一个直接前驱 a i − 1 a_{i-1} ai−1 和一个直接后继 a i + 1 a_{i+1} ai+1 ; -
线性表的抽象数据类型定义
/*线性表的抽象数据类型定义*/
ADT List{
数据对象:D = {a_i|a_i 属于 Elements, (i = 1,2,...,n;n>=0)};
数据关系:S = {<a_i-1,a_i>|a_i-1,a_i 属于 D, (i = 1,2,...,n;n>=0)};
基本操作:P
InitList(&L);
DestoryList(&L);
ListInsert(&L,i,e);
ListDelete(&L,i,&e);
...
}ADT List
以上的基本操作是基于线性表逻辑结构进行的运算(做什么),只关心运算的功能而非具体实现方式;具体的实现细节(怎么做)需要考虑线性表的存储结构:
* 线性表的顺序表示与实现;
* 线性表的链式表示与实现;
- C/C++操作补充
*typedef:将原有类型名转换为新类型名,语法如下
/*typedef 语法*/
//将char类型转换为ElemType类型
typedef char ElemType;
//构建Struct类型并转换为Polynomial类型
typedef struct{
float p;
int e;
}Polynomial;
* 数组定义:
a. 数组静态分配(数组形式)
/*数组内存空间的静态分配*/
#define Maxsize 1000
typedef struct{
ElemType data[Max_size]; //分配内存空间
int length; //定义线性表长度
}SqList;
* 在定义线性表时已完成内存空间的分配,故称为静态分配。
b. 数组动态分配(指针形式)
/*数组空间的动态分配*/
#include <stdlib.h>
#define Max_size 1000
typedef struct{
ElemType *data;
int length;
}SqList;
Sqlist L; //声明线性表L
L.data = (Elemtype*)malloc(sizeof(ElemType)*Max_size); //通过malloc()函数动态分配内存空间
* malloc(m):开辟m字节长度的连续地址空间并返回这段地址空间的首地址;
* free(p):释放指针p所指向的内存空间,通常与malloc()函数搭配使用;
* sizeof(x):计算变量x所占内存空间的字节数;
* C++的动态存储分配:
new 类型名T(参数列表)
功能:申请用于存放T类型对象的内存空间,并依照参数列表赋初值。
成功:T类型指针,指向新分配的内存;失败:NULL
delete 指针P
功能:释放指针P所指向的内存空间,P必须是new操作的返回值。