#include<iostream> #include<queue> #include<memory.h> #define maxSize 100 using namespace std; struct edgeNode { int dest; //邻接顶点的数组下标 //int weight; 权重 edgeNode* next; }; struct vertexNode { char vertex; edgeNode* link; }; class Graph { private: int vertexNum,edgeNum; vertexNode adjTable[maxSize]; int visited[maxSize]; public: Graph(char a[],int vn,int en) { vertexNum=vn; edgeNum=en; for(int i=0; i<vertexNum; i++) { adjTable[i].vertex=a[i]; adjTable[i].link=NULL; visited[i]=0; } } int getVertexIndex(char v) { for(int i=0; i<vertexNum; i++) { if(adjTable[i].vertex==v) { return i; } } return -1; } void insertEdge(char v1,char v2) { int index1=getVertexIndex(v1); int index2=getVertexIndex(v2); edgeNode* p=new edgeNode(); p->dest=index2; p->next=adjTable[index1].link; adjTable[index1].link=p; } void show() { cout<<"邻接表为:"<<endl; for(int i=0; i<vertexNum; i++) { cout<<adjTable[i].vertex; edgeNode* p=adjTable[i].link; while(p!=NULL) { cout<<"->"; cout<<adjTable[p->dest].vertex; p=p->next; } cout<<endl; } } void DFS(char v) { int index=getVertexIndex(v); cout<<adjTable[index].vertex; visited[index]=1; edgeNode* p=adjTable[index].link; while(p!=NULL) { if(visited[p->dest]==0) { DFS(adjTable[p->dest].vertex); } p=p->next; } } void BFS(char v) { memset(visited,0,sizeof(visited)); //将viseted[]中元素初始化为0 int index=getVertexIndex(v); queue<int> Q; //下标进队列 cout<<adjTable[index].vertex; visited[index]=1; Q.push(index); while(!Q.empty()) { index=Q.front(); Q.pop(); edgeNode* p=adjTable[index].link; while(p!=NULL) { if(visited[p->dest]==0) { cout<<adjTable[p->dest].vertex; visited[p->dest]=1; Q.push(p->dest); } p=p->next; } } } }; int main() { cout<<"请输入图的顶点数、边数:"; int vn,en; cin>>vn>>en; cout<<"请输入各个顶点:"; char a[vn]; for(int i=0; i<vn; i++) { cin>>a[i]; } Graph G(a,vn,en); cout<<"请输入各条边:"<<endl; char v1,v2; for(int i=0; i<en; i++) { cin>>v1>>v2; G.insertEdge(v1,v2); } G.show(); cout<<"请输入遍历起始顶点:"; char init; cin>>init; cout<<"深度遍历:"; G.DFS(init); //先确保viseted[]已初始化归零 cout<<endl; cout<<"广度遍历:"; G.BFS(init); //先确保visited[]已初始化归零 cout<<endl; return 0; } //请输入图的顶点数、边数:4 10 //请输入各个顶点:a b c d //请输入各条边: //a b //a c //a d //b a //b c //c b //c a //c d //d c //d a //邻接表为: //a->d->c->b //b->c->a //c->d->a->b //d->a->c //请输入遍历起始顶点:b //深度遍历:bcda //广度遍历:bcad
原文:https://www.cnblogs.com/zzyf/p/13392626.html