题目描述
从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:
(1)计算结点的出度、入度以及度;
(2) 从第一个顶点出发,求一个深度优先遍历序列;
(3) 从第一个顶点顶点出发,求一个广度优先遍历序列。
注意:以用户输入各个顶点的顺序为顶点的序号。
在深度和广度优先遍历中,优先选择序号小的顶点。
图的领结矩阵的数据类型描述如下
#define MAX 20 // 最大顶点个数
typedef struct {
int arcs[MAX][MAX]; //边信息
int visit[MAX]; //顶点信息
char vex[MAX];
int vexnum; //顶点数目
int arcnum; //边数目
}AdjMatrix; //领接矩阵
用邻结矩阵创建无向网
void Creat(AdjMatrix * x) {
int i, j , k, vex1, vex2;
char Vex1,Vex2;
scanf("%d %d",&x->vexnum, &x->arcnum);
getchar();
//printf("%d %d\n",x->vexnum, x->arcnum);
for (i = 1; i <= x->vexnum; i++) {
for (j = 1; j <= x->vexnum; j++ ) {
x->arcs[i][j] = 0;
}
}
for(i = 1; i <= x->vexnum; i++){
scanf("%c",&x->vex[i]);
}
// for(i = 1; i <= x->vexnum; i++){
// printf("%c",x->vex[i]);
// }
getchar();
for( i = 0; i< x-> arcnum; i++) {
scanf("%c%c",&Vex1,&Vex2);
vex1 = Vex1 - 64;
vex2 = Vex2 - 64;
getchar();
x->arcs[vex1][vex2] = 1;
}
}
深度优先搜索
void dfs(AdjMatrix * x,int x1) {
printf("%c",x->vex[x1]);
x->visit[x1] = 1;
for(int i = 1; i <= x->vexnum; i++) {
if(!x->visit[i]&&x->arcs[x1][i] == 1)
dfs(x,i);
}
}
广度优先搜索
int FirstAdj(AdjMatrix *G,int Vo){
for(int i = 1;i<=G->vexnum;i++){
if(G->arcs[Vo][i]==1&&G->visit[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->visit[i]!=1){
return i;
}
}
return -1;
}
void BFS(AdjMatrix *G,int Vo){
/*类似于层次遍历*/
printf("%c",G->vex[Vo]);
G->visit[Vo]= 1;
Queue *Q = (Queue *)malloc(sizeof(Queue));
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->visit[w]){
printf("%c",G->vex[w]);
G->visit[w] = 1;
Q->front++;
Q->vex[Q->front] = w;
}
w = NextAdj(G,Vo,w);
}
}
}
完整代码
#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef struct SqStack{
int vex[MAX];
int front;
int rear;
}Queue;
typedef struct {
int arcs[MAX][MAX];
int visit[MAX];
char vex[MAX];
int vexnum;
int arcnum;
}AdjMatrix;
void Creat(AdjMatrix * x) {
int i, j , k, vex1, vex2;
char Vex1,Vex2;
scanf("%d %d",&x->vexnum, &x->arcnum);
getchar();
//printf("%d %d\n",x->vexnum, x->arcnum);
for (i = 1; i <= x->vexnum; i++) {
for (j = 1; j <= x->vexnum; j++ ) {
x->arcs[i][j] = 0;
}
}
for(i = 1; i <= x->vexnum; i++){
scanf("%c",&x->vex[i]);
}
// for(i = 1; i <= x->vexnum; i++){
// printf("%c",x->vex[i]);
// }
getchar();
for( i = 0; i< x-> arcnum; i++) {
scanf("%c%c",&Vex1,&Vex2);
vex1 = Vex1 - 64;
vex2 = Vex2 - 64;
getchar();
x->arcs[vex1][vex2] = 1;
}
}
void initialise(AdjMatrix *G){
for(int i = G->vexnum;i>=1;i--){
G->visit[i] = 0;
}
}
void dfs(AdjMatrix * x,int x1) {
printf("%c",x->vex[x1]);
x->visit[x1] = 1;
for(int i = 1; i <= x->vexnum; i++) {
if(!x->visit[i]&&x->arcs[x1][i] == 1)
dfs(x,i);
}
}
int FirstAdj(AdjMatrix *G,int Vo){
for(int i = 1;i<=G->vexnum;i++){
if(G->arcs[Vo][i]==1&&G->visit[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->visit[i]!=1){
return i;
}
}
return -1;
}
void BFS(AdjMatrix *G,int Vo){
/*类似于层次遍历*/
printf("%c",G->vex[Vo]);
G->visit[Vo]= 1;
Queue *Q = (Queue *)malloc(sizeof(Queue));
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->visit[w]){
printf("%c",G->vex[w]);
G->visit[w] = 1;
Q->front++;
Q->vex[Q->front] = w;
}
w = NextAdj(G,Vo,w);
}
}
}
int main(void) {
AdjMatrix * x = (AdjMatrix*)malloc(sizeof(AdjMatrix));
Creat(x);
int in[MAX];
int on[MAX];
for (int i = 0; i <= x->vexnum; i++) {
int cnt = 0 ,cnt1 = 0;
for (int j = 0; j <= x->vexnum; j++){
if (x->arcs[i][j] == 1) {
cnt++;
}
if (x->arcs[j][i] == 1) {
cnt1++;
}
}
on[i] = cnt;
in[i] = cnt1;
}
for(int i = 1; i <= x->vexnum; i++){
printf("%c %d %d %d\n",x->vex[i],on[i],in[i],in[i]+on[i]);
}
initialise(x);
dfs(x,1);
printf("\n");
initialise(x);
BFS(x,1);
}