抽象数据类型/循序存储/链式存储

231 阅读3分钟

1.线性表

1.1抽象数据类型

类型名称:线性表(List)

数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, ,an )

操作集:线性表L 属于 List,整数i表示位置,元素X 属于 ElementType, 线性表基本操作主要有:

1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ; 顺O(1) 链O(n) 3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置; O(n) 4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X; 顺O(n) 链O(1) 5、void Delete( int i, List L ):删除指定位序i的元素; 顺O(n) 链O(1) 6、int Length( List L ):返回线性表L的长度n。 顺O(1) 链O(n)

1.2顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

typedef struct LNode *List; //List为指向LNode结构的一个指针类型 struct LNode{
ElementType Data[MAXSIZE]; //顺序表的元素(数组名叫data,数组名就是数组的起始位置,数组大小就是MaxSize)

int Last; //指的是顺序表(数组)的最后一个元素所在的位置,即最后一个元素的下标

};
struct LNode L; //顺序表的类型定义为L
List PtrL;

  • 访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]
  • 线性表的长度:L.Last+1 或 PtrL->Last+1 //Last的值代表位置,因为是从0开始的,所以长度是Last+1

1.3链式存储实现

不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建 立起数据元素之间的逻辑关系。

• 插入、删除不需要移动数据元素,只需要修改“链”。

typedef struct LNode *List;
struct LNode{
ElementType Data; //该结点对应的数据
List Next; //它的下一个结点的位置,Next指针
};
struct Lnode L;
List PtrL;

2.堆栈

2.1抽象数据类型描述

类型名称: 堆栈(Stack) 

**数据对象集:**一个有0个或多个元素的有穷线性表。 

**操作集:**长度为MaxSize的堆栈S 属于 Stack,堆栈元素item 属于 ElementType

1、Stack CreateStack( int MaxSize ): 生成空堆栈,其最大长度为MaxSize; 
2、int IsFull( Stack S, int MaxSize ):判断堆栈S是否已满;
3、void Push( Stack S, ElementType item ):将元素item压入堆栈;
4、int IsEmpty ( Stack S ):判断堆栈S是否为空;
5、ElementType Pop( Stack S ):删除并返回栈顶元素;

2.2顺序存储实现

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

#define MaxSize <储存数据元素的最大个数> 
typedef struct SNode *Stack;
struct SNode{
ElementType Data[MaxSize]; //一维数组
int Top; //指示栈顶元素所在的位置,是一个整型变量,是代表了栈顶元素的数组下标
};

2.3链式存储实现

栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。栈顶指针Top应该在链表的哪一头?