当前位置:文档之家› 数据结构整理完整版

数据结构整理完整版

第二章线性表一、顺序表和链表的优缺点1.顺序表定义:用一组连续的存储单元(地址连续)依次存放线性表的各个数据元素。

即:在顺序表中逻辑结构上相邻的数据元素,其物理位置也是相邻的。

优点逻辑相邻,物理相邻可随机存取任一元素存储空间使用紧凑缺点插入、删除操作需要移动大量的元素(平均约需移动一半结点,当n很大时,算法的效率较低)预先分配空间需按最大空间分配,利用不充分表容量难以扩充2.链式存储结构定义:由分别表示a1,a2,…,a i-1,a i,…,a n的N 个结点依次相链构成的链表,称为线性表的链式存储表示优势:(1)能有效利用存储空间;动态存储分配的结构,不需预先为线性表分配足够大的空间,而是向系统“随用随取”,在删除元素时可同时释放空间。

(2)用“指针”指示数据元素之间的后继关系,便于进行“插入”、“删除”等操作;插入或删除时只需要修改指针,而不需要元素移动。

劣势:(1)不能随机存取数据元素;(2)丢失了一些顺序表的长处,如线性表的“表长”和数据元素在线性表中的“位序”,在单链表中都看不见了。

如,不便于在表尾插入元素,需遍历整个表才能找到插入的位置。

二、单链表中删除一个节点和插入一个节点的语句操作,p291.插入元素操作算法基本思想:首先找到相应结点,然后修改相应指针。

假定在a,b之间插入结点X,s指向X, p指向a,指针修改语句为:s->next=p->next; p->next =s;2.删除元素操作算法基本思想:首先找到第i-1 个结点,然后修改相应指针。

删除b结点,其中,P指向a,指针修改语句为:p->next=p->next->next;三、单链表的就地逆置习题集2.22算法的基本思想:以单链表作存储结构进行就地逆置的正确做法应该是:将原链表的头结点和第一个元素结点断开(令其指针域为空),先构成一个新的空表,然后将原链表中各结点,从第一个结点起,依次插入这个新表的头部(即令每个插入的结点成为新的第一个元素结点)。

算法思路:依次取原链表中的每个结点,将其作为第一个结点插入到新链表中去,指针p用来指向当前结点,p为空时结束。

void reverse (Linklist H){LNode *p;p=H->next; /*p指向第一个数据结点*/H->next=NULL; /*将原链表置为空表H*/while (p){q=p;p=p->next;q->next=H->next; /*将当前结点插到头结点的后面*/H->next=q;}}第三章栈和队列一、栈和队列的特性1.特点栈必须按“后进先出”(LIFO)的规则进行操作,仅限在表尾进行插入和删除的操作。

队列(FIFO)必须按“先进先出”的规则进行操作,队尾插入,队头删除。

二、循环队列为空和满的判定方法,p63队空条件:front == rear;队满条件:(rear + 1) % maxSize == front第四章串一、模式匹配的改进算法求Next 数组 1) Next[j]的定义2) 求解第五章数组与广义表一、对称矩阵和上(下)三角矩阵的压缩存储1. 对称矩阵的压缩存储若一个n 阶方阵A 中的元素满足a i,j =a j,i (1≤i,j≤n),则称其为n 阶对称矩阵。

(1)只存储对称矩阵中上三角或下三角中的元素 (2)将n 2个元素压缩存储到n(n+1)/2个元素的空间中,以一个一维数组作为A 的存储空间。

2. 下三角矩阵的压缩存储B[n(n+1)/2+1](1)1,2(1)1,2i i j i j k j j i i j-⎧+-≥⎪⎪=⎨-⎪+-<⎪⎩当当(1)1,2(1),2i i j i j k n n i j -⎧+-≥⎪⎪=⎨+⎪<⎪⎩当当3. 上三角矩阵的压缩存储B[n(n+1)/2+1]二、理解广义表的取表头和表尾的操作1. 广义表的表头(Head)和表尾(Tail):当广义表LS=(a 1,a 2,…,a i ,…,a n )非空时,称第一个元素a 1为广义表的表头,其余元素组成的表(a 2, a 3, …,a n )称为广义表的表尾。

表头可能是原子,也可能是广义表,但表尾一定是广义表。

2. 取表头GetHead(LS) = a 1。

3. 取表尾GetTail(LS) = (a 2,a 3,…,a n )。

4. 取表头表尾示例①B=(e) GetHead(B) = e; GetTail(B) = ( ). ②A=(a, ((b, c), d, e)) GetTail(A)=(((b, c), d, e))GetHead( GetTail(A))=((b, c), d, e)GetHead( GetHead( GetTail(A))) = (b, c). ③A=( ); B = ( ( ) )A 空表,长度0,深度1,无表头和表尾;B 长度1,深度2,表头( ),表尾( )。

