/*----------------------图的邻接表示存储------------------------*/ //无向图 #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; } //cout<<"请输入每条边两个邻接点: "<>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; //插在表头 G.vertices[i].firstarc = p; p = new ArcNode; //创建一个新的弧结点 p->adjvex = i; p->nextarc = G.vertices[j].firstarc; //插在表头 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) { if(k<0||k>=G.vexnum) //顶点不存在 return false; v=G.vertices[k].data; return true; } template bool PutVex(ALGraph
&G, DT &u,DT v) { int k = LocateVex(G,u); if(k<0) //该顶点不存在 return false; G.vertices[k].data = v; return true; } template int FirstAdjVex(ALGraph
G, int u) { ArcNode * p; if(u<0 || u>=G.vexnum) // 顶点不存在 return -1; p = G.vertices[u].firstarc;//p指向下标为i的第一个邻接点 if(p) { return p->adjvex; } else { return -1; } } template int NextAdjVex(ALGraph
G, int u,int w) { ArcNode *p; if(u<0 || u>=G.vexnum || w<0 || w>=G.vexnum ) // 参数不合理 return -1; p = G.vertices[u].firstarc; while(p &&(p->adjvex!=w)) //让p指向顶点w { p = p->nextarc; } if(!p||!p->nextarc) //没找到w或w是最后一个顶点 return -1; else //找到w且w不是最后一个顶点 { 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) { 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++; 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) { ArcNode *p,*q; int i,j; cout<<"Hello DeleteArc!"<adjvex!=j) // p不空且p指向的不是待删弧结点 { q = p; p = p->nextarc; } if(p&&p->adjvex ==j) // 找到边 { 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) { int i,j; ArcNode *p; DT w; i = LocateVex(G,v); cout<<"将删除第"<adjvex; cout<<"删除边顶点序号为:"< void DFS(ALGraph
G, int v) { int w; visited[v] = true; // 已访问 cout<=0;w=NextAdjVex(G,v,w)) { if(!visited[w]) 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