嘻嘻,好高兴,自己一个人咬着牙挺到了现在,我已走了这么远的路
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define MVN 20
#define Maxint 32767
#define MAXSIZE 20
typedef int QElemTypes;
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
QElemTypes* base;
int front;
int rear;
int length;
}SqQueue,SQueue;
typedef struct
{
VerTexType Vexs[MVN];
ArcType Arcs[MVN][MVN];
int Vexnum,Arcnum;
_Bool visited[MVN];
}AMGraph;
int get_first(AMGraph* G, VerTexType* v);
int GetVertex(AMGraph* G);
int LocateVex(AMGraph* G,VerTexType v);
int Create_visited(AMGraph* G);
int FirstAdjVex(AMGraph* G, int u);
int NextAdjVex(AMGraph* G, int u, int w);
int InitQueue(SqQueue* Q);
int InitQueue(SqQueue* Q)
{
Q->base = (QElemTypes*)malloc(sizeof(QElemTypes)*MAXSIZE);
if(!Q->base) return 0;
Q->front = Q->rear = 0;
return 1;
}
int EnQueue(SqQueue* Q, QElemTypes e)
{
if(!Q->base || (Q->rear + 1)%MAXSIZE ==Q->front)
return 0;
Q->base[Q->rear] = e;
Q->rear = (Q->rear + 1)%MAXSIZE;
Q->length++;
return 1;
}
int DeQueue(SqQueue* Q, QElemTypes* e)
{
if(!Q->base || Q->rear == Q->front) return 0;
(*e) = Q->base[Q->front];
Q->front = (Q->front + 1)%MAXSIZE;
Q->length--;
return 1;
}
int Traverse(SqQueue* Q)
{
if(!Q->base || Q->rear == Q->front)
{
printf("队空,你出个锤子?!\n");
return 0;
}
int temp = Q->front;
for(int i = 0;temp != Q->rear;i++)
{
printf("队员%d的值为:%d\n",i,Q->base[Q->front]);
temp = (temp + 1)%MAXSIZE;
}
return 1;
}
int DestroyQueue(SqQueue* Q)
{
if(!Q->base) return 0;
free(Q->base);
Q->length = 0;
return 1;
}
int ClearQueue(SqQueue* Q)
{
if(!Q->base) return 0;
for (int i = 0; i < MAXSIZE; i++)
{
Q->base[i] = 0;
}
Q->length = 0;
return 1;
}
int QueueEmpty(SqQueue* Q)
{
if(!Q->base || Q->front != Q->rear) return 0;
return 1;
}
int QueueLength(SqQueue* Q)
{
if(!Q->base) return 0;
return Q->length;
}
int GetHead(SqQueue* Q,QElemTypes* e)
{
if(!Q->base) return 0;
return (*e) = Q->base[Q->front];
}
int CreateUDN(AMGraph* G)
{ VerTexType v1;
VerTexType v2;
int weight;
printf("输入顶点的数量:\n");
scanf("%d",&(*G).Vexnum);
printf("输入边的数量:\n");
scanf("%d",&(*G).Arcnum);
for(int i = 0; i< (*G).Vexnum; i++)
{
for(int j = 0; j < (*G).Vexnum; j++)
(*G).Arcs[i][j] = 0;
}
GetVertex(G);
for (int k = 0; k < (*G).Arcnum; k++)
{ printf("哪两个顶点之间是连通的?\n");
printf("顶点1:\n");
get_first(G,&v1);
printf("顶点2:\n");
get_first(G,&v2);
int i = LocateVex(G,v1);
int j = LocateVex(G,v2);
(*G).Arcs[i][j] = 1;
(*G).Arcs[j][i] = (*G).Arcs[i][j];
}
return 1;
}
int GetVertex(AMGraph* G)
{
for (int i = 0; i <(*G).Vexnum; i++)
{ printf("输入顶点的值:\n");
get_first(G,&(*G).Vexs[i]);
}
}
int LocateVex(AMGraph* G,VerTexType v)
{
if(sizeof(*G) == 0) return 0;
for(int i = 0; i < MVN; i++)
{
if((*G).Vexs[i] == v)
return i;
}
return 0;
}
int get_first(AMGraph* G, VerTexType* v)
{ scanf("%d",EOF);
(*v) = getchar();
while(getchar() != '\n')
continue;
return 1;
}
int Create_visited(AMGraph* G)
{
if(sizeof(*G) == 0) return 0;
for(int i = 0; i< MVN;i++)
(*G).visited[i] = false;
return 1;
}
void BFS(AMGraph* G, int v, SqQueue* Q)
{
printf("BFS1:%c\n",(*G).Vexs[v]);
(*G).visited[v] = true;
InitQueue(Q);
EnQueue(Q,v);
int u;
while(!QueueEmpty(Q))
{
DeQueue(Q,&u);
for(int w = FirstAdjVex(G,u); w < (*G).Vexnum; w = NextAdjVex(G, u, w))
{
if(!(*G).visited[w])
{
printf("BFS2:%c\n",(*G).Vexs[w]);
printf("w==%d\n",w);
(*G).visited[w] = true;
EnQueue(Q,w);
}
}
}
}
int FirstAdjVex(AMGraph* G, int u)
{
if(sizeof((*G)) == 0) return 0;
for(int j = 0; ; j++)
if( (*G).Arcs[u][j] != 0 && !(*G).visited[j])
return j;
}
int NextAdjVex(AMGraph* G, int u, int w)
{
if(sizeof((*G)) == 0) return 0;
for(int j = w; ; j++)
if((*G).Arcs[u][j] != 0 && !(*G).visited[j])
return j;
}
int main()
{
SqQueue Q;
AMGraph G;
CreateUDN(&G);
Create_visited(&G);
BFS(&G,0,&Q);
return 0;
}