邻接矩阵

  1 #include<stdio.h>

  2 #include<stdlib.h>

  3 #define OK 1

  4 #define TRUE 1

  5 #define FALSE 0

  6 #define ERROR -1

  7 #define OVERFLOW -2

  8 #define MAX_VERTEX_NUM 20

  9 bool visited[MAX_VERTEX_NUM];

 10 typedef int QElemint;

 11 typedef int Status;

 12 //定义队列数据结构 

 13 typedef struct QNode

 14 {

 15     QElemint data;

 16     QNode *next;

 17 }QNode,*QueuePtr;

 18 typedef struct

 19 {

 20     QueuePtr front;

 21     QueuePtr rear;

 22 }LinkQueue;

 23 Status InitQueue(LinkQueue &Q)

 24 {

 25     Q.front=Q.rear=new QNode;

 26     if(!Q.front) exit(OVERFLOW);

 27     Q.front->next=NULL;

 28     return OK;

 29 }

 30 Status EnQueue(LinkQueue &Q,QElemint e)

 31 {

 32     QueuePtr p;

 33     p=new QNode;

 34     if(!p) exit(OVERFLOW);

 35     p->data=e;

 36     p->next=NULL;

 37     Q.rear->next=p;

 38     Q.rear=p;

 39     return OK;

 40 } 

 41 Status DeQueue(LinkQueue &Q,QElemint &e)

 42 {

 43     QueuePtr p;

 44     if(Q.front==Q.rear) return ERROR;

 45     p=Q.front->next;

 46     e=p->data;

 47     Q.front->next=p->next;

 48     if(Q.rear==p) Q.rear=Q.front;

 49     free(p);

 50     return OK;

 51 }

 52 Status QueueEmpty(LinkQueue Q)

 53 {

 54     if(Q.front==Q.rear) return TRUE;

 55     return FALSE;

 56 }

 57 //定义邻接矩阵数据结构 

 58 typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

 59 typedef struct

 60 {

 61     char vexs[MAX_VERTEX_NUM];

 62     AdjMatrix arcs;

 63     int vexnum,arcnum;

 64 }MGraph;

 65 Status CreateMGraph(MGraph &G)//构造一个图型存储结构 

 66 {

 67     int i,j,k;

 68     puts("请输入构成图的顶点个数和边数:"); 

 69     scanf("%d%d%*c",&G.vexnum,&G.arcnum);

 70     puts("请输入顶点数值:"); 

 71     for(i=0;i<G.vexnum;i++)

 72        scanf("%c",&G.vexs[i]);

 73     for(i=0;i<G.vexnum;i++)

 74         for(j=0;j<G.vexnum;j++)

 75            G.arcs[i][j]=0;

 76     puts("请依次输入边(Vi,Vj)的顶点序号:");

 77     for(k=0;k<G.arcnum;++k)

 78     {

 79         scanf("%d%d",&i,&j);

 80         G.arcs[i][j]=1;

 81         G.arcs[j][i]=G.arcs[i][j];

 82     }

 83     return OK;

 84 }

 85 int FirstAdjVex(MGraph G,int v)

 86 {

 87     int i;

 88     for(i=0;i<G.vexnum;i++)

 89         if(G.arcs[v][i]==1) return i;

 90         return ERROR;

 91 }

 92 int NextAdjVex(MGraph G,int v,int w)

 93 {

 94     for(int i=w+1;i<G.vexnum;i++)

 95     if(G.arcs[v][i]==1)  return i;

 96     return ERROR; 

 97 } 

 98 void DFS(MGraph G,int v)

 99 {

100     int w;

101     printf("%c ",G.vexs[v]);

102     visited[v]=TRUE;

103     for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))

104        if(!visited[w]) DFS(G,w);

105 }

106 Status DFSTraverse(MGraph G)  //深度优先搜索

107 {

108     int v;

109     for(v=0;v<G.vexnum;++v)

110         visited[v]=FALSE;

111     for(v=0;v<G.vexnum;++v)

112        if(!visited[v]) 

113             DFS(G,v);

114     return OK;

115 }    

116 Status BFSTraverse(MGraph G)//广度优先搜索

117 {

118     int u,v,w;

119     LinkQueue Q;

120     for(v=0;v<G.vexnum;++v)

121        visited[v]=FALSE;

122     InitQueue(Q);

123     for(v=0;v<G.vexnum;++v)

124        if(!visited[v])

125        {

126             visited[v]=TRUE;

127             printf("%c ",G.vexs[v]); 

128             EnQueue(Q,v);

129             while(!QueueEmpty(Q))

130             {

131                 DeQueue(Q,u);

132                 for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))

133                    if(!visited[w])

134                    {

135                         visited[w]=TRUE;

136                         printf("%c ",G.vexs[w]); 

137                         EnQueue(Q,w);

138                    }

139             }

140         }

141         return OK;

142 }

143 Status main()

144 {

145     MGraph G;

146     CreateMGraph(G);   //构造一个图型存储结构 

147     puts("邻接矩阵的深度优先遍历为:");

148     DFSTraverse(G); //深度优先搜索

149     puts("\n邻接矩阵的广度优先遍历为:");

150     BFSTraverse(G); //广度优先搜索 

151     putchar('\n');      

152     system("pause");

153     return OK; 

154 }

你可能感兴趣的:(矩阵)