无向图的邻接表创建以及图的深度和…
来源:互联网 发布:python time.sleep修改 编辑:程序博客网 时间:2024/06/05 15:18
#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;
typedefstruct
{
queueptrfront;
queueptr rear;
}linkqueue;
//…………………………………………邻接表结构…………………………
typedef structarcnode//弧结点
{
int adjvex;//该弧指向的顶点的位置
struct arcnode *nextarc;//弧尾相同的下一条弧
}arcnode;
typedef structvnode//邻接链表顶点头接点
{
chardata;//结点信息
arcnode*firstarc;//指向第一条依附该结点的弧的指针
}vnode,adjlist;
//…………………………………………图结构…………………………
typedefstruct//图的定义
{
adjlistvertices;
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(linkqueueq)//判断队为空
{
if(q.front == q.rear) return TRUE;
else returnFALSE;
}
Status EnQueue(linkqueue &q,inte)//入队
{
queueptrp;
p = (queueptr)malloc(sizeof(qnode));if(!p) exit(-1); //分配空间失败
p->data = e; p->next = NULL;
q.rear->next = p;
q.rear =p;
returnTRUE;
}
Status DeQueue(linkqueue &q,int&e)//出队
{
queueptrp;
if( Queue_empty(q) ) returnFALSE;
p =q.front->next;
e =p->data;
q.front->next =p->next;
if(q.rear == p) q.rear = q.front;
free(p);
returnTRUE;
}
//…………………………………………邻接表定义……………………
int localvex(adjlist G_L[],charv)//返回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<<"————————图的邻接表——————"<<endl;
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<<endl<<"请依次输入图的‘顶点’和‘边’的个数(‘空格’隔开):";cin>>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:已访问
linkqueueq;
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<<G_L[p->adjvex].data;
EnQueue(q,p->adjvex);
}
}//for
} //while
} //if
cout<<endl;
return;
}
void DFS(adjlist G_L[],int v,intvisit[])
{// 从顶点v出发,深度优先搜索遍历连通图 G
cout<<G_L[v].data;
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
intmain()
{
algraph G;//图
adjlistG_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<<endl;
return 0;
}
0 0
- 无向图的邻接表创建以及图的深度和…
- 邻接表无向图的创建和遍历(dfs)
- 无向图邻接表的深度优先遍历(DFS)
- 无向图邻接表的深度优先遍历
- 无向图的邻接表深度优先算法
- 无向图的深度优先遍历和广度优先遍历(邻接链表)
- 无向图的邻接表描述和遍历
- 无向图的表示:邻接矩阵和邻接表
- 无向图的邻接表算法
- 无向图的邻接表算法
- 邻接表无向图的介绍
- 无向图的邻接表
- 无向图的邻接表储存
- 无向图的邻接表存储
- 图-深度优先广度优先,以及邻接表的创建
- 图的邻接表的创建以及深度搜索和广度搜索
- c语言编程 输出一个无向图的邻接表,邻接矩阵,进行深度和广度优先遍历
- 基于邻接表的无向图的深度广度遍历实现
- 二叉排序树
- VS2012简单的使用感受+插件推荐【转】
- NYOJ-题目221 Tree
- NYOJ—题目88 找球号(一)
- 二叉平衡树
- 无向图的邻接表创建以及图的深度和…
- NYOJ-题目27 水池数目
- <将博客搬至CSDN>
- HeadFirst 设计模式-观察者模式
- 【备忘】Linux, Shell 常用命令,不定时更新
- VS 2005 beta2 到 正式版 升级后的问题。
- 逆波兰表达式算法
- Linux下常用文本处理命令
- CEdit 清空、设置多行显示