数据结构
定义:相互之间存在关系的数据元素集合。
数据逻辑结构分类:
依据数据元素之间不同关系,大体可以分为四类:
1.集合:结构中的数据元素之间除了同属于一个集合的关系外,再无其他关系。
2.线性结构:结构中的数据元素之间存在一个对一个的关系
3.树形结构:结构中的数据元素之间存在一个对多个的关系
4.图状结构:结构中的数据元素之间存在多个对多个的关系
数据存储结构分类:
1.顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系
2.链式存储结构:借助指示元素存储地址的指针来表示数据元素之间的逻辑关系
线性表:
定义:n个元素的有限序列。
线性表的顺序表示和实现:现行表的顺序表示指用一组地址连续的存储单元依次存储线性表的数据元素,因此线性表的顺序存储结构特点是逻辑关系上相邻的两个元素在物理位置上也是相邻的,然而,这一特点也造成这种存储结构的弱点:在作插入和删除操作时,需要移动大量元素
线性表的链式表示和实现:用任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的),因此,为了表示每个元素a(i)与其后记元素a(i+1)之间的逻辑关系,对与元素a(i)来说,除了存储其本身信息之外,还需存储一个指示其直接后继元素的信息(即后继元素的存储位置),存储本身信息的域称为数据域,存储后继元素的位置信息的域称为指针域,指针域+信息域=结点,n个结点链接成一个链表。又由于此链表每个结点只包含一个指针域,故又称为线性链表或单链表,整个链表存储需从头指针开始,即第一个结点,最后一个结点的指针为null。
循环链表:与单链表相比,其特点是表中最后一个结点的指针域指向头结点。
双向链表:即一个结点中有两个指针域,其中一个指向直接后继,另一个指向直接前趋。
栈:
定义:是限定仅在表尾进行插入或者删除操作的线性表,表尾端有特殊含义,称为栈顶,相应的,表头端称为栈底,不含元素的空表称为空栈。
顺序栈:即栈的顺序存储结构。
队列:
定义:它只允许在表的一端进行插入,在另一端删除元素,因此是先进先出,也是一种线性表。在队列中,允许插入的一端叫做队尾,允许删除的一端则称为队头。
双端队列:限定插入和删除操作在表的两端进行的线性表。
链队列:用链表表示的队列简称为链对列,一个链队列显然需要两个分别指向队头和队尾的指针,才能唯一确定,对链队列进行插入和删除操作,只需修改头指针和尾指针。
循环队列:队列的顺序存储,每当插入新的队列尾元素时,尾指针增加1,每当删除队列头元素时,头指针增加1。
数组:
数组一旦被定义,他的维数和维界就不在改变,结构中的数据元素个数和元素之间的关系就不在发生改变,因此,除了结构的初始化和销毁外,数组只有存取元素和修改元素值的操作,因此采用顺序存储。由于存储单元是一维结构,而数组是多维结构,则用一组连续存储单元存放数组的数据元素有个次序约定问题。
广义表:广义表是线性表的推广,又称为列表。
列表特点:
1.列表的元素可以是子表,子表元素也可以是子表,因此,列表是一个多层次的结构。
2.列表可为其他列表所共享
3.列表可以是一个递归表
由于广义表中的数据元素可以具有不同的结构,因此难以用顺序结构来表示,通常采用链式存储结构,每一个元素可以用一个结点来表示,由于列表的数据元素可能是原子,也可能是列表,所以,结点分为两种,一种是原子结点,一种是表结点,表节点可由3个域组成:标志域,指示表头的指针域,指示表尾的指针域,而原子节点只需要标志域和值域。
树
树是n个结点的有限集。在任意一颗非空树中:
1.有且仅有一个特定的称为根的结点
2.当n>1时,其余结点可以分为m个互不相交的有限集,其中每一个有限集又是一颗树
树的结点包含一个数据元素及若干指向其子树的分支,结点拥有的子树数称为结点的度,度为0的结点称为叶子或者终端结点。
二叉树:
二叉树是另一种书型结构,他的特点是每个节点至多只有两颗子树,即度不能大于2,且二叉树的子树有左右之分,不能任意颠倒。
二叉树的存储结构:
1.顺序存储结构,按照顺序存储结构定义,在此约定,用一组地址连续的存储单元依次自上而下,自左向右存储完全二叉树的结点元素,但对于非完全二叉树来说,这种存储结构会浪费内存空间,如,一个深度为K且只有k个节点的单支树,却需要长度为2^k-1的一维数组。
2.链式存储结构,由二叉树的定义可知,链表结点至少包含三个域,即数据域,左右指针域,有时为了找到其双亲结点,也需要加上双亲的指针域。
由二叉树的递归定义可知,二叉树由三个基本单元组成:根节点,左子树,右子树。因此,若能依次遍历这三个部分,就可以遍历整个二叉树,假设L,D,R分别表示遍历左子树,访问根结点,遍历右子树,则有6种遍历方法,其中DLR,LDR,LRD分别称为先序遍历,中序遍历,后序遍历。