主题:[原创]求助第二个问题!!! 修改图的基本操作-遍历的实现的程序!!
这个我也写出了大部分程序,只有一个小小的地方我不会做了!!
请大家帮我修改一下!!!
图的基本操作-遍历的实现
顶点和边的信息输入数据为:
5 7 DG
A B C D E
AB AE BC CD DA DB EC
1、/* 输入图的顶点和边的信息,建立图*/
void CreateGraph(MGraph &G)
2、/* 深度优先搜索遍历图*/
void DFSTraverse(Graph G, int v)
3、/*广度优先搜索遍历图 */
void BFSTraverse(Graph G, int v)4、
4、/* 其他相关函数 */
#include"iostream"
#include"stdlib.h"
#include<string>
using namespace std;
#define INFINITY INT_MAX //定义无穷大∞
#define MAX_VERTEX_NUM 20
typedef enum{ DG, DN, UDG, UDN } GraphKind; // 定义图的类型 { 有向图, 有向网,无向图, 无向网}
typedef struct ArcNode // 表结点定义
{ int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置
struct ArcNode *nextarc;//链域,指示依附于vi的下一条边或弧的结点
char info;
}ArcNode;
typedef struct VNode //表头结点
{
char vexdata; //存放顶点信息
struct ArcNode *firstarc; //指示第一个邻接点
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct //图的结构定义
{
AdjList vertices; //顶点向量
int vexnum, arcnum;
GraphKind kind; // 图的种类标志
} MGraph;
struct Queue
{
char data0;
struct Queue *next;
};
Queue *front,*rear;
void DFSTraverse(MGraph, int );
int visit[100];
void CreateGraph(MGraph &G)
{
char a,ch;//用来输入边的弧尾和弧头
printf("输入顶点数\n");
scanf("%d",&G.vexnum);
printf("输入弧数\n");
scanf("%d",&G.arcnum);
for(int i=0;i<G.vexnum;i++)//初始化图的各个结点
{
[color=800000][size=6][size=5] printf("输入第"i+1"个结点\n");[/size][/size][/color]
scanf(&G.vertices[i].vexdata);
G.vertices[i].firstarc=NULL;//初始化firstarc的指针指向空
}
[color=FF0000]for(i=0;i<G.arcnum;i++)//初始化各个边的信息[/color] {
printf("输入第i+1条弧\n");
scanf("%d",&a);//输入弧尾部
scanf("%d",&ch);//输入弧的头部
for(int j=0;j<G.vexnum;j++)//找出边的存储位置
{
if(G.vertices[j].vexdata==a)
{
for(int k=0;k<G.vexnum;k++)//判断输入的边是否存在相应的顶点
if(ch==G.vertices[k].vexdata)break;
if(k=G.vexnum-1&&ch!=G.vertices[k].vexdata)//判断输入的边的正误
{
printf("输入有误,请重新输入!\n");
break;
}
ArcNode *p;
p=new ArcNode;
p->adjvex=k;//存入弧的头部结点的
p->info=ch;
p->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p;
i++;
break;
}
else if(j>=G.vexnum-1)//判断输入的边的正误
printf("输入有误,请重新输入!\n");
}
}
printf("输入完毕\n");
}
void DisPlayMGrph(MGraph G)
{
for(int j=0;j<G.vexnum;j++)
{
ArcNode *p;
p=G.vertices[j].firstarc;
cout<<j<<" "<<G.vertices[j].vexdata<<" ";
if(p)cout<<"-->";
while(p)
{
for(int i=0;i<G.vexnum;i++)
if(p->info==G.vertices[i].vexdata)break;
printf("i&" "&G.vertices[j].vexdata&p->info&" "\n");
p=p->nextarc;
}
printf("^");
printf(" ");
}
}
void DFS(MGraph &G)
{
for(int i=0;i<G.vexnum;i++)//标记没有被访问的结点为false
visit[i]=false;
for(i=0;i<G.vexnum;i++)//对没有访问过的顶点调用DFSTraverse
if(!visit[i]) DFSTraverse(G, i);
}
void DFSTraverse(MGraph G, int v)
{
ArcNode *pe;
pe=G.vertices[v].firstarc;
visit[v]=true;//标记访问过的结点为true
cout<<G.vertices[v].vexdata<<" ";
while(pe&&visit[pe->adjvex]==false)//对pe->adjvex尚未被访问过的结点递归调用DFSTraverse
{
DFSTraverse(G,pe->adjvex);
pe=pe->nextarc;
}
}
void BFSTraverse(MGraph &G, int v)//广度优先搜索遍历
{
ArcNode *pe;
rear=new Queue;//初始化队列
front=rear;
rear->next=NULL;
for(int i=0;i<G.vexnum;i++)//标记没有被访问过的结点为false
visit[i]=false;
for(i=0;i<G.vexnum;i++)//对没有被访问过的结点进行逐个访问
{
pe=G.vertices[i].firstarc;
if(!visit[i])
{
visit[i]=true;//访问过的结点标记为true
printf("G.vertices[i].vexdata&" "\n");
rear=rear->next=new Queue;
rear->next=NULL;
rear->data0=G.vertices[i].vexdata;//入队操作
while(front==rear) {//若对列不为空,则进行以下操作
Queue *Temp=front;
front=front->next;//队首元素出队
delete Temp;
pe=G.vertices[i].firstarc;
while(pe&&visit[pe->adjvex]==false) {//对没有访问过的结点进行入队操作
printf("G.vertices[pe->adjvex].vexdata" "");//入队的同时输出相应的信息
visit[pe->adjvex]=true;
rear=rear->next;
rear->next=new Queue;
rear->next=NULL;
rear->data0=G.vertices[pe->adjvex].vexdata;
pe=pe->nextarc;
}
}
}
}
printf(" ");
}
void main()
{
printf("============================ 请选择你想要的图的基本操作 ======================\n");
printf(" 0.退出 1. 创建图 2.深度优先遍历 3.广度优先遍历 4.输出邻接表 \n");
MGraph G;
char n;
int m;
while(n!=5)
{
scanf("%d",&n);
switch(n)
{
// case '0':exit(-1);
case 1:CreateGraph(G);break;
case 2:DFS(G);break;
case 3:BFSTraverse(G,m);break;
case 4:DisPlayMGrph(G);break;
default: printf("错误\n");break;
}
}
}
请大家帮我修改一下!!!
图的基本操作-遍历的实现
顶点和边的信息输入数据为:
5 7 DG
A B C D E
AB AE BC CD DA DB EC
1、/* 输入图的顶点和边的信息,建立图*/
void CreateGraph(MGraph &G)
2、/* 深度优先搜索遍历图*/
void DFSTraverse(Graph G, int v)
3、/*广度优先搜索遍历图 */
void BFSTraverse(Graph G, int v)4、
4、/* 其他相关函数 */
#include"iostream"
#include"stdlib.h"
#include<string>
using namespace std;
#define INFINITY INT_MAX //定义无穷大∞
#define MAX_VERTEX_NUM 20
typedef enum{ DG, DN, UDG, UDN } GraphKind; // 定义图的类型 { 有向图, 有向网,无向图, 无向网}
typedef struct ArcNode // 表结点定义
{ int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置
struct ArcNode *nextarc;//链域,指示依附于vi的下一条边或弧的结点
char info;
}ArcNode;
typedef struct VNode //表头结点
{
char vexdata; //存放顶点信息
struct ArcNode *firstarc; //指示第一个邻接点
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct //图的结构定义
{
AdjList vertices; //顶点向量
int vexnum, arcnum;
GraphKind kind; // 图的种类标志
} MGraph;
struct Queue
{
char data0;
struct Queue *next;
};
Queue *front,*rear;
void DFSTraverse(MGraph, int );
int visit[100];
void CreateGraph(MGraph &G)
{
char a,ch;//用来输入边的弧尾和弧头
printf("输入顶点数\n");
scanf("%d",&G.vexnum);
printf("输入弧数\n");
scanf("%d",&G.arcnum);
for(int i=0;i<G.vexnum;i++)//初始化图的各个结点
{
[color=800000][size=6][size=5] printf("输入第"i+1"个结点\n");[/size][/size][/color]
scanf(&G.vertices[i].vexdata);
G.vertices[i].firstarc=NULL;//初始化firstarc的指针指向空
}
[color=FF0000]for(i=0;i<G.arcnum;i++)//初始化各个边的信息[/color] {
printf("输入第i+1条弧\n");
scanf("%d",&a);//输入弧尾部
scanf("%d",&ch);//输入弧的头部
for(int j=0;j<G.vexnum;j++)//找出边的存储位置
{
if(G.vertices[j].vexdata==a)
{
for(int k=0;k<G.vexnum;k++)//判断输入的边是否存在相应的顶点
if(ch==G.vertices[k].vexdata)break;
if(k=G.vexnum-1&&ch!=G.vertices[k].vexdata)//判断输入的边的正误
{
printf("输入有误,请重新输入!\n");
break;
}
ArcNode *p;
p=new ArcNode;
p->adjvex=k;//存入弧的头部结点的
p->info=ch;
p->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p;
i++;
break;
}
else if(j>=G.vexnum-1)//判断输入的边的正误
printf("输入有误,请重新输入!\n");
}
}
printf("输入完毕\n");
}
void DisPlayMGrph(MGraph G)
{
for(int j=0;j<G.vexnum;j++)
{
ArcNode *p;
p=G.vertices[j].firstarc;
cout<<j<<" "<<G.vertices[j].vexdata<<" ";
if(p)cout<<"-->";
while(p)
{
for(int i=0;i<G.vexnum;i++)
if(p->info==G.vertices[i].vexdata)break;
printf("i&" "&G.vertices[j].vexdata&p->info&" "\n");
p=p->nextarc;
}
printf("^");
printf(" ");
}
}
void DFS(MGraph &G)
{
for(int i=0;i<G.vexnum;i++)//标记没有被访问的结点为false
visit[i]=false;
for(i=0;i<G.vexnum;i++)//对没有访问过的顶点调用DFSTraverse
if(!visit[i]) DFSTraverse(G, i);
}
void DFSTraverse(MGraph G, int v)
{
ArcNode *pe;
pe=G.vertices[v].firstarc;
visit[v]=true;//标记访问过的结点为true
cout<<G.vertices[v].vexdata<<" ";
while(pe&&visit[pe->adjvex]==false)//对pe->adjvex尚未被访问过的结点递归调用DFSTraverse
{
DFSTraverse(G,pe->adjvex);
pe=pe->nextarc;
}
}
void BFSTraverse(MGraph &G, int v)//广度优先搜索遍历
{
ArcNode *pe;
rear=new Queue;//初始化队列
front=rear;
rear->next=NULL;
for(int i=0;i<G.vexnum;i++)//标记没有被访问过的结点为false
visit[i]=false;
for(i=0;i<G.vexnum;i++)//对没有被访问过的结点进行逐个访问
{
pe=G.vertices[i].firstarc;
if(!visit[i])
{
visit[i]=true;//访问过的结点标记为true
printf("G.vertices[i].vexdata&" "\n");
rear=rear->next=new Queue;
rear->next=NULL;
rear->data0=G.vertices[i].vexdata;//入队操作
while(front==rear) {//若对列不为空,则进行以下操作
Queue *Temp=front;
front=front->next;//队首元素出队
delete Temp;
pe=G.vertices[i].firstarc;
while(pe&&visit[pe->adjvex]==false) {//对没有访问过的结点进行入队操作
printf("G.vertices[pe->adjvex].vexdata" "");//入队的同时输出相应的信息
visit[pe->adjvex]=true;
rear=rear->next;
rear->next=new Queue;
rear->next=NULL;
rear->data0=G.vertices[pe->adjvex].vexdata;
pe=pe->nextarc;
}
}
}
}
printf(" ");
}
void main()
{
printf("============================ 请选择你想要的图的基本操作 ======================\n");
printf(" 0.退出 1. 创建图 2.深度优先遍历 3.广度优先遍历 4.输出邻接表 \n");
MGraph G;
char n;
int m;
while(n!=5)
{
scanf("%d",&n);
switch(n)
{
// case '0':exit(-1);
case 1:CreateGraph(G);break;
case 2:DFS(G);break;
case 3:BFSTraverse(G,m);break;
case 4:DisPlayMGrph(G);break;
default: printf("错误\n");break;
}
}
}