第六章树和二叉树一、 二叉树先序、中序和后序的关系p1541.二叉树遍历的概念二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点仅被访问一次的过程。

它是最基本的运算,是二叉树中所有其他运算的基础。

2.先序遍历(DLR )操作过程: 若二叉树为空,则空操作,否则 (1) 访问根结点;(2) 按先序遍历左子树; (3) 按先序遍历右子树。

3.中序遍历(LDR )操作过程: 若二叉树为空,则空操作,否则: (1) 按中序遍历左子树; (2) 访问根结点;(3) 按中序遍历右子树。

(1)(22),2(1),2i n i j i i j k n n i j--+⎧+-≤⎪⎪=⎨+⎪>⎪⎩当当4.后序遍历(LRD)操作过程:若二叉树为空,则空操作,否则:(1) 按后序遍历左子树;(2) 按后序遍历右子树;(3) 访问根结点。

5.遍历示例:6.强调:给定结点的前序序列和中序序列可以唯一确定一棵二叉树。

见P154例6-5,必须掌握。

二、 二叉树向森林的转换1.将一棵二叉树还原为树或森林,具体方法如下:(1)若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子……都与该结点的双亲结点用线连起来。

(2)删掉原二叉树中所有双亲结点与右孩子结点的连线。

(3)整理由(1)、(2)两步所得到的树或森林,使之结构层次分明。

2.二叉树到森林的转换示例三、 算法:题目要求:实现一次遍历二叉树即可求得根结点到树中每个叶结点的路径,试用C 语言描述该算法。

以二叉链表存储表示二叉树,结点的结构为(lchild, data, rchild)。

————树节点结构—————— Typedef struct BInode{ TElemType data;Struct Binode *lchild,rchild; } Binode,*BiTree;void AllPath(Bitree T, Stack &S)//输出二叉树上从根到所有叶子结点的路径 {if(T) {Push(S,T->data);if(!T->Left&&!T->Right)//如果左指针和右指针同时为空,才说明该节点为叶子节点PrintStack(S);else {AllPath(T->Left,S);(a) 添加连线(b) 删除右孩子结点的连线(c) 整理AllPath(T->Right,S); }Pop(S); }四、 哈夫曼树1.构造哈夫曼树(哈夫曼算法)① 由给定的n 个权值{W 1,W 2,...,W n },构造n 棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T 1,T 2,...,T n }; ② 在F 中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和; ③ 在集合F 中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F 中; ④ 重复(2)、(3)两步,当F 中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。

2.哈夫曼构造示例:3.哈夫曼编码(最优前缀编码)右图对应的哈夫曼编码如下:a :000b :001c :01d :1哈夫曼编码树中没有度为1的结点。

n 个叶子结点,共有2n-1个结点。

强调:建立的哈弗曼树不唯一,编码也不唯一,但是不同哈弗曼编码的树的带权路径长度都是一样的,都是最小的。

第七章图一. 图邻接矩阵的表示方法1. 邻接矩阵表示法(数组表示法) 图G 是一个具有n 个顶点的无权图,G 的邻接矩阵是具有如下性质的n×n 矩阵A :若图G 是一个有n 个顶点的网,则它的邻接矩阵是具有如下性质的n×n 矩阵A :邻接矩阵表示法示例:邻接矩阵表示法类型描述#define MAX_VERTEX_NUM 20 //最多顶点个数 #define INFINITY INT_MAX //表示极大值∞ typedef enum{DG, DN, UDG, UDN} GraphKind; typedef struct ArcCell{ VRType adj; InfoType *info;} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{VertexType vexs [MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵int vexnum, arcnum; //图的顶点数和弧数 GraphKind kind; //图的种类标志1, ,),[,]0, i j i j v v v v V A i j <>∈⎧⎪=⎨⎪⎩若(或其它, ,),[,], ij i j i j w v v v v VA i j <>∈⎧⎪=⎨∞⎪⎩若(或其它(a) (b) ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=01101101111101001101110101A ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=01001000001100001100010102A} MGraph;邻接矩阵的特点如下:(1)图的邻接矩阵表示是惟一的。

(2)无向图的邻接矩阵一定是一个对称矩阵。

在具体存放邻接矩阵时只需存放上(或下)三角形阵的元素。

(3)不带权的有向图的邻接矩阵一般来说是一个稀疏矩阵,因此,当图的顶点较多时,可以采用三元组表的方法存储邻接矩阵。

(4)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点v i的度。

(5)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点vi的出度(或入度)。

相关主题