#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef int DataType;
typedef struct Graph
{
DataType vertex[Maxsize]; //数组v存放顶点信息
int arc[Maxsize][Maxsize]; //arc数组存放边信息
int n,e; //n个顶点,e条边
}MG;
typedef struct SeqQ
{
int front,rear;
DataType data[Maxsize];
}SQ;
//调用InitGraph函数完成图的存储,(邻接矩阵和邻接表存储)
void InitGraph(MG*G,DataType a[],int n,int e)
{
int i,j,k;
G->n = n;
G->e = e;
for(i=0;i<n;i++)
{
G->vertex[i] = a[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
G->arc[i][j]=0;
}
// printf("\n");
}
for(k=0;k<e;k++)
{
printf("请输入边依附的两个顶点");
scanf("%d,%d",&i,&j);
G->arc[i][j]=1;
G->arc[j][i]=1;
}
}
//输出邻接矩阵/邻接表,检查图的存储是否正确
void Print(MG *G)
{
int i,j;
for(i=0;i<G->n;i++)
{
for(j=0;j<G->n;j++)
{
printf("%3d",G->arc[i][j]);
}
printf("\n");
}
}
//深度优先遍历
int visited[Maxsize] = {0};
void DFS(MG *G,int v)
{
int j;
printf("%3d",G->vertex[v]);
visited[v] = 1;
for(j=0;j<G->n;j++){
if(G->arc[v][j]==1&& visited[j]==0) //如果j是v的一个邻接点并且没有访问
DFS(G,j);
}
}
//广度优先遍历
void BFS(MG *G,int v)
{
int j;
int visited[Maxsize] ={0} ; //使用是迭代法 所以采用局部变量
SQ Q;
Q.front=Q.rear=-1; //给队列初始化 表明是一个空队列
printf("%d",G->vertex[v]);
visited[v]=1;
// Q.rear++; //入队时先进行队尾加一的操作
Q.rear = (Q.rear+1)%Maxsize;
Q.data[Q.rear] = v; //入队操作
while(Q.front!=Q.rear){ //循环结束条件
// Q.front++;
Q.front = (Q.front+1)%Maxsize;
v=Q.data[Q.front]; //取队头元素,但是此时对头为-1,不能使用在使用之前进行加1操作
for(j=0;j<G->n;j++){ //找v的所有邻接点
if(G->arc[v][j]==1&& visited[j]==0) //如果j是v的一个邻接点并且没有访问
{
printf("%3d",G->vertex[j]); //输出邻接点
visited[j]=1; //设为以访问
Q.rear=(Q.rear+1)%Maxsize;
Q.data[Q.rear]=j; //j 元素入队操作
}
}
}
}
//主函数,完成节点个数和变数的初始化
//将素有的节点信息存放到数组a里边
//调用函数建立图
int main()
{
MG G;
DataType a[Maxsize];
int n,e,i;
printf("请输入顶点的个数和边数");
scanf("%d,%d",&n,&e);
printf("请输入顶点信息,\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
InitGraph(&G,a,n,e);
Print(&G);
printf("图G的深度优先遍历,\n");
DFS(&G,0);
printf("\n");
printf("图G的广度优先遍历,\n");
BFS(&G,0);
}
c语言描述数据结构,图的存储及遍历(矩阵/邻接矩阵;深度/广度优先遍历)
最新推荐文章于 2024-08-05 23:08:01 发布