有向图的创建
用邻接矩阵创建有向图。
邻接矩阵结构体
#define MAXVEX 20
typedef struct
{
int arcs[MAXVEX][MAXVEX]; //边信息
int visited[MAXVEX]; //为遍历准备的标志数组
char vex[MAXVEX];
int vexnum; //顶点数目
int arcnum; //边数目
}AdjMatrix;
创建有向图
int LocateVex(AdjMatrix *G, char v) {
int i;
for (int i = 1; i <= G->vexnum; i++) {
if (G->vex[i] == v) {
return i;
}
}
return 0;
}
void Create(AdjMatrix *G){
int i,j,k,weight;
char Vex1,Vex2;
printf("请输入有向网中的顶点数和边数:\n");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i = 1;i<=G->vexnum;i++){
for(j = 1;j<=G->vexnum;j++){
G->arcs[i][j] = 0;
}
}
printf("请输入有向图中%d个顶点:\n",G->vexnum);
for(i = 1;i<=G->vexnum;i++){
printf("No.%d个顶点:",i);
scanf("%c",&G->vex[i]);
}
printf("请输入有向图的%d条边",G->arcnum);
for(k = 0;k<G->arcnum;k++){
printf("\nNo.%d条边:\n 顶点V",k+1);
scanf("%c",&Vex1);
printf("<--->顶点V");
scanf("%c",&Vex2);
printf("%d %d\n",vex1,vex2);
i = LocateVex(G, Vex1);
j = LocateVex(G, Vex2);
G->arcs[i][j] = 1;
}
}
有向图的遍历
初始化标志数组
void initialise(AdjMatrix *G){
for(int i = 1;i<=G->vexnum;i++){
G->visited[i] = 0;
}
}
找邻接点
第一个邻接点
int FirstAdj(AdjMatrix *G,int Vo){
for(int i = 1;i<=G->vexnum;i++){
if(G->arcs[Vo][i]==1&&G->visited[i]!=1){
return i;
}
}
return -1;
}
找下一个邻接点
int NextAdj(AdjMatrix *G,int Vo,int w){
for(int i = w+1;i<=G->vexnum;i++){
if(G->arcs[Vo][i]==1&&G->visited[i]!=1){
return i;
}
}
return -1;
}
递归的深度优先搜索
void DFS(AdjMatrix *G, int vo){
printf("%c",G->vex[vo]);
visited[vo] = 1;
w = FirstAdj(G, vo);
while(w != -1) {
if (!visited[w]) {
DFS(G, w);
}
w = NextAdj(G, vo, w);
}
}
递归的广度优先搜索
广度优先搜索要用到队列,因此定义队列结构体:
typedef struct SqStack{
int vex[MAXVEX];
int front;
int rear;
}SqQueue;
void BFS(AdjMatrix *G,int vo){
/*类似于层次遍历*/
printf("%c",G->vex[vo]);
G->visited[Vo]= 1;
SqQueue *Q = (SqQueue *)malloc(sizeof(SqQueue));
Q->front = 0;
Q->rear = 0;
Q->front++;
Q->vex[Q->front] =Vo;
while(Q->front-Q->rear!=0){
Vo = Q->vex[Q->front];
Q->rear++;
int w = FirstAdj(G,Vo);
while(w!=-1){
if(!G->visited[w]){
printf("%c",G->vex[w]);
G->visited[w]=1;
Q->front++;
Q->vex[Q->front] = w;
}
w = NextAdj(G,Vo,w);
}
}
}