《传智播客-数据结构》01 线性表 2018/10/14

线性表基本概念

1.定义

线性表(List)是零个或多个数据元素的集合

线性表中的数据元素之间是有顺序的

线性表中的数据元素个数是有限的

线性表中的数据元素的类型必须相同

数学定义:线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列(a1, a2, …, an),ai是表项,n 是表长度。

2.性质

a0为线性表的第一个元素,只有一个后继

 an为线性表的最后一个元素,只有一个前驱

除a0和an外的其它元素ai,既有前驱,又有后继
线性表能够逐项访问和顺序存取

3 线性表的基本操作

创建线性表

销毁线性表

清空线性表

将元素插入线性表

将元素从线性表中删除

获取线性表中某个位置的元素

获取线性表的长度

线性表在程序中表现为一种特殊的数据类型

线性表的操作在程序中的表现为一组函数

/*
C语言描述=====》线性表的设计与实现
ADT抽象层  《[数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf》 p44页 
人生财富库积累

*/

#ifndef _WBM_LIST_H_
#define _WBM_LIST_H_

typedef void List;
typedef void ListNode;

//创建并且返回一个空的线性表
List* List_Create();

//销毁一个线性表list
void List_Destroy(List* list);

//将一个线性表list中的所有元素清空, 线性表回到创建时的初始状态
void List_Clear(List* list);

//返回一个线性表list中的所有元素个数
int List_Length(List* list);

//向一个线性表list的pos位置处插入新元素node
int List_Insert(List* list, ListNode* node, int pos);  

//获取一个线性表list的pos位置处的元素
ListNode* List_Get(List* list, int pos);

//删除一个线性表list的pos位置处的元素  返回值为被删除的元素,NULL表示删除失败
ListNode* List_Delete(List* list, int pos);

#endif
注意:
int List_Insert(List* list, ListNode* node, int pos);  (重点:分离思想) 

2线性表的顺序存储结构

《传智播客-数据结构》01 线性表 2018/10/14_第1张图片

设计与实现

插入元素算法

判断线性表是否合法

判断插入位置是否合法

把最后一个元素到插入位置的元素后移一个位置

将新元素插入

线性表长度加1


获取元素操作

判断线性表是否合法

判断位置是否合法

直接通过数组下标的方式获取元素

 

删除元素算法

判断线性表是否合法

判断删除位置是否合法

将元素取出

将删除位置后的元素分别向前移动一个位置

线性表长度减1

《传智播客-数据结构》01 线性表 2018/10/14_第2张图片

2.2.3优点和缺点

优点:

无需为线性表中的逻辑关系增加额外的空间

可以快速的获取表中合法位置的元素

缺点:

插入和删除操作需要移动大量元素

当线性表长度变化较大时难以确定存储空间的容量

3线性表的链式存储

2.3.1基本概念

链式存储定义

为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。

《传智播客-数据结构》01 线性表 2018/10/14_第3张图片

《传智播客-数据结构》01 线性表 2018/10/14_第4张图片

表头结点

链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息

数据结点

链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息

尾结点

链表中的最后一个数据结点,其下一元素指针为空,表示无后继。

《传智播客-数据结构》01 线性表 2018/10/14_第5张图片

你可能感兴趣的:(语言学习)