图的深度优先遍历 大神带我飞

逍康 2016-12-03 10:20:51
#include<iostream>
using namespace std;
#define MVNum 100
bool visited[MVNum] = { false, false, false, false, false };
bool visited1[MVNum] = { false, false, false, false, false };
struct Queue
{
char *base;
char *top;
int i = 0, j = 0;
}Q;
struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
struct VNode
{
char data;
struct ArcNode *firstarc;
}Vertices[MVNum];
struct Graph
{
int LT[10];
int vexnum, arcnum;
struct VNode Vertices[MVNum];
}G;
//定位
int locateVex(struct Graph G, char v)
{
int i;
for (i = 0; i < G.vexnum; i++)
{
if (G.Vertices[i].data == v)
{
return i;
}
}
return 0;
}
//创建邻接表储存图
int CreateUDG(struct Graph &G)
{
int i, j, k;
char v1, v2;
struct ArcNode *p1 = NULL,*p2=NULL;
cout << "请输入点数、边数" << endl;
cin >> G.vexnum >> G.arcnum;
for (i = 0; i < G.vexnum; i++)
{
cout << "请输入第" << i + 1 << "个的点信息" << endl;
cin >> G.Vertices[i].data;
G.Vertices[i].firstarc = NULL;
}
system("cls");
for (k = 0; k < G.arcnum; k++)
{
cout << "请输入v1、v2" << endl;
cin >> v1 >> v2;
i = locateVex(G, v1);
j = locateVex(G, v2);
p1 = new struct ArcNode;
p2 = new struct ArcNode;
p1->adjvex = j;
p1->nextarc = G.Vertices[i].firstarc;
G.Vertices[i].firstarc = p1;
p2->adjvex = i;
p2->nextarc = G.Vertices[j].firstarc;
G.Vertices[j].firstarc = p2;
}
for (i = 0; i < G.vexnum; i++)
{
cout << "请输入第" << i << "点的连通数" << endl;
cin >> G.LT[i];
}
system("cls");
return 0;
}
//查找第一个结点
int FirstAdjvex(struct Graph G, char c)
{
int i;
struct ArcNode *p=NULL;
for (i = 0; i < G.vexnum; i++)
{
if (G.Vertices[i].data == c)
p = G.Vertices[i].firstarc;
}
return p->adjvex;
}
//查找下一个节点
int NextAdjvex(struct Graph G, char c)
{
int i;
struct ArcNode *p = NULL;
for (i = 0; i < G.vexnum; i++)
{
if (G.Vertices[i].data == c)
p = G.Vertices[i].firstarc;
}
for (i = 0; i < G.vexnum; i++)
{
if (!visited1[p->adjvex])
{
return p->adjvex;
}
else
{
p = p->nextarc;
}

}
return 0;
}

//初始化队列
void InitQueue(struct Queue &Q)
{
char z;
Q.base = new char[10];
if (!Q.base) exit(1);
Q.top = Q.base;

}
//进队
void EnQueue(struct Queue &Q, char c)
{
*Q.top++ = c;
Q.i++;
}
//出队
int DeQueue(struct Queue &Q,struct Graph G)
{
int i;
char c;
c= *Q.base++;
cout << "真他妈烦人"<<endl;
Q.j++;
for (i = 0; i < G.vexnum; i++)
{
if (G.Vertices[i].data == c)
return i;
}
return 0;
}
//广度优先遍历
void BFS(struct Graph G, int j)
{
int w,i=0;
struct Queue Q;
cout << G.Vertices[j].data<<endl;
visited1[j] = true;
InitQueue(Q);
EnQueue(Q, G.Vertices[j].data);
while(Q.i!=Q.j)
{
i = 0;
j=DeQueue(Q,G);
for (w = FirstAdjvex(G, G.Vertices[j].data);i<G.LT[j]; w = NextAdjvex(G, G.Vertices[j].data))
{
i++;
if (!visited1[w])
{
cout << G.Vertices[w].data<<endl;
visited1[w] = true;
EnQueue(Q, G.Vertices[w].data);
}
}
}
}
//深度优先遍历
void DFS_AL(struct Graph G, int i)
{
int w;
struct ArcNode *p;
cout << G.Vertices[i].data << endl;
visited[i] = true;
p = G.Vertices[i].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (!visited[w]) DFS_AL(G, w);
p = p->nextarc;
}
}
int main()
{
int i,j;
struct Graph G;
CreateUDG(G);
cout << "您想从第几个顶点深度访问" << endl;
cin >> i;
DFS_AL(G, i);
cout << "您想从第几个顶点广度访问" << endl;
cin >> j;
BFS(G, j);
return 0;
}
0x013759DB 处有未经处理的异常(在 图的遍历.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。

这个错误真找不出来,请各位大神看看
...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-05
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 《算法精解(C语言描述)》
小灸舞 2016-12-05
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 版主 2016-12-03
  • 打赏
  • 举报
回复
从提示看你解引了NULL指针 出错时中断下来,通过调用堆栈定位到相关代码,分析原因 必要时单步跟踪程序运行,观察每一步是否与你期望的致

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