| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1077 人关注过本帖
标题:[求助]帮忙看下,哪里出了错
只看楼主 加入收藏
wangxmin
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-11-24
收藏
 问题点数:0 回复次数:10 
[求助]帮忙看下,哪里出了错

#include "iostream.h"

#define MaxVerNum 100 //最大顶点数设为100

int Gtype=0; //图储存类型(0:有向邻接表(默认) 1:有向邻接矩阵 2:无向邻接矩阵)

int visited[MaxVerNum]; //顶点标志向(用于标记遍历时是否被访问过)

typedef char VertexType; //顶点类型

typedef int EdgeType; //边的权值类型

typedef struct{

//以邻接矩阵储存的图类型MGragh

VertexType vexs[MaxVerNum]; //顶点表

EdgeType edges[MaxVerNum][MaxVerNum]; //邻接矩阵,即边表

int n,e; //顶点数,边数

}MGraph;

typedef struct Node{

//定义边表结点

int adjvex; //邻接点域

struct Node *next; //指向下一个邻接点

//若要表示边上的信息,则应增加一个数据域info

}EdgeNode;

typedef struct vNode{

//定义顶点表结点

VertexType vertex; //顶点域

EdgeNode *firstedge; //边表头指针

}VertexNode;

typedef VertexNode AdjList[MaxVerNum]; //定义邻接表类型

typedef struct{

//以邻接表储存的图类型ALGraph

AdjList adjlist; //邻接表

int n,e; //顶点数,边数

}ALGraph;


void CreateMGraph(MGraph *G){ //建立一个有向图的邻接矩阵存储算法

//建立有向图G的邻接矩阵存储

int i,j,k;

cout<<"1.建立有向图(默认)"<<endl;

cout<<"2.建立无向图"<<endl;

cout<<"请选择:";

cin>>Gtype;

if (Gtype!=2) Gtype=1;

cout<<"请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;

cin>>G->n>>G->e; //输入顶点数和边数

cout<<"请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;

for (i=0;i<G->n;i++)

cin>>G->vexs[i]; //输入顶点信息,建立顶点表

for (i=0;i<G->n;i++)

for (i=0;j<G->n;j++)

G->edges[i][j]=0; //初始化邻接矩阵

cout<<"请输入每条边对应的两个顶点的序号(输入格式为:i,j):"<<endl;

for (k=0;k<G->e;k++){

cin>>i>>j; //输入e条边,建立邻接矩阵

if (Gtype==2) G->edges[i][j]=1; //若_bk==2,则建立无向图的邻接矩阵存储

}

}//CreateMGraph

void CreateALGraph(ALGraph *G){

//建立有向图的邻接表储存

int i,j,k;

EdgeNode *s;

cout<<"请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;

cin>>G->n>>G->e; //读入顶点数和边数

cout<<"请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;

for (i=0;i< G->n;i++){ //建立有n个顶点的顶点表

cin>>G->adjlist[i].vertex; //读入顶点信息

G->adjlist[i].firstedge=NULL; //顶点的边表头指针设为空

}

cout<<"请输入每条边对应的两个顶点的序号(输入格式为:i,j):"<<endl;

for (k=0;k< G->e;k++){ //建立边表

cin>>i>>j; //读入边<Vi,Vj>的定点对应序号

s=new EdgeNode; //生成新边表结点s

s->adjvex=j; //邻接点序号为j

s->next=G->adjlist[i].firstedge; //将新边表结点s插入到顶点Vi的边表头部

G->adjlist[i].firstedge=s;

}

}//CreateAlGraph

void DFSAL(ALGraph *G,int i){

//以Vi为出发点对邻接表存储的图G,进行DFS(Depth_First Search)搜索

EdgeNode *p;

cout<<"Visit vertex:V"<<G->adjlist[i].vertex<<endl; //访问顶点Vi

visited[i]=1; //标记Vi以访问

p=G->adjlist[i].firstedge; //取Vi边表头指针

while (p) { //依次搜索Vi的邻接点Vj,j=p->adjvex

if (!visited[p->adjvex]) DFSAL(G,p->adjvex);//若Vj尚未访问,则以Vj为出发点向纵深搜索

p=p->next; //找Vi的下一个邻接点

}

}//DFSAL

