数据结构:链表和队列

参考书籍:严蔚敏《数据结构》 清华大学出版社

数据:所有能输入计算机的符号总称,如图像、声音均可通过编码而归之于数据的范畴

数据元素:数据的基本单位,如图中的一个○

数据项:一个数据元素可由若干个数据项组成,如一本书的数目为一个数据元素,而数目中的每一项为一个数据项。数据项是不可分的最小单位

数据对象:性质相同的数据元素的集合,数据的一个子集

数据结构:数据元素之间的相互关系。也即逻辑结构

物理结构(存储结构):数据结构在计算机中的表示(又称映像),分为顺序映像(顺序存储结构)和非顺序映像(链式存储结构)


链表:

ai的后继元素为ai+1,为了表示两者的逻辑关系,对数据元素ai来说,不仅要存储其本身的信息,还要存储其后继元素ai+1的信息,即需要存储ai+1的存储位置,这两部分信息组成数据元素ai的存储映像,成为结点(node),它包含两个域——数据域和指针域,指针域中存储的信息称为指针或链。n个结点链结成一个链表。

----------线性链表的单链表(单向)存储结构------------

struct   LNode

{

ElemType   data;

struct   LNode *next;

}    LNode,   *LinkList


ps: ADT(abstract data type,抽象数据类型)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型与数据类型实际上是一个概念,如整形int ,栈stack.


栈(Stack):后进先出(LIFO)的线性表。

ADT   Stack的基本操作Stack->InitStack(&S)........Push(&S,e)   Pop(&S,&e)

栈中元素按照a1,a2...an顺序进栈,表尾端称为栈顶(an为栈顶元素),表头端称为栈底(a1为栈底元素)。

由于栈在使用过程中所需最大空间的大小很难估计,因此,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法是:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐段扩大。为此,可设两个常量:STACK_INIT_SIZE(存储空间的初始分配量)和STACKINCREMENT(存储空间分配增量)—应用实例见p47.

//---------------栈的顺序存储表示--------

struct {
ElemType *base;//栈底指针
ElemType *top;//站顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;


队列(queue):先进先出(FIFO)的线性表。

只允许在表的一端(队尾rear)插入元素,在另一端(对头front)删除元素。

队列在程序设计中经常出现,最典型的例子是操作系统中的作业排队。

用链表表示的

------单链队列---队列的链式存储结构---------
struct QueueNode{
ElemType data;
struct QueueNode *next;
}QueueNode, *QueuePtr;
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;

循环队列

出现原因:从队头取出元素,从队尾添加元素,加入当前为队列分配的最大空间为6,有可能到一定时间段,队头前面有一段空的内存,而队尾又不能再继续插入新的队尾元素。另外,此时又不能如顺序栈那样,进行存储再分配扩大数组空间,因为队列的实际可用空间并没有满。因此,可将顺序队列臆造为一个环状空间,成为“循环队列”。

在C语言中不能用动态分配的一维数组来实现循环队列。如果应用程序中设有循环队列,则必须为它设定一个最大队列长度,若无法估计队列最大长度,则宜采用链队列。

//---------循环队列——队列的顺序存储结构---------
#define MAXQSIZE 100 //最大队列长度
typedef struct{
ElemType *base; //初始化的动态分配存储空间
int front;//头指针
int rear;//尾指针
}SqQueue;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章