#define MAXSIZE 20

#define FALSE 0

#define TRUE 1

#include

#include

#include

using namespace std;

typedef int Status;

//…………………………………………队列结构……………………

typedef struct qnode

{

int data;

struct qnode *next;

}qnode,*queueptr;

typedef struct

{

queueptr front;

queueptr rear;

}linkqueue;

//…………………………………………邻接表结构…………………………

typedef struct arcnode//弧结点

{

int adjvex; //该弧指向的顶点的位置

struct arcnode *nextarc; //弧尾相同的下一条弧

}arcnode;

typedef struct vnode//邻接链表顶点头接点

{

char data;//结点信息

arcnode *firstarc;//指向第一条依附该结点的弧的指针

}vnode,adjlist;

//…………………………………………图结构…………………………

typedef struct//图的定义

{

adjlist vertices;

int vexnum,arcnum; //顶点数,弧的条数

}algraph;

//无向图

//…………………………………………链队列定义……………………

void InitQueue(linkqueue &q)//初始化队列

{

q.rear  =  (queueptr)malloc(sizeof(qnode));

if(!q.front)  exit(-1); //分配空间失败

q.front  =  q.rear; q.front->next = NULL;

}

Status Queue_empty(linkqueue q)//判断队为空

{

if(q.front  ==  q.rear) return TRUE;

else return FALSE;

}

Status EnQueue(linkqueue &q,int e)//入队

{

queueptr p;

p = (queueptr)malloc(sizeof(qnode)); if(!p) exit(-1); //分配空间失败

p->data = e;  p->next = NULL;

q.rear->next = p;

q.rear = p;

return TRUE;

}

Status DeQueue(linkqueue &q,int &e)//出队

{

queueptr p;

if( Queue_empty(q) ) return FALSE;

p = q.front->next;

e = p->data;

q.front->next = p->next;

if(q.rear ==  p)  q.rear = q.front;

free(p);

return TRUE;

}

//…………………………………………邻接表定义……………………

int localvex(adjlist G_L[],char v)//返回V的位置

{

int i = 0;

//printf("da = ‘%c’ v = ‘%c’\n",G_L[i].data,v);

while(G_L[i].data != v)

{

//printf("da = %c ,v = %c",G_L[i].data,v);

++i;

}

//printf("i = %d\n",i);

return i;

}

void Print_G_L( algraph G,adjlist * G_L)