void DFSTraverseAL(ALGraph *G){

//深度优先遍历以邻接表储存的图G

int i;

for (i=0;i< G->n;i++)

visited[i]=0; //标志向量初始化

for (i=0;i< G->n;i++)

if (!visited[i])

DFSAL(G,i); //若Vi未访问过,从Vi开始DFS搜索

}//DFSTraveseAL

搜索更多相关主题的帖子: Roman left New 
2005-11-24 17:07
wangxmin
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-11-24
收藏
得分:0 

void main(){

int _break=0;

int _KeyPress;

ALGraph *G=NULL;

MGraph *MG;

while(!_break){

cout<<"1.建立图(默认)"<<endl;

cout<<"2.深度优先遍历"<<endl;

cout<<"3.退出"<<endl;

cout<<"请选择:";

cin>>_KeyPress;

switch (_KeyPress){

case 1:

cout<<"0.邻接链表储存方式(默认)"<<endl;

cout<<"1.邻接矩阵储存方式"<<endl;

cout<<"请选择:";

cin>>Gtype;

if (Gtype!=1){

Gtype=0;

CreateALGraph(G);

}

else

CreateMGraph(MG);

break;

case 2:

if (!G) //判断是否存在已建立图

cout<<"请先建立图!"<<endl;

else

if (Gtype)

cout<<"本程序尚不支持邻接矩阵遍历搜索"<<endl;

else

DFSTraverseAL(G); //深度遍历访问

break;

case 3:

_break=1;

break;

default:

cout<<"对不起您输入的指令不存在!"<<endl;

}

}

}

2005-11-24 17:09
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
算法上好象没有什么问题吧
是不是编写上存在某些小问题呢?
等待高手来解答...
2005-11-29 16:50
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
没有高手来帮忙看看吗?
2005-12-09 01:45
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 

舍友的一句话 让我茅塞顿开 在主函数中 ALGraph *G=NULL 这句话与下面程序存在逻辑上的错误
因为如果把*G定义为空指针的话,后面就不能使G->n,G->e赋值。产生错误。注意,这是逻辑上的错误,并不是语法上的错误,编译是可以通过的,但运行程序时候会出错。还有声明ALGraph *G和MGraph *MG后,要新建一个空间,即加上G=(ALGraph*)malloc(sizeof(ALGraph));和
MG=(MGraph*)malloc(sizeof(MGraph));这两个语句。

2005-12-11 09:44
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 

改好后的程序源码为
// g.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

#define MaxVerNum 100 //最大顶点数设为100

int Gtype=0; //图储存类型(0:有向邻接表(默认) 1:有向邻接矩阵 2:无向邻接矩阵)

int visited[MaxVerNum]; //顶点标志向(用于标记遍历时是否被访问过)

typedef char VertexType; //顶点类型

typedef int EdgeType; //边的权值类型


typedef struct{

//以邻接矩阵储存的图类型MGragh

VertexType vexs[MaxVerNum]; //顶点表

EdgeType edges[MaxVerNum][MaxVerNum]; //邻接矩阵,即边表

int n,e; //顶点数,边数

}MGraph;


typedef struct Node{

//定义边表结点

int adjvex; //邻接点域

struct Node *next; //指向下一个邻接点

//若要表示边上的信息,则应增加一个数据域info

}EdgeNode;

typedef struct vNode{

//定义顶点表结点

VertexType vertex; //顶点域

EdgeNode *firstedge; //边表头指针

}VertexNode, AdjList[MaxVerNum]; //定义邻接表类型

typedef struct{

//以邻接表储存的图类型ALGraph

AdjList adjlist; //邻接表

int n,e; //顶点数,边数

}ALGraph;


void CreateMGraph(MGraph *G){ //建立一个有向图的邻接矩阵存储算法

//建立有向图G的邻接矩阵存储

int i,j,k;

cout<<"1.建立有向图(默认)"<<endl;

cout<<"2.建立无向图"<<endl;

cout<<"请选择:";

cin>>Gtype;

if (Gtype!=2) Gtype=1;

cout<<"请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;

cin>>G->n>>G->e; //输入顶点数和边数

cout<<"请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;

for (i=0;i<G->n;i++)

cin>>G->vexs[i]; //输入顶点信息,建立顶点表

for (i=0;i<G->n;i++)

for (j=0;j<G->n;j++)

G->edges[i][j]=0; //初始化邻接矩阵

cout<<"请输入每条边对应的两个顶点的序号(输入格式为:i,j):"<<endl;

for (k=0;k<G->e;k++){

cin>>i>>j;
//输入e条边,建立邻接矩阵
G->edges[i][j]=1;

if (Gtype==2) G->edges[j][i]=G->edges[i][j]; //若_bk==2,则建立无向图的邻接矩阵存储

}

}//CreateMGraph


