void BFS(AMGraph G, int v){ Queue* Q=initQueue(); printf("%c",G.vexs[v]); visited[v]=1; enQueue(Q,v); while(!isEmpty(Q)){ int i=deQueue(Q); int j; for(j=FirstAdjVex(G, i); j>=0; j=NextAdjVex(G,i,j)) if(!visited[j]){ printf("%c",G.vexs[j]); visited[j]=1; enQueue(Q,j); } } }
时间: 2024-02-04 09:02:44 浏览: 81
这是一个广度优先搜索算法的实现,用于遍历邻接矩阵表示的图G,从顶点v开始搜索并输出遍历结果。其中,initQueue()是初始化队列的函数,enQueue(Q,v)是将顶点v入队操作,deQueue(Q)是出队操作,isEmpty(Q)判断队列是否为空,FirstAdjVex(G, i)是获取顶点i的第一个邻接点,NextAdjVex(G,i,j)是获取顶点i在顶点j之后的下一个邻接点。在搜索过程中,用visited数组标记已访问的顶点,以避免重复访问。
相关问题
#include<stdio.h> #include<stdlib.h> Typedef struct Graph{ Char* vexs; Int** arcs; Int vexnum,arcnum; )Graph; Graph* initGraph(int vexnum){ Graph* G=(Graph*)malloc(sizeof(Graph)) G->vexs=(char*)malloc(sizeof (char)*vexnum) G->arcs=(int**)malloc(sizeof (int*)*vexnum) For(int i=0;i<vexnum;I++) { G->arcs[i]= (int*)malloc(sizeof (int)*vexnum)} G->vexnum=Vexnum; G->arcnum=0; Return G } Int createGraph(Graph* G,char* vexs,int* arcs) {for(i=0;i<G->vexnum;i++) G->vexs[i]=vexs[i]; For((j=0;j<G->vexnum;j++) G->arcs[i][j]=*(arcs+i*vexnum+j ) If(G->arcs[i][j]!=0) G->arcnum++; } G->arcnum/=2; } Void DFS(Graph* G,int *visit,int index){ Printf("%c",G->vexs[index]) Visit[index]=1; For(int i=0;i<G->vexnum;i++) If(G->arcs[index][i]==1&&visit[index]!=1) DFS(G,visit,i) } Void BFS(Graph* G,int *visit ,int index){ Printf("%c",&G->vexs[index]) Visit[index]=1; Queue* initQueue(); enQueue(Q,index); while(!isEmpty(Q)) int i=deQueue(); For(int j=0;j<G->vexnum;J++) If(G->arcs[i][j]==1&&!visit[j]) Printf("%c",G->vexs[j]) Visit[j]=1; enQueue(Q,j);} } #define MAXSIZE 5 Typedef struct Queue{ Int front Int rear Int data[MAXSIZE] }Queue; Queue* Q InitQueue() { Queue* Q=(Queue*)malloc(sizeof(QUeue)); Queue->front=Queue->rear=0; Return Q; } Int enQueue(Queue* Q, int data) If (isFull(Q)){ Return 0} Else Q->data[Q->rear]=data; Q->rear=(Q->rear+1)%MAXSIZE } Int deQueue(Queue* Q) If (isempty(Q)){ Return 0} Else Int data=Q->data[Q->front]; Q->front=(Q->front+1)%MAXSIZE Return data; } Void printfQueue(Queue* Q){ Int length=(Q->rea-Q->front+MAXSIZE)%MAXSIZE For(int i=0;i<length;i++) Printf("%d->",Q->data[Q->front]) Q->front=(Q->front+1)%MAXSIZE; Int main(){ Graph* G=initGraph(5); Int arcs[5][5]={ 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, }; CreateGraph(*G,"ABCDE",(int*)arcs); Int* visit=(int*)malloc(sizeof(int)*G->vexnum); For(int i=0;i<G->vexnum;i++) Visit[i]=0; DFS(G,visit,0); BFS(G,visit,0) }修改正确并转化为c语言代码
抱歉,您提供的代码已经是C语言代码。不过,代码中存在一些拼写错误和语法错误,我给您修正一下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
typedef struct Graph{
char* vexs;
int** arcs;
int vexnum, arcnum;
}Graph;
Graph* initGraph(int vexnum) {
Graph* G = (Graph*)malloc(sizeof(Graph));
G->vexs = (char*)malloc(sizeof(char) * vexnum);
G->arcs = (int**)malloc(sizeof(int*) * vexnum);
for(int i = 0; i < vexnum; i++) {
G->arcs[i] = (int*)malloc(sizeof(int) * vexnum);
}
G->vexnum = vexnum;
G->arcnum = 0;
return G;
}
int createGraph(Graph* G, char* vexs, int* arcs) {
for(int i = 0; i < G->vexnum; i++) {
G->vexs[i] = vexs[i];
for(int j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = *(arcs + i * G->vexnum + j);
if(G->arcs[i][j] != 0) {
G->arcnum++;
}
}
}
G->arcnum /= 2;
}
typedef struct Queue{
int front;
int rear;
int data[MAXSIZE];
}Queue;
Queue* initQueue() {
Queue* Q = (Queue*)malloc(sizeof(Queue));
Q->front = Q->rear = 0;
return Q;
}
int isFull(Queue* Q) {
if((Q->rear + 1) % MAXSIZE == Q->front) {
return 1;
} else {
return 0;
}
}
int isEmpty(Queue* Q) {
if(Q->front == Q->rear) {
return 1;
} else {
return 0;
}
}
int enQueue(Queue* Q, int data) {
if(isFull(Q)) {
return 0;
} else {
Q->data[Q->rear] = data;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
}
int deQueue(Queue* Q) {
if(isEmpty(Q)) {
return 0;
} else {
int data = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return data;
}
}
void printfQueue(Queue* Q) {
int length = (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
for(int i = 0; i < length; i++) {
printf("%d->", Q->data[Q->front]);
Q->front = (Q->front + 1) % MAXSIZE;
}
}
void DFS(Graph* G, int* visit, int index){
printf("%c", G->vexs[index]);
visit[index] = 1;
for(int i = 0; i < G->vexnum; i++) {
if(G->arcs[index][i] == 1 && visit[i] != 1) {
DFS(G, visit, i);
}
}
}
void BFS(Graph* G, int* visit ,int index) {
printf("%c", G->vexs[index]);
visit[index] = 1;
Queue* Q = initQueue();
enQueue(Q, index);
while(!isEmpty(Q)) {
int i = deQueue(Q);
for(int j = 0; j < G->vexnum; j++) {
if(G->arcs[i][j] == 1 && !visit[j]) {
printf("%c", G->vexs[j]);
visit[j] = 1;
enQueue(Q, j);
}
}
}
}
int main() {
Graph* G = initGraph(5);
int arcs[5][5] = {
{0, 1, 1, 1, 0},
{0, 1, 1, 1, 0},
{0, 1, 1, 1, 0},
{0, 1, 1, 1, 0},
{0, 1, 1, 1, 0}
};
createGraph(G, "ABCDE", (int*)arcs);
int* visit = (int*)malloc(sizeof(int) * G->vexnum);
for(int i = 0; i < G->vexnum; i++) {
visit[i] = 0;
}
DFS(G, visit, 0);
printf("\n");
for(int i = 0; i < G->vexnum; i++) {
visit[i] = 0;
}
BFS(G, visit, 0);
printf("\n");
return 0;
}
```
实现无向图邻接矩阵的创建,并实现无向图邻接矩阵方式存储的广度优先遍历的算法,转换成程序并用C语言实现; //用两个数组分别存储顶点表和邻接矩阵 #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph;
以下是C语言实现无向图邻接矩阵的创建和广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct {
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
} AMGraph;
typedef struct {
int data[MVNum];
int front, rear;
} Queue;
void InitQueue(Queue *Q) {
Q->front = Q->rear = 0;
}
int QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
return 1;
} else {
return 0;
}
}
void EnQueue(Queue *Q, int x) {
Q->data[Q->rear++] = x;
}
int DeQueue(Queue *Q) {
return Q->data[Q->front++];
}
void CreateGraph(AMGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:");
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = MaxInt;
}
}
printf("请输入边的信息:\n");
for (k = 0; k < G->arcnum; k++) {
printf("请输入第%d条边的起点和终点:", k + 1);
scanf("%d%d", &i, &j);
printf("请输入第%d条边的权值:", k + 1);
scanf("%d", &G->arcs[i][j]);
G->arcs[j][i] = G->arcs[i][j]; // 无向图对称
}
}
void BFS(AMGraph G, int v, int visited[]) {
int i, u;
Queue Q;
InitQueue(&Q);
visited[v] = 1;
printf("%c ", G.vexs[v]);
EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
u = DeQueue(&Q);
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[u][i] != MaxInt && !visited[i]) {
visited[i] = 1;
printf("%c ", G.vexs[i]);
EnQueue(&Q, i);
}
}
}
}
void BFSTraverse(AMGraph G) {
int i;
int visited[MVNum];
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
}
int main() {
AMGraph G;
CreateGraph(&G);
printf("广度优先遍历结果为:");
BFSTraverse(G);
return 0;
}
```
注意:以上代码中的 `VerTexType` 和 `ArcType` 分别表示顶点数据类型和边权值类型,但这里并没有用到它们的具体定义,因此可以根据实际情况进行修改。另外,上面的代码中使用了一个队列来实现广度优先遍历,这里我们采用了循环队列的方式来实现。
阅读全文