数据结构导论.docx
《数据结构导论.docx》由会员分享,可在线阅读,更多相关《数据结构导论.docx(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章 概论1 数据结构是指一组相互之间存在一种或多种特定关系的数据的组织方式和它们在计算机内的存储方式,以及定义在该组数据上的一组操作。2 数据的逻辑结构是指数据元素之间的逻辑关系。共分四种:集合结构:数据之间无关联线性结构:数据之间依次邻接树形结构:具有分支、层次特性图结构:任何两个节点都可以邻接3 数据的存储结构是指数据的逻辑结构在计算机上的实现。一般包括两部分:1) 数据元素 2)数据元素之间的关联方式。关联方式主要有两种:顺序存储方式和链式存储方式。4 一种逻辑结构可以表达为一种或几种存储结构,相应的存储结构称为给定逻辑结构的存储实现或存储映像。5 运算指在某种逻辑结构上进行的操作。
2、6 算法规定了求解给定问题的处理步骤和执行顺序。评估算法好坏的几个方面:1) 正确性:实现预定功能,2) 易读性:易于阅读,便于修改和扩充3) 健壮性:能对非法数据做出反应或进行处理4) 时空性:时间性能和空间性能7 时间复杂度:也就是基本操作的执行次数,用于估计算法的计算量。常见的有常数阶O(1),对数阶O(log2n),线性阶O(n),多项式阶O(nc)c=1,2,指数阶O(cn) c=1,2。通常认为,指数阶的算法是不可行的,低于平方阶的算法是高效率的。8 空间复杂度:算法所耗费的存储空间。一般只分析辅助变量所占的空间。第二章 线性表1 线性表基本概念1) 线性表是一种线性结构,它是由n
3、(n0)个数据元素组成的有穷序列,数据元素又称结点,结点个数n称为表长。当n=0时,线性表不含任何数据元素,称为空表。当n0时,线性表通常表示成(a1, a2, , an),a1称为起始结点,an称为终端结点。对任意一对相邻结点ai和ai+1(1in),ai称为ai+1的直接前驱,ai+1称为ai的直接后继。2) 线性表中结点具有一对一的关系,如果结点数不为零,则除起始结点没有直接前驱外,其它每个结点有且仅有一个直接前驱;除终端结点没有直接后继外,其它每个结点有且仅有一个直接后继。2 线性表的顺序存储1) 线性表顺序存储的方法:将表中的结点依次存放在计算机内存中一组连续的存储单元中,数据元素在
4、线性表中的邻接关系决定它们在存储空间中的存储位置,即逻辑结构中相邻的结点其存储位置也相邻。用顺序存储实现的线性表称为顺序表。一般使用数组来表示顺序表。结构定义如下:const int maxsize=100;typedef structDataType datamaxsize;int length; SqlList;SqlList L;2) 线性表的基本运算在顺序表上的实现(1) 插入void InsertSeqlist(SeqList L, DataType x, int i)if(L.length = maxsize) exit(“表已满”);if(i L.Length+1) exit(“
5、位置错”);for(j=L.length; j = i; j-) L.dataj = L.dataj-1;L.datai-1 = x;L.length+;(2) 删除void DeleteSeqlist(SeqList L, int i)if(i L.Length) exit(“位置错”);for(j=i; j L.length; j+) L.dataj-1 = L.dataj;L.length-;(3) 定位int LocateSeqlist(SeqList L, DataType x)int i = 0;while(iL.length & L.datai != x) i+;if(i nex
6、t;while(p!=NULL & p-data != x)i+;p=p-next;if(p != NULL) return i+1;return 0;(2) 插入void Insert(LinkList head, DataType x, int i)Node *p,*q;if(i=1) q=head;else q=GetLinkList(head,i-1);if(q=NULL) exit(“找不到插入位置”);p=malloc(sizeof(Node);p-next = q-next;q-next = p;(3) 删除void Delete(LinkList head, int i)Nod
7、e *p,*q;if(i=1) q=head;else q=GetLinklist(head, i-1);if(q=NULL) exit(“找不到删除位置”);p=q-next;p-next = q-next;free(p);3) 其它链表(1) 如果让最后一个结点的指针指向第一个结点可以构成循环链表。在循环链表中,从任意结点出发都能扫描整个链表。(2) 在单链表的每个结点中再添加一个指向其直接前驱结点的指针prior,头结点prior指针指向最后一个结点,最后一个结点的next指针指向头结点,这样的链表被称为双向循环链表。第三章 栈、队列、数组1 栈1) 栈的基本概念(1) 栈是运算受限的线
8、性表,这种线性表上的插入和删除运算限定在某一端进行。允许进行插入和删除的一端称为栈顶,别一端称为栈底。不含任何数据元素的栈称为空栈。处于栈顶位置的数据元素称为栈顶元素。(2) 栈的修改原则是后进先出(Last In First Out),因此,栈又称为后进先出线性表,简称后进先出表。栈的插入和删除运算称为进栈和出栈。2) 栈的顺序实现(1) 栈的顺序存储结构是用一组连续的存储单元依次存放栈中的每个元素,并用始端作为栈底。栈的顺序实现称为顺序栈。通常用一个一维数组和一个记录栈顶位置的变量来实现栈的顺序存储。为了防止“下溢”,栈底没有元素,栈顶的取值范围为0 - (maxsize-1)。定义如下:
9、const int maxsize=6;typedef struct seqstackDataType datamaxsize;int top; SeqStk;(2) 进栈int Push(SeqStk * stk, DataType x)if(stk-top = maxsize-1)error(“栈已满”);return 0;stk-top+;stk-datastk-top = x;return 1;(3) 出栈int Pop(SeqStk * stk)if(EmptyStack(stk)error(“空栈”);return 0;stk-top-;return 1;(4) 取栈顶元素Data
10、Type GetTop(SeqStk *stk)if(EmptyStack(stk) return NULL;return stk-datastk-top;3) 栈的链式实现(1) 栈的链式实现称为链栈,可以用带头的单链表实现,首结点作栈顶,尾结点作栈底。定义如下typedef struct nodeDataType data;struct node *next; LkStk;(2) 进栈void Push(LkStk *LS, DataType x)LkStk* temp = (LkStk*)malloc(sizeof(LkStk);temp-data = x;temp-next = LS-
11、next;LS-next = temp;(3) 出栈int Pop(LkStk *LS)LkStk * temp;if(!EmptyStack(LS)temp = LS-next;LS-next = temp-next;free(temp);return 1;return 0;2 队列1) 队列是一种先进先出(First In First Out)的线性表,新加入的数据元素插入队列的尾端。2) 队列的顺序实现(1) 顺序存储实现的队列称为顺序队列,由一个一维数组及两个指示队首和队尾的变量组成。(2) 为了避免元素的移动,可将存储元素的数组首尾相接,形成一个环状,这样的队列称为循环队列(3) 为
12、了解决循环队列无法区分是空队列还是满队列的情况,采用少用一个元素空间的办法解决3) 队列的链式实现(1) 使用一个单链表外加两个指向头尾结点的指针实现,称为链队列。3 数组1) 数组可以看作线性表的一种推广,一维数组又称向量,数组通常只有读和写两种操作2) 二维数组有两种存储方式,一种是行序存储(橫着存),一种是列序存储(竖着存)3) 为了节省存储空间,对矩阵中多个值相同的元素只分配一个存储空间,零元素不存储的方法被称为矩阵的压缩存储4) 如果值相同的元素或零元素在矩阵中的分布有一定规律,称此类矩阵为特殊矩阵。常见的特殊矩阵有对称矩阵和三角矩阵5) 矩阵中非零元素个数很少的矩阵称为稀疏矩阵。对
13、稀疏矩阵的压缩存储可以采用三元组表示法,即用行号,列号,元素值表示矩阵中的非零元素第四章 树1 树的基本概念1) 节点的度:节点所拥有的子树的数目2) 叶子:度为0的节点,也叫终端节点3) 树的度:树中所有节点的度的最大值4) 节点的层次:根的层次为1,其余的为其父节点加15) 树的高深度:树中所有节点层次的最大值6) 有序树:节点的子树是有次序的,不能互换7) 无序树:节点的子树没有次序,可以互换2 二叉树的基本概念1) 有左右两个节点,且节点次序不能互换,即互换后为两个不同的二叉树2) 二叉树第i层上最多有2i-1个节点3) 深度为k的二叉树最多有2k-1个节点4) 对任意二叉树而言,若n
14、0表示叶子,n2表示有左右两个子树的节点,则n0=n2+15) 满二叉树:深度为k且有2k-1个节点6) 完全二叉树:满二叉树删除编号最大的节点后的二叉树7) 含有n个节点的完全二叉树的深度为1 + log2n8) 对第i个节点的完全二叉树而言,左节点为2*i,右节点为2*i+1;对含有n个节点的完全二叉树而言,最后一个非终端节点编号为n/23 二叉树的存储结构1) 顺序存储:由于完全二叉树的节点编号能准确反映节点的逻辑关系,所以可直接用数组表示二叉树;对于非完全节点,则需增加虚拟节点构成完全二叉树,然后再将节点的值存入数组,虚拟节点的值用null表示2) 链式存储:(1) 二叉链表:lchi
15、ld, data, rchild (2) 三叉链表:lchild, data, parent, rchild4 二叉树的遍历1) 先序遍历void Preorder(BinTree bt)if(bt != null)visit(bt);preorder(bt-lchild);preorder(bt-rchild);2) 中序遍历void inorder(BinTree bt)if(bt != null)inorder (bt-lchild);visit(bt);inorder (bt-rchild);3) 后序遍历void postorder(BinTree bt)if(bt != null)
16、postorder (bt-lchild);postorder (bt-rchild);visit(bt);4) 以下面的二叉树为例,遍历如果如下:先序遍历结果:ABDEGCF中序遍历结果:DBGEACF后序遍历结果:DGEBFCA5) 二叉树的层次遍历void levelorder(BinTree bt)Queue q;BinTree nd;if(bt != null)EnQueue(bt);while(!EmptyQueue(Q)nd = OutQueue(Q);visit(nd);if(nd-lchild != null) EnQueue(q, nd-lchild);if(nd-rchi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 导论
限制150内