{

cout<

for(int i=0; i

{

printf(" [%d] (%c) : ",i,G_L[i].data);

arcnode * q = G_L[i].firstarc;

while(q ) {

printf(" %d",q->adjvex);

q = q->nextarc;

}

printf("\n");

}

}

Status CreteAdj( algraph &G ,adjlist *G_L)//用邻接表存储图

{

cout<>G.vexnum >>G.arcnum;

for(int i=0; i < G.vexnum; i++)

{

printf("请输入图的第%d个顶点(大写字母A,B,C...):",i+1);

cin>>G_L[i].data;

//printf("dat = %c",G_L[i].data);

}

for(int i=0;i

for(int i=0; i < G.arcnum; i++)

{

char first_v,second_v;

printf("请输入图的第%d条边,两顶点间逗号隔开(如‘A,B’不包括引号):",i+1);

getchar();

scanf("%c,%c",&first_v,&second_v);

//printf("fir = %c, sec = %c",first_v,second_v);

int loc1 = localvex( G_L,first_v  );//第1个顶点下标

int loc2 = localvex( G_L,second_v );//第2个顶点下标

//printf("loc1 = %d, loc2 = %d\n",loc1,loc2);

arcnode * p = (arcnode * )malloc(sizeof(arcnode)); if(!p) exit(-1); //first->second边

p->adjvex = loc2;  p->nextarc = NULL;

arcnode * q ;

if( G_L[loc1].firstarc == NULL || G_L[loc1].firstarc->adjvex < p->adjvex)

{ p->nextarc = G_L[loc1].firstarc;  G_L[loc1].firstarc = p;  }//p插在第一个

else{ //寻找新非零元在航标中的插入位置

for( q = G_L[loc1].firstarc ; (q->nextarc)&&(q->nextarc->adjvex < p->adjvex ); q = q->nextarc ) ; //循环到合适位置,这是个空循环

p->nextarc = q->nextarc; q->nextarc = p; //完成行插入

}//else

arcnode * p2 = (arcnode * )malloc(sizeof(arcnode)); if(!p2) exit(-1);//second->first边

p2->adjvex = loc1;  p2->nextarc = NULL;

if( G_L[loc2].firstarc == NULL || G_L[loc2].firstarc->adjvex < p2->adjvex)

{ p2->nextarc = G_L[loc2].firstarc;  G_L[loc2].firstarc = p2;  }//p插在第一个

else{ //寻找新非零元在航标中的插入位置

for( q = G_L[loc2].firstarc ; (q->nextarc)&&(q->nextarc->adjvex < p2->adjvex ); q = q->nextarc ) ; //循环到合适位置,这是个空循环

p2->nextarc = q->nextarc; q->nextarc = p2; //完成行插入

}//else

}

return TRUE;

}

void BFS( algraph G,adjlist G_L[] )//广度优先遍历

{

int i,e; arcnode * p;

int visit[MAXSIZE];//标志元素是否已被访问过,0:未访问, 1:已访问

linkqueue q;

InitQueue(q);

for(i=0; i != G.vexnum;++i)  visit[i] = FALSE;

cout<

for(i=0; i!=G.vexnum; ++i)

if( visit[i]==FALSE )

{

visit[i] = TRUE ;

cout<< G_L[i].data;

EnQueue(q , i );

while( !Queue_empty(q) )

{

DeQueue(q,e);

for(  p = G_L[e].firstarc; p; p = p->nextarc)

{

if( visit[p->adjvex]==FALSE ) //未访问

{

visit[p->adjvex] = TRUE;

cout<adjvex].data;

EnQueue(q,p->adjvex);

}

}//for

} //while

} //if

cout<

return;

}

void DFS(adjlist G_L[],int v,int visit[])

{// 从顶点v出发,深度优先搜索遍历连通图 G

cout<

visit[v] = TRUE;

arcnode * q = G_L[v].firstarc;

while( q )

{

if( !visit[q->adjvex])

DFS(G_L,q->adjvex,visit);

q = q->nextarc;

}

} // DFS

int main()

{

algraph G;//图

adjlist G_L[MAXSIZE];//图的邻接表

int visit[MAXSIZE] ={ FALSE }; //该数组用来标志对应下标的元素是否已被访问,初始 FALSE 未访问

CreteAdj( G ,G_L);

Print_G_L(G,G_L);

BFS(G,G_L);

cout<

DFS(G_L,0,visit); cout<

return 0;

}

java邻接表无向图的创建_无向图的邻接表创建以及图的深度和…相关推荐

  1. 在mysql中创建表的命令行_如何在命令行创建一个MySQL数据库

    展开全部 第一步:安装MySQL客户端 当然你得确保MySQL客户端已经安装完毕.如果没有的话,可以按62616964757a686964616fe59b9ee7ad9431333339653663照 ...

  2. 中间表增加额外字段_如何定制分表中间件

    前言 一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中的数据太大.对于前者我们可以借助缓存来减少一部分读操作,针对一些复杂的报表分析和搜索可以交给 Hadoop 和 El ...

  3. mysql表空间过大_详解MySQL表空间以及ibdata1文件过大问题

    ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...

  4. wordpress创建_如何在WordPress中创建问卷(简易方式)

    wordpress创建 Do you want to create a questionnaire in WordPress to survey your visitors or collect da ...

  5. java用for循环查询数据_使用for循环结果创建数据框

    我想创建一个数据框,其中df1值的平均值和df2值的平均值作为新数据框中的列 . 我可以得到要打印的值 for (i in samples) { print(c(with(df1, mean(d18_ ...

  6. java在文档末尾添加_如何在打开表单后将子文件添加到Word文档的末尾?

    我'm trying to write a macro that adds subdocuments to the end of a Word document when the Word docum ...

  7. java根据url获取pdf流_从URL获取动态创建的PDF

    我需要获取从aspx站点生成的pdf文件 . Backstory : 我想从一个网站获得schedueles,我已成功获取包含参数的scheduele的url . 如果您关注该网址,您将看到一个PDF ...

  8. rails 创建_使用Rails和Icecast创建在线流媒体广播

    rails 创建 Hello and welcome to this article! Today I would like to talk about creating an online stre ...

  9. MySQL留言板怎么创建_如何使用JSP+MySQL创建留言本(三)

    如何使用JSP+MySQL创建留言本(三)推荐查看本文HTML版本 下面我们开始建立留言的页面! import ="java.util.*" import ="jav ...

  10. 怎么制作自己的我的世界服务器,我的世界服务器怎么创建_我的世界服务器创建教程_牛游戏网...

    我的世界是一款自由度非常高的沙盒类游戏,玩家除了可以自己玩单机版以外,还可以建造服务器和别的玩家联机,下面口袋小编glp为大家带来我的世界创建服务器教程,希望大家喜欢. 1.下载 打开 2.查看自己的 ...

最新文章

  1. 区块链笔记-Hash算法
  2. (C++)1012 数字分类
  3. 推荐8款我最常用的办公软件,解决痛点问题!
  4. syskey——让你的电脑更加安全
  5. solr mysql 导入命令_(solr系列:四)将mysql数据库中的数据导入到solr中及删除solr中导入的数据...
  6. 主机动手系列 — 怎么管理Suse Linux
  7. 从PHP5到PHP7自我封装MongoDB以及平滑升级
  8. 互联网产品经理应该具备的技能(需求篇)
  9. tracert和traceroute使用
  10. 后端程序员转行前端,强烈推荐这6个前端UI框架,第二款小程序UI框架颜值最高!...
  11. 踩坑记录--VScode编辑不同文件没有及时crtl+s,导致文件修改无效
  12. arm与linux的些许问题,《ARM与Linux些许问题》第一章:ARM工作模式
  13. 数据库服务的安装,启动,关闭
  14. 【干货】怎样用深度学习做语音识别
  15. latex插入图像,插入跨栏图像
  16. 汉字编码原则及0XA1与0X80代表的含义。(汉字编码原则为转发)
  17. ibm 的java实现_IBM Java Toolbox for 实现IBM i 消息通信
  18. 关于java开发阿里云视频直播的使用及掉坑、爬坑,欢迎入坑交流
  19. 高考志愿填报APP靠谱吗?大数据仅供参考不能依赖
  20. 中台战略-建中台与拆中台

热门文章

  1. ImageJ Nikon_如何用ImageJ进行粒度分析
  2. mongodb 扩展 libmongoc ssl_扩展面板
  3. renren-fast:使用人人开源renren-fast报错Error:(11, 39) java: 程序包io.renren.datasource.annotation不存在
  4. SQL:pgsql中查询一段时间内数据及相关时间操作
  5. Linux中tmux多终端复用和Screen多窗口工具
  6. 何川L3管理课_模块5_给评价
  7. 自动驾驶_基于强化学习的自动驾驶系统
  8. 从零开始搭二维激光SLAM --- 基于gtsam的后端优化的代码实现
  9. intra-mart
  10. Linux 设备模型