void CreateALGraph(ALGraph *G){

//建立有向图的邻接表储存

int i,j,k;

EdgeNode *s;

cout<<"请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;

cin>>G->n>>G->e; //读入顶点数和边数

cout<<"请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;

for (i=0;i< G->n;i++){ //建立有n个顶点的顶点表

cin>>G->adjlist[i].vertex; //读入顶点信息

G->adjlist[i].firstedge=NULL; //顶点的边表头指针设为空

}

cout<<"请输入每条边对应的两个顶点的序号(输入格式为:i,j):"<<endl;

for (k=0;k< G->e;k++){ //建立边表

cin>>i>>j; //读入边<Vi,Vj>的定点对应序号

s=new EdgeNode; //生成新边表结点s

s->adjvex=j; //邻接点序号为j

s->next=G->adjlist[i].firstedge; //将新边表结点s插入到顶点Vi的边表头部

G->adjlist[i].firstedge=s;

}

}//CreateAlGraph


void DFSAL(ALGraph *G,int i){

//以Vi为出发点对邻接表存储的图G,进行DFS(Depth_First Search)搜索

EdgeNode *p;

cout<<"Visit vertex:V"<<G->adjlist[i].vertex<<endl; //访问顶点Vi

visited[i]=1; //标记Vi以访问

p=G->adjlist[i].firstedge; //取Vi边表头指针

while (p) { //依次搜索Vi的邻接点Vj,j=p->adjvex

if (!visited[p->adjvex]) DFSAL(G,p->adjvex);//若Vj尚未访问,则以Vj为出发点向纵深搜索

p=p->next; //找Vi的下一个邻接点

}

}//DFSAL


void DFSTraverseAL(ALGraph *G){

//深度优先遍历以邻接表储存的图G

int i;

for (i=0;i< G->n;i++)

visited[i]=0; //标志向量初始化

for (i=0;i< G->n;i++)

if (!visited[i])

DFSAL(G,i); //若Vi未访问过,从Vi开始DFS搜索

}//DFSTraveseAL


int _tmain(int argc, _TCHAR* argv[])
{ int abreak=0;

int aKeyPress;
ALGraph *G;
G=(ALGraph*)malloc(sizeof(ALGraph));
G->n=0;

MGraph *MG;

MG=(MGraph*)malloc(sizeof(MGraph));
while(!abreak){

cout<<"1.建立图(默认)"<<endl;

cout<<"2.深度优先遍历"<<endl;

cout<<"3.退出"<<endl;

cout<<"请选择:";

cin>>aKeyPress;

switch (aKeyPress){

case 1:

cout<<"0.邻接链表储存方式(默认)"<<endl;

cout<<"1.邻接矩阵储存方式"<<endl;

cout<<"请选择:";

cin>>Gtype;

if (Gtype!=1){

Gtype=0;

CreateALGraph(G);

}

else

CreateMGraph(MG);

break;

case 2:

if (!G->n) //判断是否存在已建立图

cout<<"请先建立图!"<<endl;

else

if (Gtype)

cout<<"本程序尚不支持邻接矩阵遍历搜索"<<endl;

else

DFSTraverseAL(G); //深度遍历访问

break;

case 3:

abreak=1;

break;

default:

cout<<"对不起您输入的指令不存在!"<<endl;

}

}


return 0;
}

2005-12-11 09:47
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
复制粘贴后  源码有点错位  大家凑合点看吧
2005-12-11 09:48
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
这个程序在.NET可以运行 但容错性不好。。。。
[IMG]http://img202.photo.163.com/riqiangyan/23574012/595500762.jpg[/IMG]
2005-12-11 09:50
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
[IMG]http://img202.photo.[/IMG]
2005-12-11 09:51
ringer1314
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-10-25
收藏
得分:0 
[IMG]http://img202.photo.[/IMG]
2005-12-11 09:52
快速回复:[求助]帮忙看下,哪里出了错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020204 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved