/*----------------------图的邻接表示存储------------------------*/ //无向图 #define MAX_VEXNUM 20 // 最大顶点数 struct ArcNode{ int adjvex; // 该弧所指向的顶点的位置 ArcNode *nextarc; // 指向下一条弧的指针 }; template struct VNode{ DT data; // 顶点信息 ArcNode *firstarc; // 指向第一条依附该顶点的指针 }; template struct ALGraph{ VNode
vertices[MAX_VEXNUM]; //顶点集 int vexnum;//顶点数 int arcnum;//边数 }; template void DispG(ALGraph
G) { int i; ArcNode *p; cout<adjvex) //避免了无向的时候一条边被输出两次 { cout<<"("<adjvex].data<<")"<<'\t'; } p = p->nextarc; } } cout< int LocateVex(ALGraph
G, DT v) { for(int i=0;i void CreateUDG(ALGraph
&G) { int i,j,k; DT v1,v2; ArcNode *p; cout<<"请输入无向图的顶点数 "; // 1. 输入顶点数、边数 cin>>G.vexnum ; cout<<"请输入无向图的边数 "; cin>>G.arcnum ; cout<<"请输入"<>G.vertices[i].data; G.vertices[i].firstarc = NULL; } for(k=0;k>v1>>v2; i = LocateVex(G,v1); j = LocateVex(G,v2); if(i<0 || j<0 || i==j) { cout<<"顶点信息错,重新输入!"<adjvex = j; p->nextarc = G.vertices[i].firstarc; // 在v1链表表头插入新边结点 G.vertices[i].firstarc = p; p = new ArcNode; // 创建一个新的边 p->adjvex = i; p->nextarc = G.vertices[j].firstarc; // 在v2链表表头插入新边结点 G.vertices[j].firstarc = p; } } template void DestroyGraph(ALGraph
G) // 销毁边结点 { int i; ArcNode *p,*q; for(i = 0;inextarc; delete p; // 删除边结点 p = q; } } G.arcnum = 0; G.vexnum = 0; } template bool GetVex(ALGraph
G, int k,DT &v) // 获取第 k 个顶点的值 { if(k<0||k>=G.vexnum) // 顶点不存在,返回false return false; v=G.vertices[k].data; // 顶点存在,获取第 k 个顶点的值 return true; // 返回true } template bool PutVex(ALGraph
&G, DT &u,DT v) // 修改顶点 u 的值 { int k = LocateVex(G,u); if(k<0) // 顶点 u 不存在 return false; G.vertices[k].data = v; // 重置顶点u的值 return true; } template int FirstAdjVex(ALGraph
G, int u) // 求顶点 u 的第一个邻接点 { ArcNode * p; if(u<0 || u>=G.vexnum) // 顶点 u 不存在 return -1; p = G.vertices[u].firstarc; // 顶点u存在,有邻接点,p 为第一个邻接点位序 if(p) { return p->adjvex; } else { return -1; } } template int NextAdjVex(ALGraph
G, int u,int w) // 求顶点 u 相对于 w 的下一个邻接点 { ArcNode *p; if(u<0 || u>=G.vexnum || w<0 || w>=G.vexnum ) // 参数不合理 return -1; p = G.vertices[u].firstarc; // 从 u 的边链表出发 while( p && (p->adjvex!=w)) // 找 w 边结点 { p = p->nextarc; } if(!p||!p->nextarc) // 没找到 w 或 w 是最后一个顶点 return -1; else // 否则,返回下一个邻接点位序 { return p->nextarc->adjvex; } } template bool InsertVex(ALGraph
&G, DT v) // 增加顶点 { int j; char ans; DT w; if(G.vexnum > MAX_VEXNUM) // 顶点数为最多顶点数,不能增加新顶点 { cout<<"无存储空间,不能插入!"<>ans; while(ans=='Y'|| ans=='y') { cout<<"输入另一个顶点值:"<>w; j=LocateVex(G,w); if(j>=0) // 顶点存在,增加边 InsertArc(G,v,w); else cout<>ans; }; return true; } template bool InsertArc(ALGraph
&G, DT v,DT w) // 增加边(v,w) { ArcNode *p; int i,j; i = LocateVex(G,v); j = LocateVex(G,w); if(i<0||j<0 || i==j) // 顶点不存在或两端点相同,不能插入 { cout<<"\n顶点不存在或两顶点相同,不能插入!"<adjvex==j) { cout<<"边存在,不能插入!"<nextarc; } G.arcnum++; // 边数增 1 p = new ArcNode; p->adjvex = j; p->nextarc = G.vertices[i].firstarc; // (v,w)边结点插在第i条链表表头 G.vertices[i].firstarc = p; p = new ArcNode; p->adjvex = i; // (w,v)边结点插在第j链表表头 p->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p; return true; } template bool DeleteArc(ALGraph
&G, DT v,DT w) // 删除边(v,w) { ArcNode *p,*q; int i,j; cout<<"Hello DeleteArc!"<adjvex!=j) // p 不空且 p 指向的不是待删弧结点 { q = p; p = p->nextarc; } if(p&&p->adjvex ==j) // 找到边(v,w) { if(p == G.vertices[i].firstarc) // 第 1 个边结点 { G.vertices[i].firstarc = p->nextarc; } else // 非第 1 个边结点 { q->nextarc = p->nextarc; } delete p; G.arcnum--; p = G.vertices[j].firstarc; while(p&&p->adjvex!=i) // p不空且q指向的不是待删弧结点 { q = p; p = p->nextarc; } if(p == G.vertices[j].firstarc) // 第 1 个边结点 { G.vertices[j].firstarc = p->nextarc; } else // 非第1个边结点 { q->nextarc = p->nextarc; } delete p; } cout<<"Bye-bye DeleteArc!"< bool DeleteVex(ALGraph
&G, DT v) // 删除顶点v { int i,j; ArcNode *p; DT w; i = LocateVex(G,v); if(i<0) { cout<<"顶点不存在!"<adjvex; GetVex(G,j,w); DeleteArc(G,v,w); p=G.vertices[i].firstarc; } for(j=i+1;j void DFS(ALGraph
G, int v) // 连通图的深度优先遍历 { int w; visited[v] = true; // 标识已访问 cout<=0;w=NextAdjVex(G,v,w)) // 遍历v的邻接点w { if(!visited[w]) // 未访问,调用DFS DFS(G,w); } } // 算法6.9 template void DFSTraverse(ALGraph
G) // 邻接表存储的图的深度优先遍历 { int i ; for(i = 0;i void BFS(ALGraph
G, int v) // 连通图的广度优先遍历 { int w; ArcNode *p; LinkQueue Q; InitQueue(Q); cout<adjvex; if(!visited[w]) { cout<nextarc; } } } template bool BFSTraverse(ALGraph
G) // 邻接表存储的图的广度优先遍历 { int i; for(i = 0;i