隐藏页面特效

数据结构复习代码——图的邻接表的基本操作的实现(续)

1、图的邻接表的基本操作的实现

 

//删除两点之间的边 void RemoveEgde(GraphLnk *g,T vertex1,T vertex2) { int v1 = GetVertexPos(g,vertex1); int v2 = GetVertexPos(g,vertex2); if(v1 == -1 || v2 == -1) { return; } Edge *q; Edge *p; //因为是无向图 //删除v1 -- v2边 p = g->NodeTable[v1].adj; while(p != NULL && p->dest!=v2) { q = p; p = p->link; } if(p == NULL) { return; } if(q == NULL) { g->NodeTable[v1].adj = p->link; } else{ q->link = p->link; } free(p); //删除v2 -- v1边 p = g->NodeTable[v2].adj; while(p->dest != v1) { q = p; p = p->link; } if(q == NULL) { g->NodeTable[v2].adj = p->link; } else { q->link = p->link; } free(p); g->NumEdges--; } //删除图中的点以及删除与该点相连的边 void RemoveVertex(GraphLnk *g,T vertex) { int v = GetVertexPos(g,vertex); if(v == -1) { return; } Edge *p = g->NodeTable[v].adj; Edge *s; Edge *t = NULL; //s的前驱 int k; while(p!=NULL) { k = p->dest; s = g->NodeTable[k].adj; while(s!=NULL&&s->dest!=v) //寻找与删除点相关的边的下标 { t = s; s = s->link; } if(s!=NULL) { if(t==NULL) { g->NodeTable[k].adj = s->link; } else { t->link = s->link; } free(s); } g->NodeTable[v].adj = p->link; free(p); p = g->NodeTable[v].adj; } g->NumVertices--; g->NodeTable[v].data = g->NodeTable[g->NumVertices].data; g->NodeTable[v].adj = g->NodeTable[g->NumVertices].adj; s = g->NodeTable[v].adj; while(s != NULL) { k = s->dest; p = g->NodeTable[k].adj; while(p!=NULL) { if(p->dest == g->NumVertices) { p->dest = v; break; } p = p->link; } s = s->link; } } //摧毁图结构 void DestroyGraph(GraphLnk *g) { Edge *p; for(int i=0;i<g->NumVertices;++i) { p = g->NodeTable[i].adj; while(p != NULL) { g->NodeTable[i].adj = p->link; free(p); p = g->NodeTable[i].adj; } } free(g->NodeTable); g->NodeTable = NULL; g->NumVertices = g->NumEdges = g->MaxVertices = 0; } //获取第一个邻接顶点 int GetFirstNeighbor(GraphLnk *g,T vertex) { int v = GetVertexPos(g,vertex); if(v==-1) return -1; Edge *p = g->NodeTable[v].adj; if(p != NULL) return p->dest; return -1; } //获取某点的下一个邻接点 int GetNextNerghbor(GraphLnk *g,T vertex1,T vertex2) { int v1 = GetVertexPos(g,vertex1); int v2 = GetVertexPos(g,vertex2); if(v1 ==-1 || v2 == -1) { return -1; } Edge *p = g->NodeTable[v1].adj; while(p != NULL&& p->dest != v2) { p = p->link; } if(p!=NULL && p->link !=NULL) return p->link->dest; return -1; }
图邻接表(续)

 

2、非连通图的遍历(与1部分代码通用图的定义部分,具体的图的节点和连线自行插入)

//以深度优先遍历方式 ----遍历非连通图 void Components(GraphLnk *g) { int n = g->NumVertices; int i; bool *visited = (bool*)malloc(sizeof(bool)*n); assert(visited!=NULL); for(i=0;i<n;i++) { visited[i] = false; } for(i=0;i<n;++i) { if(!visited[i]) { DFS(g,i,visited); //printf("Nul.\n"); } } free(visited); }

 


__EOF__

本文作者往心。
本文链接https://www.cnblogs.com/lx06/p/16498128.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   往心。  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示