回顾前一篇:数组
数据结构的做用是按照必定的规则管理和操做数据,有利于程序的编写。数据结构
顺序表最简单的能够用数组来实现。能够动态地静态地定义一张顺序表,而数组是以静态定义的。静态定义所分配的内存空间是在栈上的,固定且连续的,不可改动。动态定义所分配的空间是在堆上的,可操做的。固然也是连续的,能够进行扩展(不能缩小吧?),使用完毕后需手动释放,系统不会自动回收,与静态不一样。指针
生成一张顺序表→插入元素→删除元素→系统自动回收/手动释放队列
对链表的操做和顺序表含义是一致的。静态链表的话相似于数组,结点都由程序定义好了,不是临时开辟的,因此链表通常都是动态的。内存
建立一个链表→插入节点→删除节点→销毁链表。链表使用完后建议销毁它,占内存,动态须要手动释放。方法是:顺着链表,同时释放结点,将表头指针移至表尾,将表头*list的内容置为NULL,这样链表list就空了,防止list变为野指针。基础
下面谈谈“栈”和“队列”扩展
栈:“栈”是线性表的一种具体形式,其功能是“先进后出”(LIFO).对栈的操做只能在表尾操做,表尾称为:栈定(top),表头称为:栈底(base/bottom)。栈像个子弹膛,最早进的子弹必定最后弹出。通常栈是以顺序表为基础的,因此通常都是顺序栈。循环
最开始栈中不含任何数据,叫作空栈,此时栈顶就是栈底。建立一个空栈,首先必须开辟一段连续的空间,此时栈顶与栈底相同。往栈中存放数据,叫作入栈操做,又称压栈。每压入一个数据,top指针自增1.若是栈满了,可追加空间。出栈即top指针减1,再取出指针指向的内容。直到top指针与base指针相同。清空一个栈,将base指针赋值给top指针,代表栈已空。销毁一个栈则不一样,首先要释放掉内存空间,而后top和base指针置NULL,设置栈的最大容量为0,计算当前栈的容量只需对top减去base便可。注意:内存空间和当前容量不是一个概念。程序
队列:“队列”一样须要顺序表或链表为基础,也就是说能够用链表或顺序表来构造一个队列。与栈不一样,其功能是先进先出(LIFO)。它要求数据从队尾(rear)进,从对头(front)出。下面介绍链队列的操做。建立一个队列,首先要在内存中建立一个头结点,不存放数据,只是为了方便操做而添加的。固然也能够不定义。而后将队列的头指针和尾指针都指向这个头结点。此时为一个空队列。队列的其余操做含义和栈一致,主要是对结点的指针进行操做,关键是先进先出(LIFO)。销毁队列和销毁链表方法相似。方法
还有一种用顺序表实现的队列叫作循环队列,其空间能够循环使用。循环队列通常有固定的容量,一样要求先进先出。其逻辑上是循环的,物理上是线性的。整个循环队列逻辑上就是一个缓冲区。循环队列的实现有点像栈,只是当rear指针超出了队列的地址范围时,进行取模运算,使其从新指向0号单元。