无向图邻接表实现代码 以及深度优先遍历

  1 #include "stdafx.h"
  2 #include <iostream>
  3 #include <new>
  4 #include<queue>
  5 using namespace std;
  6 
  7 typedef char VertexType;
  8 typedef int EdgeType;
  9 const int MAXVEX = 100;
 10 const int INFINITY = 65535;
 11 int  visited[MAXVEX];
 12 class EdgeNode
 13 {
 14 public:
 15     int adjvex;
 16     EdgeType weight;
 17     EdgeNode * next;
 18 };
 19 class VertexNode
 20 {
 21 public:
 22     VertexType data;
 23     EdgeNode *firstedge;
 24 };
 25 
 26 class GraphAdjList
 27 {
 28 public:
 29     VertexNode AdjList[MAXVEX];
 30     int numVertexes,numEdges;//图中当前顶点数和边数
 31 };
 32 
 33 void CreateGraph(GraphAdjList &G)
 34 {
 35     int i,j,k;
 36     EdgeNode *e;
 37     cout<<"输入边数和顶点数"<<endl;
 38     cin>>G.numVertexes>>G.numEdges;
 39     for(i= 0;i!=G.numVertexes;++i)
 40     {
 41         cin>>G.AdjList[i].data;//输入顶点信息
 42         G.AdjList[i].firstedge = NULL;//将边表设置为空表
 43     }
 44     for(k = 0;k<G.numEdges;++k)
 45     {
 46         cout<<"输入边(vi,vj)上的顶点序号:\n";
 47         cin>>i>>j;
 48         //先录入数据i指向j
 49         e = new(nothrow) EdgeNode;
 50         e->adjvex=j;
 51         e->next=G.AdjList[i].firstedge;
 52         G.AdjList[i].firstedge =e;
 53         //再反过来j指向i使用同种方式
 54         e = new(nothrow) EdgeNode;
 55         e->adjvex = i;
 56         e->next=G.AdjList[j].firstedge;
 57         G.AdjList[j].firstedge = e;
 58     }
 59 }
 60 
 61 
 62 
 63 
 64 void DFS(GraphAdjList GL,int i)
 65 {
 66     EdgeNode *p;
 67     visited[i] = true;
 68     cout<<GL.AdjList[i].data<<endl;
 69     p = GL.AdjList[i].firstedge;
 70     while(p)
 71     {
 72         if(!visited[p->adjvex])
 73             DFS(GL,p->adjvex);
 74         p=p->next;
 75     }
 76 }
 77 
 78 void DFSTraverse(GraphAdjList GL)
 79 {
 80     int i;
 81     for(i = 0;i<GL.numVertexes;i++)
 82         visited[i]=false;  //初始化所有的顶点都是未访问的状态
 83     for(i = 0;i!=GL.numVertexes;i++)
 84     {
 85         if(!visited[i])  //如果是连通图,只会执行一次.
 86             DFS(GL,i);
 87     }
 88 }
 89 
 90 
 91 void BFSTraverse(GraphAdjList GL)
 92 {
 93     int i ;
 94     EdgeNode *p;
 95     queue<int> Q;
 96     for(i = 0;i!=GL.numVertexes;i++)
 97         visited[i] = false;
 98     for(i = 0;i!=GL.numVertexes;i++)
 99     {
100         if(!visited[i])
101         {
102             visited[i]= true;
103             cout<<GL.AdjList[i].data<<endl;
104             Q.push(i);
105             while(!Q.empty())
106             {
107                 int i = Q.front();
108                 Q.pop();
109                 p=GL.AdjList[i].firstedge;
110                 while(p)
111                 {
112                     if(!visited[p->adjvex])
113                     {
114                         visited[p->adjvex]=true;
115                          cout<<GL.AdjList[p->adjvex].data;
116                          Q.push(p->adjvex);
117                     }
118                     p=p->next;
119                 }
120             }
121         }
122     }
123 }
124 
125 int _tmain(int argc, _TCHAR* argv[])
126 {
127     GraphAdjList g;
128     return 0 ;
129 }

 

posted @ 2014-03-06 09:52  CrazyCode.  阅读(963)  评论(0编辑  收藏  举报