线性表基础:

  1. 定义
    线性表:指具有相同特征的一组数据元素的有限序列;其中数据元素之间的逻辑关系为线性结构

    (a1,a2,a3,...ai−1,ai,ai+1,...,an−1,an)(a_{1},a_{2},a_{3},...a_{i-1},a_{i},a_{i+1},...,a_{n-1},a_{n})(a1,a2,a3,...ai1,ai,ai+1,...,an1,an)

    如线性表 aaa 所示:
      aia_{i}ai 为数据元素,其中 iii 为元素下标,指示了元素在线性表中的位置;
      a1a_{1}a1 为线性表的起始结点,ana_{n}an 为线性表的终端结点;
      nnn 为线性表表长,当 n=0n = 0n=0 时,线性表 aaa 为空表。

    #线性表中的数据元素允许是简单类型,也允许是复杂类型。
    #同一线性表中的元素必然具有相同的特征。

  2. 线性表的逻辑特征
      * 非空线性表中,只有一个开始结点 a1a_{1}a1 (其没有直接前驱,只有一个直接后继 a2a_{2}a2);
      * 非空线性表中,只有一个终端结点 ana_{n}an (其没有直接后继,只有一个直接前驱an−1a_{n-1}an1);
      * 非空线性表中,其余的内部结点 aia_{i}ai 均有且只有一个直接前驱 ai−1a_{i-1}ai1 和一个直接后继 ai+1a_{i+1}ai+1

  3. 线性表的抽象数据类型定义

/*线性表的抽象数据类型定义*/
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

以上的基本操作是基于线性表逻辑结构进行的运算(做什么),只关心运算的功能而非具体实现方式;具体的实现细节(怎么做)需要考虑线性表的存储结构
  * 线性表的顺序表示与实现
  * 线性表的链式表示与实现

  1. 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操作的返回值。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