1. 无向图的基本操作
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 60
#define datatype char
struct MGraph
{
datatype Vex[MAXSIZE];
int Edge[MAXSIZE][MAXSIZE];
int vexnum,arcnum;
};
struct Queue
{
int data[MAXSIZE];
int rear;
int front;
};
void InitGraph(MGraph &G);
void CreateGraph(MGraph &G);
bool IsVexExist(MGraph G,datatype v1,datatype v2,int flag[]);
void ShowGraph(MGraph G);
void BeforeBFS(MGraph G);
void InitQueue(Queue &queue);
void EnQueue(Queue &queue,int flag);
int ExQueue(Queue &queue);
int GetIndexOfStart(MGraph G,datatype start);
void BFS(MGraph G,Queue &queue,int mark[]);
void DFS(MGraph G,int v,int mark[]);
void BeforeDFS(MGraph G);
int ExQueue(Queue &queue){
if(queue.front>queue.rear)
return -1;
return queue.data[queue.front++];
}
void EnQueue(Queue &queue,int flag){
if(queue.rear==MAXSIZE-1)
return;
queue.data[queue.rear++] = flag;
}
void InitQueue(Queue &queue){
queue.front = queue.rear = 0;
}
void InitGraph(MGraph &G){
for(int i = 0;i<MAXSIZE;i++){
for (int j = 0; j < MAXSIZE; j++)
{
G.Edge[i][j] = 0;
}
}
G.vexnum = 0;
G.arcnum = 0;
}
bool IsVexExist(MGraph G,datatype v1,datatype v2,int flag[]){
bool IV1 = false,IV2 = false;
int f = 0;
for(int i = 0;i<G.vexnum;i++){
if(G.Vex[i] == v1)
{
IV1 = true;
flag[f++] = i;
}
if(G.Vex[i] == v2)
{
IV2 = true;
flag[f++] = i;
}
}
return IV1&&IV2;
}
void CreateGraph(MGraph &G){
int Vexnum,Arcnum;
printf("------Undirected Graph------\n");
printf("Please Input the number of Vex and Edge: ");
scanf("%d %d",&Vexnum,&Arcnum);
getchar();
if(Vexnum>MAXSIZE||Arcnum>(Vexnum-1)*Vexnum)
{
printf("Maximum value exceeded, please try again\n");
CreateGraph(G);
return;
}
for(int i =0;i<Vexnum;i++){
printf("Please Input %d-th Vex : ",(i+1));
scanf("%c",&G.Vex[i]);
getchar();
G.vexnum++;
}
for(int i = 0;i < Arcnum; i++){
datatype v1,v2;
int weight;
printf("Please Input %d-th Edge : ",(i+1));
scanf("%c %c %d",&v1,&v2,&weight);
getchar();
if(v1==v2){
printf("Input Error,Please Try Again!\n");
i--;
continue;
}
int flag[2];
if(IsVexExist(G,v1,v2,flag))
{
G.Edge[flag[0]][flag[1]] = weight;
G.Edge[flag[1]][flag[0]] = weight;
G.arcnum++;
}
else{
printf("The Vex You Input is not Existed,Please Input Again!\n");
i--;
}
}
ShowGraph(G);
}
void ShowGraph(MGraph G){
printf("\nAdjacent Matrix : \n ");
for (int i = 0; i < G.vexnum; i++)
{
printf(" %c",G.Vex[i]);
}
printf("\n");
for(int i =0;i<G.vexnum;i++){
printf("%c ",G.Vex[i]);
for (int j = 0; j < G.vexnum; j++)
{
printf("%d ",G.Edge[i][j]);
}
printf("\n");
}
}
void BeforeBFS(MGraph G){
datatype Start;
printf("Please Input Start-Vex : ");
scanf("%c",&Start);
getchar();
int flag;
if((flag = GetIndexOfStart(G,Start))==-1){
printf("Input Error,The Vex doesn't Exist,Please Try Again\n");
BeforeBFS(G);
return;
}
Queue queue;
InitQueue(queue);
int mark[MAXSIZE];
for(int i = 0;i<G.vexnum;i++){
mark[i] = 0;
}
printf("BFS: ");
EnQueue(queue,flag);
BFS(G,queue,mark);
for(int i = 0;i<G.vexnum;i++){
if(mark[i] == 0)
{
EnQueue(queue,i);
BFS(G,queue,mark);
}
}
}
void BFS(MGraph G,Queue &queue,int mark[]){
while(queue.front<queue.rear){
int fl = ExQueue(queue);
if(mark[fl] == 1)
continue;
printf("%c ",G.Vex[fl]);
mark[fl] =1;
for(int i = 0;i<G.vexnum;i++){
if(G.Edge[fl][i] == 1)
EnQueue(queue,i);
}
}
}
int GetIndexOfStart(MGraph G,datatype start){
int flag = -1;
for (int i = 0; i < G.vexnum; i++)
{
if(G.Vex[i] == start)
flag = i;
}
return flag;
}
void BeforeDFS(MGraph G){
datatype start;
printf("\nPlease Input Start-Vex : ");
scanf("%c",&start);
getchar();
int flag = GetIndexOfStart(G,start);
if(flag == -1){
printf("Input Error,The Vex doesn't Exist,Please Try Again\n");
BeforeDFS(G);
return;
}
int mark[MAXSIZE];
for (int i = 0; i < G.vexnum; i++)
mark[i] = 0;
DFS(G,flag,mark);
for (int i = 0; i < G.vexnum; i++)
if(mark[i]==0)
DFS(G,i,mark);
}
void DFS(MGraph G,int v,int mark[]){
printf("%c ",G.Vex[v]);
mark[v] = 1;
for(int i = 0;i<G.vexnum;i++){
if(mark[i]==0)
DFS(G,i,mark);
}
}
int main(){
MGraph G;
InitGraph(G);
CreateGraph(G);
BeforeBFS(G);
BeforeDFS(G);
system("pause");
return 0;
}