数据结构-图的基本操作
图的基本操作-数据结构1.创建图2.输入元素3.广度优先遍历BFS4.深度优先遍历DFS#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;typedef int Status;#define maxnode 40#def
·
图的基本操作-数据结构
1.创建图
2.输入元素
3.广度优先遍历BFS
4.深度优先遍历DFS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef int Status;
#define maxnode 40
#define MAXSIZE 100
#define MVNum 100 //最大顶点数
#define null 0
#define TRUE 1
#define FALUSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char VerTexType; //顶点为字符
typedef struct ArcNode{
int adjvex; //边 弧
struct ArcNode *nextarc;
int weight;
}ArcNode; //边结点
typedef struct VNode
{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum]; //adjlist 表示领结表类型
typedef struct
{
AdjList vertices;
int vexnum,arcnum;//图顶点数和弧数
}ALGraph,Graph,AdjGraph;
Status LocateVex(ALGraph G,int v)//根据顶点的序号查找
{
int i;
i=v;
if(i>=0&&i<G.vexnum) return i;
return OVERFLOW;
}
Status CreateUDG(ALGraph &G) //创建无向图
{
int i,j,k,w,v1,v2;
ArcNode *p1,*p2;
printf("input vexnum arcnum: \n"); //输入图总顶点数,总边数
//cin>>G.vexnum>>G.arcnum;
scanf("%d%d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("input vertex data:");
cin>>G.vertices[i].data; //输入顶点值
G.vertices[i].firstarc=NULL; //初始化表头结点
}
for(k=0;k<G.arcnum;++k)
{
printf("input List Vnode NO i:");
scanf("%d",&v1);
printf("input List next node NO j:");
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i>-1&&j>-1)
{
p1=new ArcNode; //生成一个新结点p1
p1->weight=w;
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
p2=new ArcNode; //对称新结点p2
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
else
{
printf("Vnode No i or j ERROR :");
k--;
}
}
return OK;
}
void PrintNode(ALGraph G) //打印图中结够
{
ArcNode *q;
int i;
printf("adjcency list of the graph:\n");
for(i=0;i<G.vexnum;i++)
{
printf("V%d\t",i);
printf("%c==>",G.vertices[i]);
q=G.vertices[i].firstarc;
while(q!=NULL)
{
printf("--> %d",q->adjvex);
q=q->nextarc;
}
printf("\n");
}
}
bool visited[MVNum];
void DFS_AL(ALGraph G,int v)
{
int w;
ArcNode *p;
printf("->%c",G.vertices[v].data);
visited[v]=true;
p=G.vertices[v].firstarc;
while(p!=NULL)
{
w=p->adjvex;
if(!visited[w]) DFS_AL(G,w);
p=p->nextarc;
}
}
typedef struct
{
int *base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue &Q)
{
Q.base=new int[MAXSIZE];
if(!Q.base) exit(OVERFLOW);
Q.front=0;Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,int e)
{
if((Q.rear+1)%MAXSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,int &e)
{
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) return OK;
else return ERROR;
}
void BFS(Graph G,int v)
{
SqQueue Q;int u,w;
cout<<"-->"<<v;
visited[v]=true;
InitQueue(Q);
EnQueue(Q,v);
while(!QueueEmpty(Q))
{
DeQueue(Q,u);
ArcNode *p;
p=G.vertices[u].firstarc;
while(p!=NULL)
{
w=p->adjvex;
if(!visited[w])
{
cout<<"-->"<<w,visited[w]=true;
}
p=p->nextarc;
}
}
}
/*void DFS1(AdjGraph G)
{
int i;
for(i=0;i<G.vexnum;i++)
if(visited[i]==0)
}*/
void main()
{
int i,j,n,k,w,v,select;
ALGraph G1;
CreateUDG(G1);
PrintNode(G1);
do{
printf("\n first used \n");
printf("please chose(0-6)");
printf(" 1 create graph\n");
printf(" 2 printf algraph\n");
printf(" 3 dfs \n");
printf(" 4 bfs \n");
printf(" 0 exit \n");
printf("================");
scanf("%d",&select);
switch(select)
{
case 1:{
CreateUDG(G1);
break;
}
case 2:{
PrintNode(G1);
break;
}
case 3:{
printf("input Vertex serial number :\n");
cin>>v;
for(i=0;i<G1.vexnum;i++)
visited[i]=0;
DFS_AL(G1,v);
break;
}
case 4:{
printf("input vertex serial number:\n");
cin>>v;
for(i=0;i<G1.vexnum;i++)
visited[i]=0;
BFS(G1,v);
break;
}
case 0: exit(0);
}
}while(select<6);
}
:输入方式

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)