1 #include"iostream" 2 #include"malloc.h" 3 #include"queue" 4 using namespace std; 5 #define MAX 50 6 typedef struct node{ 7 int adjvex; //拎接点域 8 struct node *next; //链域 9 int weight; 10 }EdgeNode; 11 typedef struct vnode{ 12 int vertex; //顶点域 13 EdgeNode *firstedge;//边表头指针 14 }VertexNode; 15 typedef VertexNode AdjList[MAX]; 16 17 typedef struct{ 18 AdjList adjlist;//邻接表 19 int n; 20 int e; 21 //图中当前顶点和边数 22 }AlGraph; 23 //建立图的邻接表 24 void CreatAlGraph(AlGraph *G){ 25 EdgeNode *s; //定义边表节点 26 int i,j,k; 27 int a; 28 cout<<"请输入顶点边和边数"<<endl; 29 cin>>i>>j; 30 G->n=i; 31 G->e=j; 32 cout<<"请输入顶点编号"<<endl; 33 for(i=0;i<G->n;i++){ 34 cin>>a; 35 G->adjlist[i].vertex=a; 36 G->adjlist[i].firstedge=NULL; 37 } 38 cout<<"请输入由两个顶点构成的边,"<<endl; 39 for(k=0;k<G->e;k++){ 40 cin>>i>>j; 41 s=(EdgeNode*)malloc(sizeof(EdgeNode)); 42 s->adjvex=j; 43 s->next=G->adjlist[i].firstedge; 44 G->adjlist[i].firstedge=s;//将新节点s插入顶点BI的边表头部 45 /*若建立无向图,则添加下面的代码*/ 46 s=(EdgeNode*)malloc(sizeof(EdgeNode)); 47 s->adjvex=i; 48 s->next=G->adjlist[j].firstedge; 49 G->adjlist[j].firstedge=s; 50 } 51 } 52 //深度优先算法 53 bool visited[MAX]; 54 void DFS(AlGraph *G,int i){//以VI为出发点对邻接表的进行DFS 55 EdgeNode *p; 56 cout<<G->adjlist[i].vertex; 57 visited[i]=true; 58 p=G->adjlist[i].firstedge; 59 while(p){ 60 if(!visited[p->adjvex]) 61 DFS(G,p->adjvex); 62 p=p->next; 63 } 64 } 65 void DepthFirstsearch(AlGraph *G,int v){ 66 for(int i=0;i<G->n;i++) 67 visited[i]=false; 68 DFS(G,v); 69 } 70 void BFS(AlGraph *G,int v){ 71 EdgeNode *p; 72 queue<int>Q; 73 visited[v]=true; 74 Q.push(v); 75 while(!Q.empty()){ 76 int v=Q.front(); 77 cout<<v; 78 Q.pop(); 79 p=G->adjlist[v].firstedge; 80 while(p){ 81 if(!visited[p->adjvex]){ 82 visited[p->adjvex]=true; 83 Q.push(p->adjvex); 84 } 85 p=p->next; 86 } 87 } 88 } 89 void BFSEARCH(AlGraph *G,int v){ 90 for(int i=0;i<G->n;i++) 91 visited[i]=false; 92 BFS(G,v); 93 } 94 int main(){ 95 AlGraph *G=(AlGraph*)malloc(sizeof(AlGraph)); 96 CreatAlGraph(G); 97 DepthFirstsearch(G,0); 98 cout<<endl; 99 BFSEARCH(G,0); 100 return 0; 101 }