#include <stdio.h>
#define MaxVertexNum 100
#define QueueSize 30
typedef enum{FALSE,TRUE}Boolean;
Boolean visited[MaxVertexNum];
typedef char VertexType;
typedef int EdgeType;
typedef struct node //边表结点
{
int adjvex; //邻接点域
struct node *next; //域链
//若是要表示边上的权,则应增加一个数据域
}EdgeNode;
typedef struct vnode //顶点边结点
{
VertexType vertex; //顶点域
EdgeNode *firstedge;//边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist; //邻接表
int n,e; //图中当前顶点数和边数
}ALGraph; //对于简单的应用,无须定义此类型,可直接使用AdjList类型
/************************************************************************/
/* 建立无向图的邻接表算法 */
/************************************************************************/
void CreateGraphAL (ALGraph *G)
{
int i,j,k;
EdgeNode * s;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
scanf("%d,%d",&(G->n),&(G->e)); // 读入顶点数和边数
printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:\n");
for (i=0;i<G->n;i++) // 立有n个顶点的顶点表
{
scanf("\n%c",&(G->adjlist[i].vertex)); // 读入顶点信息
G->adjlist[i].firstedge=NULL; // 点的边表头指针设为空
}
printf("请输入边的信息(输入格式为:i,j):\n");
for (k=0;k<G->e;k++) // 建立边表
{
scanf("\n%d,%d",&i,&j); // 读入边<Vi,Vj>的顶点对应序号
s=new EdgeNode; // 生成新边表结点s
s->adjvex=j; // 邻接点序号为j
s->next=G->adjlist[i].firstedge; // 将新边表结点s插入到顶点Vi的边表头部
G->adjlist[i].firstedge=s;
s=new EdgeNode;
s->adjvex=i;
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s;
}
}
/************************************************************************/
/* 深度优先遍历 */
/************************************************************************/
void DFS(ALGraph *G,int i)
{
//以vi为出发点对邻接表表示的图G进行深度优先搜索
EdgeNode *p;
printf("visit vertex:%c\n",G->adjlist[i].vertex); // 访问顶点vi
visited[i]=TRUE; //标记vi已访问
p=G->adjlist[i].firstedge; //取vi边表的头指针
while(p)
{ //依次搜索vi的邻接点vj,这里j=p->adjvex
if (!visited[p->adjvex]) //若vi尚未被访问
DFS(G,p->adjvex); //则以Vj为出发点向纵深搜索
p=p->next; //找vi的下一邻接点
}
}
void DFSTraverseM(ALGraph *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=FALSE;
for(i=0;i<G->n;i++)
if(!visited[i])
DFS(G,i);
}
/************************************************************************/
/* 广度优先遍历 */
/************************************************************************/
typedef struct
{
int front;
int rear;
int count;
int data[QueueSize];
}CirQueue;
void InitQueue(CirQueue *Q)
{
Q->front=Q->rear=0;
Q->count=0;
}
int QueueEmpty(CirQueue *Q)
{
return Q->count=QueueSize;
}
int QueueFull(CirQueue *Q)
{
return Q->count==QueueSize;
}
void EnQueue(CirQueue *Q,int x)
{
if (QueueFull(Q))
printf("Queue overflow");
else
{
Q->count++;
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
int DeQueue(CirQueue *Q)
{
int temp;
if(QueueEmpty(Q))
{
printf("Queue underflow");
return NULL;
}
else
{
temp=Q->data[Q->front];
Q->count--;
Q->front=(Q->front+1)%QueueSize;
return temp;
}
}
void BFS(ALGraph*G,int k)
{ // 以vk为源点对用邻接表表示的图G进行广度优先搜索
int i;
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
InitQueue(&Q); //队列初始化
printf("visit vertex:%c\n",G->adjlist[k].vertex); //访问源点vk
visited[k]=TRUE;
EnQueue(&Q,k); //vk已访问,将其人队。(实际上是将其序号人队)
while(!QueueEmpty(&Q))
{ //队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p)
{ //依次搜索vi的邻接点vj(令p->adjvex=j)
if(!visited[p->adjvex])
{ //若vj未访问过
printf("visit vertex:%c",G->adjlist[p->adjvex].vertex); //访问vj
visited[p->adjvex]=TRUE;
EnQueue(&Q,p->adjvex); //访问过的vj人队
}
p=p->next; //找vi的下一邻接点
}
}
}
void BFSTraverseM(ALGraph *G)
{
int i;
for (i=0;i<G->n;i++)
visited[i]=FALSE;
for (i=0;i<G->n;i++)
if (!visited[i])
BFS(G,i);
}
/************************************************************************/
/* 主函数调用 */
/************************************************************************/
int main()
{
ALGraph G;
CreateGraphAL(&G);
printf("深度优先遍历:\n");
DFSTraverseM(&G);
printf("广度优先遍历:\n");
BFSTraverseM(&G);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
建立有向图的邻接表更简单,每当读人一个顶点对序号 <i,j> 时,仅需生成一个邻接序号为j的边表结点,将其插入到vj的出边表头部即可。 同时没个节点带权访问。 邻接表的形式说明 typedef struct node{//边表结点 int adjvex; //邻接点域 struct node *next; //链域 //若要表示边上的权,则应增加一个数据域 }EdgeNode; typedef struct vnode{ //顶点表结点 VertexType vertex; //顶点域 EdgeNode *firstedge;//边表头指针 }VertexNode; typedef VertexNode AdjList[MaxVertexNum];//AdjList是邻接表类型 typedef struct{ AdjList adjlist;//邻接表 int n,e; 图中当前顶点数和边数 }ALGraph; //对于简单的应用,无须定义此类型,可直接使用AdjList类型。
资源推荐
资源详情
资源评论
收起资源包目录
图的邻接表.rar (13个子文件)
图的邻接表
图的邻接表.ncb 33KB
图的邻接表.dsw 545B
Debug
vc60.pdb 44KB
vc60.idb 33KB
图的邻接表.pdb 337KB
图的邻接表.ilk 171KB
邻接表.obj 12KB
图的邻接表.exe 164KB
图的邻接表.pch 199KB
邻接表.cpp 6KB
图的邻接表.dsp 4KB
图的邻接表.plg 1KB
图的邻接表.opt 48KB
共 13 条
- 1
资源评论
nice_rou1314
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功