C语言数据结构_第06讲_图.ppt
简述了图的操作 void BFSTraverse(OLGraph G){ queue <int> q; for (int v=0; v<G.vexnum; ++v) visited[v] = false; //初始化访问标志 //q.InitQueue(); // 置空的辅助队列Q for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) { // v 尚未访问 visited[v] = true; printf("%c",G.xlist[v].data) ; printf(" "); // 访问u q.push(v); // v入队列 while (!q.empty()) { int u; u=q.front(); // 队头元素出队并置为u for(int w=firstAdjvex(G, u); w>=0; w=nextAdjvex(G)) if ( ! visited[w]) { visited[w]=true; printf("%c",G.xlist[w].data) ; printf(" "); // 访问u q.push(w); // 访问的顶点w入队列 } // if } // while } } // BFSTraverse /************************************************************************/ /* 深度优先搜索—非连通图 */ /************************************************************************/ void DFS(OLGraph G, int v) { // 从顶点v出发,深度优先搜索遍历连通图 G visited[v] = true; //cout<<G.xlist[v].data<<" "; printf("%c",G.xlist[v].data); printf(" "); for(int w=firstAdjvex(G, v);w>=0; w=nextAdjvex(G)) if (!visited[w]) DFS(G, w); // 对v的尚未访问的邻接顶点w递归调用DFS } void DFSTraverse(OLGraph G) { for (int v=0; v<G.vexnum; ++v) visited[v] = false; // 访问标志数组初始化 for (v=0; v<G.vexnum; ++v) { if (!visited[v]) DFS(G, v); // 对尚未访问的顶点调用DFS } } /************************************************************************/ /* 图的深度优先生成树 */ /************************************************************************/ void DFSForest(OLGraph &G,int v,CStree T){ //从第v个定点开始深度遍历图,建立生成树 T=NUll; CSnode p=NULL; CSnode q=NULL; for (int v=0; v<G.vexnum; ++v) visited[v] = false; // 访问标志数组初始化 visited[v] = true; bool first=true; for(int w=firstAdjvex(G, v);w>=0; w=nextAdjvex(G)) if(!visited[w]){ p=(CStree) malloc (sizeof(CStree)); p.data=G.xlist[v].data; p.firstchild=NUll; p.nextsibling=NUll; if(!T) T=p; else q.nextsibling=p; q=p; DFSTree(G,v,p); } } void DFStree(OLGraph &G,int v,CStree T) { CSnode p; visited[v] = false;bool first=true; for(int w=firstAdjvex(G, v);w>=0; w=nextAdjvex(G)) if(!visited[w]){ p=(CStree)malloc (sizeof(CSnode)); p.data=G.xlist[w].data; p.firstchild=NUll; p.nextsibling=NULL; } if(first){ T. /************************************************************************/ /* 插入节点 */ /************************************************************************/ void InsertVex(OLGraph &G,vertexType v) { /* 初始条件: 有向图G存在,v和有向图G中顶点有相同特征 */ /* 操作结果: 在有向图G中增添新顶点v(不增添与顶点相关的弧,留待InsertArc()去做) */ G.xlist[G.vexnum].data=v; G.xlist[G.vexnum].firstin=G.xlist[G.vexnum].firstout=NULL; G.vexnum++; //printf("成功!"); } /************************************************************************/ /* 插入弧 */ /************************************************************************/ bool InsertArc(OLGraph &G, vertexType vex1, vertexType vex2){ /* if ((G.xlist[LocateVex(G, vex1)].use==0)||(G.xlist[LocateVex(G, vex2)].use==0)) { printf("要插入的弧对应的节点不存在!!!"); return false; }*/ arcBox *arcNode = (arcBox *)malloc(sizeof(arcBox)); if(!arcNode) exit(1); arcNode->tailvex = LocateVex(G, vex1); arcNode->headvex = LocateVex(G, vex2); arcNode->tlink = G.xlist[arcNode->tailvex].firstout; arcNode->hlink = G.xlist[arcNode->headvex].firstin; G.xlist[arcNode->tailvex].firstout = G.xlist[arcNode->headvex].firstin = arcNode; G.arcnum++; return true; 【知识点详解】 本文主要涉及的是图的理论和操作,图是一种数据结构,它由顶点集合和描述顶点间关系的边集合构成。在图的领域中,有以下几个关键概念和算法: 1. **图的定义**:图G由顶点集合V和边集合E组成,通常表示为G=(V,E)。边可以是有向(弧)或无向的。 2. **无向图与有向图**:无向图中,边没有方向,而有向图中的边有明确的方向,即弧头和弧尾。 3. **完全图**:无向完全图中任何两个顶点间都有一条边,有向完全图中任意两个顶点间存在方向相反的两条弧。 4. **稠密图与稀疏图**:稠密图的边数相对于顶点数较多,稀疏图则较少。 5. **顶点的度**:无向图中,顶点的度是与其相连的边数。在有向图中,分为入度(进入该顶点的弧数)和出度(从该顶点出发的弧数)。 6. **图的遍历**:主要有两种遍历方法,深度优先搜索(DFS)和广度优先搜索(BFS)。DFS从一个顶点出发,递归地访问其所有邻接顶点;BFS则使用队列,先访问最近的顶点,然后逐步扩展。 - **DFS**:从一个未访问过的顶点开始,标记已访问,然后访问其所有邻接顶点,并对这些顶点进行递归调用DFS。 - **BFS**:使用队列,从源顶点开始,将其所有邻接顶点入队,然后逐个出队访问,再将它们的邻接顶点入队,直到队列为空。 7. **图的存储结构**:包括邻接矩阵和邻接表。邻接矩阵用二维数组表示,每个元素表示一对顶点之间是否有边;邻接表则为每个顶点维护一个链表,链表包含所有与之相邻的顶点。 8. **图的连通性**:如果图中任意两个顶点都存在路径相连,那么该图是连通的。连通分量是图中最大的连通子图。 9. **生成树**:在一个连通图中,若选取一部分边,使得这些边构成的子图仍然是连通的且包含所有顶点,这样的子图称为该图的生成树。 10. **插入顶点和边**:`InsertVex`函数用于在图中添加新的顶点,`InsertArc`用于添加新的边。插入时需要注意边的指向和顶点的使用状态。 11. **最短路径**:在图中,找到两个顶点之间的路径,使得路径上的边的权值之和最小,这被称为最短路径问题。解决这类问题的算法有Dijkstra算法、Floyd-Warshall算法等。 以上内容是图论的基础知识,理解和掌握这些概念对于处理复杂数据结构问题至关重要。在实际应用中,例如网络路由、社交网络分析、任务调度等领域,图的理论和技术都发挥着重要作用。
剩余58页未读,继续阅读
- 粉丝: 2
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Simulink的考虑局部遮阴的光伏PSO-MPPT控制模型.rar
- 基于Simulink的最大功率点追踪MPPT功能的单相单级脉宽调制(PWM)光伏逆变器,并且支持并网运行.rar
- 基于TCN-GRU的自行车租赁数量预测研究Matlab代码.rar
- 基于TCN-GRU-Attention的自行车租赁数量预测研究Matlab代码.rar
- 基于WoodandBerry1和非耦合控制WoodandBerry2来实现控制木材和浆果蒸馏柱控制Simulink仿真.rar
- 基于变分多谐波对偶模式追踪从噪声信号中提取重复瞬态分量的方法附Matlab代码.rar
- 基于Python的智能门禁打卡系统设计与开发-含详细代码及解释
- 数电课件,数字电路与逻辑
- A Neural Probabilistic Language Model.pdf
- 基于Java的学生信息管理系统实现
- OpenCV人脸检测和识别
- 管理工具PKIManager-1.1.3.6-全算法版本-信创
- ACM程序设计经典题目与解决方案(C语言实现)
- 详细的Visual Studio安装教程及注意事项
- 手机侧面轮廓尺寸检测机3D图纸和工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- GitHub教程:账号注册、项目创建与协同开发详解