无向图的创建和两种遍历
来源:互联网 发布:透视内裤软件 编辑:程序博客网 时间:2024/06/08 19:59
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#define maxSize (100)
typedef struct ArcNode{//弧结点
int info;//弧信息
struct ArcNode* nextarc;//指向下一个弧结点的指针
int adjvex;//弧指向结点在顺序表中的序号
}ArcNode;
typedef struct VNode{//定点结点
char data;//定点结点值
ArcNode*firstarc;//指向的第一条弧结点
}VNode;
typedef struct AGraph{
VNode adjlist[maxSize];//顶点列表
int e, n;//弧和顶点数目
}AGraph;
int adjloction(AGraph*G, char v)//查询顶点值为v的顶点在顺序链表中的位置
{
for (int i = 0; i < G->n; ++i)
if (G->adjlist[i].data == v)
return i;
return -1;
}
void CreateAGraph(AGraph *&G)//创建图
{
G = (AGraph*)malloc(sizeof(AGraph));
cout << "输入顶点数和弧数:" << endl;
cin >> G->n >> G->e;
cout << "输入顶点:" << endl;
for (int i = 0; i < G->n; ++i)
{
cin >> G->adjlist[i].data;
G->adjlist[i].firstarc = NULL;
}
cout << "输入弧:" << endl;
for (int i = 0; i < G->e; ++i)
{
ArcNode *arc = (ArcNode*)malloc(sizeof(ArcNode));
char v1, v2;
int a1, a2;
cin >> v1 >> v2;
a1 = adjloction(G, v1);
a2 = adjloction(G, v2);
arc->adjvex = a2;
//cin >> arc->info;
arc->nextarc = G->adjlist[a1].firstarc;
G->adjlist[a1].firstarc = arc;
arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = a1;
//cin>>arc->info;
arc->nextarc = G->adjlist[a2].firstarc;
G->adjlist[a2].firstarc = arc;
}
}
void Print(AGraph *G)//打印邻接表
{
ArcNode *p;
for (int i = 0; i < G->n; ++i)
{
cout << G->adjlist[i].data<<endl;
p = G->adjlist[i].firstarc;//p为第一条弧
while (p)
{
cout << " ->" << G->adjlist[p->adjvex].data<<endl;
p = p->nextarc;
}
}
}
int visit[maxSize];
void DFS(AGraph*G, char v)//深搜
{
cout << G->adjlist[adjloction(G, v)].data << endl;
visit[adjloction(G, v)] = 1;//标记已搜索
ArcNode*p = G->adjlist[adjloction(G, v)].firstarc;
while (p)
{
if (visit[p->adjvex] != 1)
DFS(G, G->adjlist[p->adjvex].data);
p = p->nextarc;
}
}
void BFS(AGraph*G, char v)//广搜
{
int queue[maxSize];
int mvisit[maxSize];
int rear=0, front = 0;
int j;
cout << v << endl;
mvisit[adjloction(G, v)] = 1;
rear = (rear + 1) % maxSize;
queue[rear] = adjloction(G, v);
while (rear!=front)//队列是否为空
{
front = (front + 1) % maxSize;
j = queue[front];
//cout << G->adjlist[j].data << endl;
//mvisit[j] = 1;//标记为已访问
ArcNode*p = G->adjlist[j].firstarc;
while (p)
{
if (mvisit[p->adjvex] != 1)
{
cout << G->adjlist[p->adjvex].data << endl;
mvisit[p->adjvex] = 1;
rear = (rear + 1) % maxSize;
queue[rear] = p->adjvex;
}
p = p->nextarc;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
AGraph*G;
CreateAGraph(G);
cout << "打印邻接表:" << endl;
Print(G);
cout << "打印深度优先搜索结果:" << endl;
DFS(G, G->adjlist[0].data);
cout << "打印广度优先搜索结果:" << endl;
BFS(G, G->adjlist[0].data);
return 0;
}
- 无向图的创建和两种遍历
- 邻接表无向图的创建和遍历(dfs)
- 邻接矩阵无向图的创建和遍历(dfs)
- 无向图的邻接矩阵创建与遍历
- 无向图的邻接矩阵表示和遍历
- 无向图的邻接表描述和遍历
- 无向图邻接矩阵的储存和深度优先遍历
- 无向图的深度和广度优先遍历(javascript)
- 无向图的深度和广度优先遍历
- 通过BFS 和 DFS两种方法找无向图的连通分量
- 无向图的深度优先遍历
- java中无向图的两种表示
- 无向图深度优先遍历和广度优先遍历
- 无向图的深度优先遍历和广度优先遍历(邻接链表)
- 无向图的深度优先遍历和广度优先遍历(递归)
- 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS
- 邻接矩阵实现无向图的创建
- 无向图的邻接矩阵创建表示
- hdu 1598 find the most comfortable road 举+最小生成树★★
- win7 安装.Net framework 4.0出现 安装不成功,错误代码0x80240037 的解决方法
- PHP安装与配置
- HDU6106 Classes 模拟|签到
- radis入门简介
- 无向图的创建和两种遍历
- 剑指offer--链表中环的入口结点
- 用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式
- Django实践之配置文件
- xmlspy wsdl方法
- Python3之继承与组合
- 算法导论 所有节点对的最短路径问题 矩阵法
- servlet中无法获取jsp中的用户注册信息,求助大神
- CyclicBarrier的用法