图的深度优先遍历 大神带我飞
逍康 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 时发生访问冲突。
这个错误真找不出来,请各位大神看看