#include <iostream> #include <queue> using namespace std; const int num=100; bool flag[num]={false}; struct EdgeNode; struct AdjList{ char vextex; EdgeNode* next; }; //顶点表 struct EdgeNode{ int adjvex; EdgeNode* next; }; //边表 struct Graph{ int VertexNum; //顶点数 int SideNum; //边数 AdjList adjlist[num]; }; void CreateGraph(Graph *G) { cout<<"Please input the number of vertex and side:"; cin>>G->VertexNum>>G->SideNum; cout<<"Please the information of vertexs:"; for (int i=0;i<G->VertexNum;++i) { cin>>G->adjlist[i].vextex; G->adjlist[i].next=NULL; } cout<<"Please input each two vertexs of each side:"<<endl; int vertex1,vertex2; EdgeNode *e; for (i=0;i<G->SideNum;++i) { cout<<"Input two vertexs(the number must in 0~"<<G->VertexNum-1<<")" <<"of the "<<i+1<<" side:"; cin>>vertex1>>vertex2; e=new EdgeNode; e->adjvex=vertex2; EdgeNode *temp1=G->adjlist[vertex1].next; if (temp1==NULL) { temp1=G->adjlist[vertex1].next; e->next=temp1; G->adjlist[vertex1].next=e; } else { while(temp1->next!=NULL) temp1=temp1->next; e->next=temp1->next; temp1->next=e; } e=new EdgeNode; EdgeNode *temp2=G->adjlist[vertex2].next; e->adjvex=vertex1; if (temp2==NULL) { temp2=G->adjlist[vertex2].next; e->next=temp2; G->adjlist[vertex2].next=e; } else { while(temp2->next!=NULL) temp2=temp2->next; e->next=temp2->next; temp2->next=e; } //e->next=G->adjlist[vertex1].next; //G->adjlist[vertex1].next=e; //e->adjvex=vertex1; //e->next=G->adjlist[vertex2].next; //G->adjlist[vertex2].next=e; } } /******************************************************/ /* 深度优先遍历(深度优先搜索) /******************************************************/ void DFSM(Graph *G,int i) { cout<<"DFS Visit the vertex:"<<G->adjlist[i].vextex<<endl; flag[i]=true; EdgeNode* e=G->adjlist[i].next; while (e!=NULL) { if(!flag[e->adjvex]) DFSM(G,e->adjvex); e=e->next; } } void DFSTraver(Graph *G) { for (int i=0;i<G->VertexNum;++i) { flag[i]=false; } for ( i=0;i<G->VertexNum;++i) { if (!flag[i]) { DFSM(G,i); } } } /******************************************************/ /* 广度优先遍历(广度优先搜索) /******************************************************/ void BFSM(Graph* G,int i) { cout<<"BFS Visit the vertex:"<<G->adjlist[i].vextex<<endl; flag[i]=true; queue<int> qDate; qDate.push(i); EdgeNode *e; while (qDate.size()!=0) { int temp=qDate.front(); qDate.pop(); e=G->adjlist[temp].next; while (e!=NULL) { if (!flag[e->adjvex]) { cout<<"BFS Visit the vertex:"<<G->adjlist[e->adjvex].vextex<<endl; flag[e->adjvex]=true; qDate.push(e->adjvex); } e=e->next; } } } void BFSTraver(Graph *G) { for (int i=0;i<G->VertexNum;++i) { flag[i]=false; } for (i=0;i<G->VertexNum;i++) { if (!flag[i]) { BFSM(G,i); } } } /******************************************************/ /* 打印邻接表 /******************************************************/ void PrintAdjList(Graph* G) { int i=0; while (i<G->VertexNum) { EdgeNode *e=G->adjlist[i].next; cout<<G->adjlist[i].vextex<<"->"; while (e) { cout<<G->adjlist[e->adjvex].vextex<<"->"; e=e->next; } cout<<"NULL"; cout<<endl; ++i; } } int main() { Graph *G=new Graph; CreateGraph(G); cout<<"Ouput The adject list:"<<endl; PrintAdjList(G); DFSTraver(G); cout<<"----------------"<<endl; BFSTraver(G); return 0; }