第二章机械CAD/CAM常用的数据结构第一节基本概念一、数据和数据结构数据是一切描述客观事物并能被计算机接受和处理的符号的集合。数据结构是描述物体数据元素之间关系的组织形式。具有8各顶点的图形数据结构数据结构包含的内容数据结构一般包含着三个内容:1)数据的逻辑结构,既数据元素之间的逻辑关系。2)数据的物理结构,既数据元素及其关系在计算机中的存储表示。3)数据的运算,即对数据进行的各种操作。二、数据的逻辑结构和物理结构数据的逻辑结构是从解决问题的需要出发,为实现必要的功能所建立起来的数据关系,是面向问题的,它的结构形式与存储形式无关。汽车组成的逻辑结构图数据的物理结构数据的物理结构是数据在计算机中的存储形式,是面向计算机的。物理结构根据问题所要求的响应速度、处理时间、修改时间、存储空间和单位时间的处理量等建立,是逻辑数据在计算机中的存储映像。同一逻辑结构的数据可以映像出多种物理结构形式。以数组构成的树型物理结构三、数据项、记录、数据文件数据项描述对象性质的数值和字符统称为属性值。数据结构中把描述属性的数据称为数据项(也称为字段),数据项是构成数据的最小单位。记录数据结构中把描述一个对象的数据称为记录(也称为数据元素、结点),记录是组成数据的基本单位。记录是相对的数据文件若干个记录组成的数据表称为数据文件。数据的逻辑结构分为两大类线性结构的特征是所有结点最多只有一个直接前驱结点和一个直接后继结点。非线性结构的特征是一个结点可以有多个直接前驱的结点(如网状结构)和多个后继结点(如树状结构和网状结构)。第二节线性表一、线性表的定义线性结构中的所有结点按前驱后继关系可以排成是一个线性序列:(a1,a2,a3,…,ai,…,an)这个序列称为线性表。线性表的存储结构分类1)顺序存储结构2)非顺序存储结构二、线性表的顺序存储结构线性表的顺序存储就是用一组连续的存储单元按线性表数据元素的逻辑结构依次存放表中所有数据元素。知道前一个元素的地址和元素所占用的空间,也就知道它下一个或上一个元素的地址线性顺序表的基本运算插入删除线性表的特点1)一般是静态表2)插入删除操作时间长3)存储,读入方便三、线性表的链式存储结构链表链表的存储单元可以是连续的,也可以是不连续的,不连续的链表存储单元可以通过指针来实现线性表中各数据元素之间的逻辑关系。特点不需要事先知道一张表的长度增删操作方便等优点1.单向链表节点定义typedefstructlinknode{ElemTypedata;structlinknode*link;}node;1)建立一个单向链表。2)遍历单向链表3)查找接点4)插入接点5)删除接点单向链表不能反向查询和操作2。双向链表定义建立遍历插入删除应用第三节栈、队列和数组一、栈表中结点的插入、删除运算只能在表的一端进行栈的定义typedefstruct{ElemTypes[m0];Inttop;}stack;1.栈的压入viodpush(ST,x)stack*ST;intx;{if(ST->top==m0)printf(“栈上溢出!\n”);else{ST->top=ST->top+1;ST->s[ST->top]=x;}}2.栈的弹出voidpop(ST)stack*ST;{if(ST->top==0)printf(“栈下溢出!\n”);/*若栈空则显示相应信息*/elseST->top--;/*否则栈指针减1,即栈顶为下一个元素*/}3.读栈顶元素4.判断栈是否为空二、队列它只允许在表的一端进行插入,而在另一端删除(先进先出)第四节树结构树是n(n>0)个结点的有限集合T。在一棵树中要满足两个条件:1)有且仅有一个特定的称为根(root)的结点。2)其余的结点可分为m(m≥0)棵互不相交的有限集合T1,T2,…,Tn,其中每一个集合又都是一棵树,称其为根的子树(subtree)。一般树概念根子树度一个结点具有的子树数目称为该结点的度结点A、B、C的度分别为2、3、1树的度为3叶子结点或终端结点层次二、二叉树它的特点是每个结点下只有左右两棵子树,且左右子树不能颠倒,否则为另一棵二叉树。二叉树有五种基本形态,如图2-20所示,其中(a)空二叉树,(b)只有一个根结点的二叉树,(c)右子树为空的二叉树,(d)左子树为空的二叉树,(e)左右子树均为非空的二叉树。二叉树与一般树的区别在于:1)一般树至少有一个结点,而二叉树可以为空。2)一般树的子树不区分其次序,而二叉树有左右之分,且不能颠倒。3)一般树的每一个结点可以有任意个子树,而二叉树每一个结点的子树不能超过2个。应用三、二叉树的遍历按一定的次序访问二叉树的每一个结点,且每个结点仅访问一次称为二叉树的遍历,对于图2-21所示的二叉树,按三种遍历的结果分别为:1)先序遍历(DLR)的结果:A、B、C、D、E、F、G、H、I。2)中序遍历(LDR)的结果:C、D、B、E、A、H、G、F、I。3)后序遍历(LRD)的结果:D、C、E、B、H、G、I、F、A。定义TypeLink=^data;Data=recordData1:integer;Left,right:link;End;先序遍历Procedurepreorder(p:link);Beginif(p!=Nil)thenbeginwriteln(p^.data1);preorder(p^.left);preorder(P^.right);end;End;中序遍历:Procedureinorder(p:link);Beginif(pNil)thenbeginintorder(P^.left);writeln(p^.data1);inorder(p^.right);end;End;后序遍历Procedurepostorder(p:link);beginif(pNiL)thenbeginpostorder(p^.left);postorder(p^.right);writeln(p^.data1);}}