-
//你们帮我看看呀,求求各位了 //调用DFS时就是出错,但是调用OUTGraph(G)却可以。
//下面是一个关于图的程序,以存储矩阵存储,但是进行遍历就出现错误
#include<iostream.h> #include<malloc.h> #include<stdio.h> #include<stdlib.h>
#define OK 1 #define ERROR -1 #define OVERFLOW -2 #define Null 0 #define MAX_VERTEX_NUM 20
typedef char Vertextype;//char类型
typedef struct ArcNode{ //边结点 int adjvex; struct ArcNode *nextarc; //下一个结点 }ArcNode;
typedef struct VNode{ //顶点结点 Vertextype date; //图的顶点名 ArcNode *first; }VNode,Adjlist[MAX_VERTEX_NUM];
typedef struct{ //以图的邻接表存储图 Adjlist vertices; int vexnum,arcnum; //顶点数和边数 }ALGraph;
int visited[MAX_VERTEX_NUM];//访问数组标志
//找到输入顶点的位置 int Locatnode(Adjlist L,Vertextype node) { //确定输入点在图中的位置 int i=0; while(L[i].date !=node) i++; return i; }
void CreatGraph(ALGraph &G) { //用邻接表存储一个图 cout<<"请输入图顶点的个数:"<<endl; cin>>G.vexnum; cout<<"输入顶点:"<<endl; int i; ArcNode *p; for(i=0;i<G.vexnum;i++) //对图进行初试化 { cin>>G.vertices[i].date; //输入顶点 p=(ArcNode*)malloc(sizeof(ArcNode)); //建立带有带有头结点的邻接链表 p->nextarc=Null; G.vertices[i].first=p; } //输入邻接顶点 cout<<"输入边的个数:"<<endl; cin>>G.arcnum;//输入边数 int k,j; char ch1,ch2; ArcNode *q; for(i=0;i<G.arcnum;i++) //建立邻接表 { cout<<"请输入邻接的两个顶点:"<<endl; cin>>ch1>>ch2; k=Locatnode(G.vertices,ch1); j=Locatnode(G.vertices,ch2); p=G.vertices[k].first; //创建另一个以j为顶点的链表
q=(ArcNode*)malloc(sizeof(ArcNode)); q->adjvex=j; //将与k顶点相邻的顶点j输入 q->nextarc=p->nextarc; //在头结点与第一个顶点间插入元素 p->nextarc=q;
//创建另一个以j为顶点的链表 p=G.vertices[j].first; q=(ArcNode*)malloc(sizeof(ArcNode)); q->adjvex=k; //将与k顶点相邻的顶点j输入 q->nextarc=p->nextarc; //在头结点与第一个顶点间插入元素 p->nextarc=q; } for(i=0;i<G.vexnum;i++) //初始化访问数组 visited[i]=false; }
ArcNode *q; //定义一个变量
void DFS(ALGraph G,int i) { //从第i个顶点遍历连通图 visited[i]=true; cout<<G.vertices[i].date; for(q=G.vertices[i].first->nextarc;q;q=q->nextarc) { if(!visited[q->nextarc->adjvex]) DFS(G,q->adjvex); } }
void OUTGraph(ALGraph G)//从第一个顶点将图的邻接表输出 { int i; ArcNode *p; for(i=0;i<G.vexnum;i++) { cout<<G.vertices[i].date<<" "; for(p=G.vertices[i].first->nextarc;p;p=p->nextarc) cout<<G.vertices[p->adjvex].date<<' '; cout<<endl; } }
void main() { ALGraph G; CreatGraph(G); OUTGraph(G); DFS(G,0); //从第一个顶点遍历图,是连通图将整个图输出 }
----------------解决方案--------------------------------------------------------
give me more time, I now just in the Net Bar playing game!
----------------解决方案--------------------------------------------------------
#include<iostream.h> //另外那三个头文件不用包含了
//以下并不一定要改成const,只是这样比较好 const int OK = 1; const int ERROR = -1; const int OVERFLOW = -2; const int Null = 0; const int MAX_VERTEX_NUM = 20; //其实只用到了这个
typedef char VertexType; //图的数据类型为char类型
typedef struct ArcNode{ //边结点 int adjvex; //邻接点域 struct ArcNode *nextarc; }ArcNode;
typedef struct VNode{ //顶点结点 VertexType date; ArcNode *first; //边结点首指针 }VNode,Adjlist[MAX_VERTEX_NUM];
typedef struct ALGraph{ //定义邻接表 VNode vertices[MAX_VERTEX_NUM]; int vexnum,arcnum; //顶点数和边数 }ALGraph;
int visited[MAX_VERTEX_NUM]; //访问数组标志
int Locatenode(Adjlist L,VertexType node) { //确定输入点在图中的位置 int i=0; while(L[i].date!=node) i++; return i; }
void CreatGraph(ALGraph &G) { //用邻接表存储一个图 cout<<"请输入图顶点的个数:"<<endl; cin>>G.vexnum;
cout<<"输入顶点:"<<endl; ArcNode *p; for(int i=0;i<G.vexnum;i++) //对图进行初试化 { cin>>G.vertices[i].date; //输入顶点 p=new ArcNode; //建立带有头结点的邻接链表 p->nextarc=Null; G.vertices[i].first=p; } //输入邻接顶点 cout<<"输入边的个数:"<<endl; cin>>G.arcnum; //输入边数 int k,j; char ch1,ch2; ArcNode *q; for(i=0;i<G.arcnum;i++) //建立邻接表 { cout<<"请输入邻接的两个顶点:"<<endl; cin>>ch1>>ch2; k=Locatenode(G.vertices,ch1); j=Locatenode(G.vertices,ch2); p=G.vertices[k].first; //创建另一个以j为顶点的链表
q=new ArcNode; q->adjvex=j; //将与k顶点相邻的顶点j输入 q->nextarc=p->nextarc; //在头结点与第一个顶点间插入元素 p->nextarc=q;
//创建另一个以j为顶点的链表 p=G.vertices[j].first; q=new ArcNode; q->adjvex=k; //将与k顶点相邻的顶点j输入 q->nextarc=p->nextarc; //在头结点与第一个顶点间插入元素 p->nextarc=q; } for(i=0;i<G.vexnum;i++) //初始化访问数组 visited[i]=false; }
ArcNode *q; //定义一个变量
void DFS(ALGraph G,int i) { //从第i个顶点遍历连通图 visited[i]=true; cout<<G.vertices[i].date; for(q=G.vertices[i].first->nextarc;q;q=q->nextarc) { if(!visited[q->nextarc->adjvex]) DFS(G,q->adjvex); } }
void OUTGraph(ALGraph G) //从第一个顶点将图的邻接表输出 { ArcNode *p; for(int i=0;i<G.vexnum;i++) { cout<<G.vertices[i].date<<" "; for(p=G.vertices[i].first->nextarc;p;p=p->nextarc) cout<<G.vertices[p->adjvex].date<<' '; cout<<endl; } }
void main() { ALGraph G; //Adjaceney List -> 邻接表 CreatGraph(G); OUTGraph(G); DFS(G,0); //从第一个顶点遍历图,是连通图将整个图输出 }
又改了一下,我看得头晕晕的,好像还是不行,你的程序就是想创建邻接表然后输出而已吧?你详细一点说一下哪里通不过!
----------------解决方案--------------------------------------------------------
看了下你的资料,广西人吗?大四了吗?我才大三。
----------------解决方案--------------------------------------------------------
你学过数据结构的,我就直接说了,数据结构课本里有一个函数,DFS(),深度优先遍历图,遍历不了,我用图的存储矩阵来进行深度优先遍历没有出错的,但在这里运行通不过,我用void OUTGraph(ALGraph G);来验证我创建的图是否出错,是通过了,但是调用DSF()就没有办法了。
顺便说一下,我和你一样是大3,上个学期学的数据结构。麻烦你了
----------------解决方案--------------------------------------------------------
你属狗我属猪比你小一岁……
你用的搜索函数是递归的,我书上的函数是非递归的,要看吗?!
----------------解决方案--------------------------------------------------------
你属狗我属猪比你小一岁……
你用的搜索函数是递归的,我书上的函数是非递归的,要看吗?!
不知道LAVE41的头像是谁???
----------------解决方案--------------------------------------------------------
不知道LAVE41的头像是谁???
Cookies - Stephy & Thresa
----------------解决方案--------------------------------------------------------
可以呀
----------------解决方案--------------------------------------------------------
大家好
----------------解决方案--------------------------------------------------------