1、=i-1;-j) L.elemj+1=L.elemj); L.elemi-1=e; +L.length; return OK;线性表定位删除Status Listdelete_Sq(Sqlist &L,int i, Elemtype &e) if (iL.length) return ERROR; e= L.elemi-1); for (j=i;jnext;+j if ( !p ji-1) return ERROR; new(s); s-data=e;next=p- p-next=s;链式定位删除 Status Listdelete_L(Linklist &L,int i,Elemtype &
2、 while (p-next& p=p- +j (p-next) j q= p-next ;next=q - e=q -data; free(q);双向链表结点的存储结构定义typedef struct Dublnode Elemtype data; struct Dublnode *prior ; struct Dublnode *next ;Dublnode,*Dublinklist ;了解:有序表的合并void Mergelist_L(Linklist &La, Linklist &Lb, Linklist &Lc) pa=La- pb=Lb- Lc=pc=La; while (pa&p
3、b) if ( pa-datadata) pc-next=pa;pc=pa;pa=pa- else next=pb;pc=pb;pb=pb- pc-next =pa?pa:pb; free(Lb);第3章、栈与队列1、栈的插入,删除,和取栈顶 2、队列的取对头,插入,删除(循环队列)栈的存储结构定义: #define Stack_init_size 100; #define Stackincrement 10; typedef struct Selemtype *base; 指向第一个元素(有数) Selemtype *top; 指向最后一个元素的下一位(为空) int stacksize;
4、Sqstack;栈的取栈顶Status Gettop(Sqstack s,Selemtype & if (s.top=s.base )return ERROR; e=*(s.top-1); return Ok栈的插入Status Push(Sqstack &s,Selemtype e) if (s.top-s.base=s.stacksize) s.base=追加分配空间; s.stacksize+=Stackincrement; *s.top+=e;栈的删除栈顶Status Pop(Sqstack &s,Selemtype & if (s.top=s.base) return ERROR;
5、e=*-s.top 队列的顺序存储表示与实现typedef struct Qelemtype *base; int front; 指向第一个元素(有数) int rear; 指向最后一个元素的下一位(为空)Sqqueue;队空条件: Q.front = Q.rear队满条件: (Q.rear+1) % Maxsize= Q.front队列长度:(Q.rear-Q.front+Maxsise)%Maxsize队的插入:Status Enqueue(sqqueue &Q,Qelemtype e) if (Q.rear+1)%Maxsize=Q.front) return ERROR; Q.base
6、Q.rear=e; Q.rear=(Q.rear+1)%Maxsize;队的删除Status Dequeue(sqqueue &Q,Qelemtype & if (Q.front = Q.rear ) return ERROR; e=Q.baseQ.front; Q.front=(Q.front+1)%Maxsize;取对头Status GetHead(sqqueue &return Q.baseQ.front;第四章 串串的比较、连接,了解串的插入,删除定义typedef struct char *ch; int length; Hstring ;比较status strcompare(S,
7、T) for (i=0;i=j)或 k=j(j+1)/2+i(i1 则双亲为 parent(i) = i / 2 ; (2) 若 2in 则 i 无孩子,为叶结点 否则 lchild(i)=2 i ; (3) 若 2i+1n 则 i 无右孩子 否则 rchild(i)=2 i+1。遍历的访问顺序有三种:1 先序访问: 根 左子树 右子树2 中序访问: 左子树 根 右子树3 后序访问: 左子树 右子树 根递归遍历:中序Void inorder(bt) if (bt) inorder(bt-lchild); visit(bt-data); inorder(bt-rchild);先序Void pre
8、order(bt) visit(bt- preorder(bt-后序Void postorder(bt) postorder(bt- postorder(bt-树的存储结构(书上P135) 1 双亲表示法: 用一组连续的空间存放结点,每个结点用一个域表示该结点的双亲. 2 孩子表示法: (1)多叉链表表示法(2)多重线性链表表示法:把每个结点的孩子组成一个线性链表. 3 孩子兄弟表示法:用二叉树的左指针指向该结点的第一个孩子,右指针指向该结点的下一个兄弟.哈夫曼树(最优二叉树)概念路径: 从一结点到另一结点上的分支路径长度: 路径上的分支数目树的路径长度: 从根到所有结点的路径长度之和结点的带
9、权路径长度: 从该结点到树根之间的路径长度与结点上权值的乘积.树的带权路径长度: 树中所有叶子结点的带权路径长度之和. 设有n 个权值 w1,w2,.wn,任意构造有 n 个叶结点的二叉树,每个叶结点权值为wi 。则其中带权路径长度最小的二叉树称为哈夫曼树(最优二叉树)。构造方法 (1) 根据给定的 w1,w2,.wn, 生成 n 棵树的森林, F= T1,T2,.Tm;根结点值为权值; (2) 在 F 中选择两棵根结点值最小的树 Ti ,Tj 作为左右子树,构成一棵新二叉树Tk , Tk根结点值为Ti ,Tj根结点权值之和; (3) 在 F 中删除Ti ,Tj ,并把 Tk 加到 F中; (
10、4) 重复 (2) (3),直到 F中只含一棵树。第7章 图图的定义,数组表示法,邻接表表示法 深度优先遍历,广度优先遍历,生成树图的定义: Graph=(V,E), V为顶点集; E 为边集。 若 E 为有向边,称为有向图; 若 E 为无向边,称为无向图。 边一般由顶点对表示:; 若 为有向边,则称 vi 为尾, vj 为头. 有向边也可以表示为: vi vj 无向完全图: 如果在无向图G中,任何两顶点都有一条边相连,边的数目为:n(n-1)/2 有向完全图:如果在有向图G中,任何两顶点都有两条方向相反的边相连,边的数目为:n(n-1) 连通图:无向图中,任意两点 Vi,Vj 都有路径相连,
11、称该无向图为连通图. 连通分量: 无向图中极大连通子图.数组(矩阵)表示法: 设 G=(V,E) V= V1,V2,.Vn Ai,j= 1 若 E , ij0 否则A 为一 nn 矩阵,称为 G 的邻接矩阵若 G=(V,E) 为网,则邻接矩阵可以表示为:数组表示法定义:#define Max_V_num 20 /最大顶点数typedef enum DG,DN,UDG,UDN Graphkind; /有向无向图网typedef struct / 图结构 Vextype vexsMax_V_num; / 顶点数组 Arctype arcsMax_V_num Max_V_num; /边矩阵 /0,1
12、或权值wij int vexnum,arcnum; /顶点数,边数 Graphkind kind; /图种类 graph邻接表表示法: 每个顶点用一个链表表示(P164)typedef struct Arcnode /边结点类型 int vjpos; /vj的位置 struct Arcnode *nextarc; Arcnode;typedef struct Vnode /顶点结点类型 vextype data; Arcnode *firsttarc; Vnode,AdjlistMax_V_num ; Adjlist vexs; graph十字链表:用来表示有向图. 有向图中,每一条边用一个结
13、点表示,每个顶点也用一个结点表示.(了解)深度优先遍历( dfs) 算法思想: 1) 访问给定结点; 2) 重复对第一个未被访问的邻接点进行深度优先遍历,直到不存在未被访问的邻接点结束.可以用一个数组标识顶点是否被访问过.void DFStraverse(Graph G) for (v=0;vG.vexnum;+v) visitedv=FALSE; for (v=0;+v) /保证非连通图的遍历 if (!visitedv) DFS(G,v);void DFS(Graph G,int v) /连通图的遍历 visit(v);visitedv=TRUE; for (w= First_Adj(G,
14、V);w;w=Next_Adj(G,v,w)visitedw) DFS(G,w);广度优先遍历( bfs) 1) 访问给定结点v; 2) 由近至远,依次访问和 v 有路径相连且长度为 1,2,3.的顶点.可以用一个数组标识顶点是否被访问过.用一个队列存放刚访问过的结点.void BFStraverse(Graph G) iniqueue(Q); /建立空队列Qvisitedv) visit(v);Enqueue(Q,v); /入队 while(!Queueempty(Q) Dequeue(Q,u); /出队 for (w= First_Adj(G,u);w=Next_Adj(G,u,w)vis
15、itedw) visit(w);visitedw=TRUE;Enqueue(Q,w); /再入队例如:深度优先遍历: a b d h e c f g广度优先遍历: a b c d e f g h生成树:一个连通图的生成树是由 n-1 条边且包含 G 的所有顶点的树组成. 可按深度或广度优先遍历来创建生成树. 最小生成树:对具有 n 个结点的网,如何选择 n-1 条边构成的生成树,其权值和最小.权值 和最小的生成树即为最小生成树.最小生成树的性质(MST): 假设 N=(V,E) 是连通网,U V若 是一条具有最小权值的边,uU,v V-U,则必然存在一棵包含边 的最小生成树.prim 算法:
16、1 设U=u0,T= ; 2 重复执行如下操作: 在所有 uU,v V-U的边 E中找一条代价最小的边 ,并入 T中, U=U+v,直到 U=V 或 T 中有n-1条边.kruscal 算法:(结果也如上图) 1 设 G=(V,E);T=(v, ); 2 从 E中选一条最小权值的边,并从 E 中消除此边 3 若 属于T中不同的连通分量,则将加入到 T 中,重复 2 ,直到T 中有n-1条边.最短路径:设V0,V1,V2,.Vn -1为n个顶点序列,求V0到各顶点的最短路径. Dijkstra 算法: 令 disti 表示已经求出的 v0 到 vi 的最短路径,S 表示已求出最短路径的顶点. 1
17、)令 distv0 =0; disti= | i v0 ;S=v0; 2)求下一条最短路径: distj=Mindisti+costi,k | viS,vk V-S 3)令 S=S+vj; 重复2) 直到 S=V. Dijkstra 算法的中心思想是采用路径长度递增产生最短路径.第8章 查找折半查找,了解顺序、索引查找, 二叉排序树的插入删除(算法思路) 哈希表元素类型定义: keytype key; 其它域定义elemtype顺序存储结构 typedef struct elemtype *elem; SStable顺序查找算法 int search(SStable ST,key) ST.el
18、em0.key=key; /0 位置本身为空单元 for(i=ST.length;!EQ(ST.elemi.key,key);- -i); return i; /若存在返回在静态表中的位置 i ,否则 i=0折半查找( 1 ) 折半查找思想( 2 )折半查找算法 low=1; high=ST.length; while (low左子树任意结点的值小于根结点值; 2右子树任意结点的值大于根结点值; 3左右子树仍然为二叉排序树.查找:Status SearchBST(BTree T ,keytype key, BTree f, BTree &p)/ f 为 T的父结点, /p 返回查找到的结点或/未查找到的叶结点(待插入的位置) if (!T) p=f;return False; else if EQ(key,T-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1