数据结构的C实现_图_邻接表表示

原创 2012年03月22日 18:50:06
//图,用邻接表表示
//编译环境:Visual Studio 2008,win 32 console application
//ALGragh.c

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define MAX_VERTEX_NUM  10
#define QM 10 //队列的最大元素个数
int visited[MAX_VERTEX_NUM];
typedef char VertexType;
typedef int InfoType;

//弧节点(边节点)结构
typedef struct _ArcNode
{
int adjvex;//该弧所指向的顶点的位置
struct _ArcNode *nextarc;//指向下一条弧的指针
InfoType info;//信息,本例中为弧的权重
}ArcNode;

//顶点表节点结构
typedef struct _VNode
{
int data;
ArcNode *firstarc;//边表的头指针
}VNode;

//图的结构
typedef struct
{
VNode vertex[MAX_VERTEX_NUM];//表头向量
int vexnum,arcnum;//当前的顶点数和弧数
}AdjList;
////////////////////定义队列/////////////////////////
typedef struct
{
VertexType *base;
VertexType front,rear;
}SQueue;

////////////////////////////////////////////////////////////函数声明/////////////////////////////
int CreateGragh(AdjList *G);
int LocateVex(AdjList *G,VertexType v);
void DispGragh(AdjList *G);
void BFS(AdjList *G,int v0);//广度遍历
void DFS(AdjList *G,int v0);//深度遍历
///////////////////与队列有关的声明/////////////////////////////////
void InitQueue(SQueue *Q);
void EnQueue(SQueue *Q,int e);
int  QueueEmpty(SQueue *Q);
void DeQueue(SQueue *Q,int*e);
////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
int i;
AdjList *G;
G=(AdjList *)malloc(sizeof(AdjList));
CreateGragh(G);
DispGragh(G);
printf("广度优先遍历图:\n");
BFS(G,0);
printf("\n");
for(i=0;i<G->vexnum;i++)
visited[i]=0;
printf("深度遍历:\n");
DFS(G,0);
}

//用邻接表创建图
int CreateGragh(AdjList *G)
{
ArcNode *p;
int i,j,k,w;
printf("输入顶点数和边数:\n");
scanf_s("%d%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
{
G->vertex[i].firstarc=NULL;
G->vertex[i].data=i;//令表头节点的数据为其顶点号
}

for(k=0;k<G->arcnum;k++)
{
printf("输入第%d个边的两个顶点号(从0开始)和其权值\n",k+1);
scanf_s("%d%d%d",&i,&j,&w);
//printf("这个边是:%d---%d,权重%d\n",i,j,w);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=w;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;

p=(ArcNode *)malloc(sizeof(ArcNode));//无向图
p->adjvex=i;
p->info=w;
p->nextarc=G->vertex[j].firstarc;
G->vertex[j].firstarc=p;
}
return OK;
}


//给出顶点的值,返回顶点号
int LocateVex(AdjList *G,VertexType v)
{
int i;
for(i=0;i<G->vexnum;i++)
if(G->vertex[i].data==v)
return i;
return -1;
}


//
void DispGragh(AdjList *G)
{
ArcNode *p;
int i;
printf("\n\n");
printf("该图的邻接表为:\n");
for(i=0;i<G->vexnum;i++)
{
p=G->vertex[i].firstarc;
printf("G->vertex[%d]=%d:",i,G->vertex[i].data);
while(p!=NULL)
{
printf("%d(权重%d)\t",p->adjvex,p->info);
p=p->nextarc;
}
printf("\n");//换行,输出下一个表头所连接的节点
}
}

//广度优先遍历
void BFS(AdjList *G,int v0)
{
SQueue Q;
int v,j;
ArcNode *w;
InitQueue(&Q);
printf("%d ",G->vertex[v0].data);
visited[v0]=1;
EnQueue(&Q,v0);
while(!QueueEmpty(&Q))
{
DeQueue(&Q,&v);
w=G->vertex[v].firstarc;
while(w!=NULL)
{
j=w->adjvex;
if(!visited[j])
{
printf("%d ",G->vertex[j].data);
visited[j]=1;
EnQueue(&Q,j);
}
w=w->nextarc;
}
}
for(j=0;j<G->vexnum;j++)
{
if(!visited[j])
BFS(G,j);//遍历其他未访问的顶点
}
}

//深度优先遍历
void DFS(AdjList *G,int v0)
{
int j;
ArcNode *p=G->vertex[v0].firstarc;
printf("%d ",G->vertex[v0].data);
visited[v0]=1;
while(p!=NULL)
{
j=p->adjvex;
if(!visited[j])
DFS(G,j);
p=p->nextarc;
}
for(j=0;j<G->vexnum;j++)
{
if(!visited[j])
DFS(G,j);//遍历其他未访问的顶点
}

}
///////////////////////////////////////与队列有关的操作/////////////////////////////////////////////////////////////
void InitQueue(SQueue *Q)
{
Q->base=(VertexType *)malloc(QM*sizeof(VertexType));
if(!Q->base)exit(0);
Q->front=Q->rear=0;
}

void EnQueue(SQueue *Q,int e)
{
if((Q->rear+1)%QM==Q->front) exit(0);
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%QM;
}

int QueueEmpty(SQueue *Q)
{
if(Q->front==Q->rear)
return 1;
return 0;
}

void DeQueue(SQueue *Q,int *e)
{
if(Q->front==Q->rear)exit(0);
*e=Q->base[Q->front];
Q->front=(Q->front+1)%QM;
}
///////////////////////////////////////////////////////////////////////////////////////////////////


相关文章推荐

数据结构(16)--图的存储及实现

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社         图状结构是一种比树形结构更复杂的非线性结构。在树状结构中,结点间具有分支层次关系,每一层上的结点只能和上一层中的至多一个结...

数据结构之--图的讲解与C语言实现

数据结构–图图是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理...

邻接表(链表)存图

#include #include using namespace std; const int maxn=1010; int map[maxn][maxn]; //图的常用的存储方式两种 一种采用邻...
  • oenheng
  • oenheng
  • 2016年08月05日 21:30
  • 1084

图的邻接表和邻接矩阵

邻接表 一、邻接表 邻接表是图的一种链式存储结构。 邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。 邻接表中的表结...

图的邻接表存储 c实现

用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化,指针指向null。然后边表...

C-数据结构-图-邻接表和邻接矩阵创建和定义

//图 //定义 const int vnum=20; typedef struct gp { VertexType vexs[vnum]; int arcs[vnum][vnum]; int ...
  • wuhardy
  • wuhardy
  • 2016年12月07日 20:05
  • 715

模式识别:PCA主分量分析与Fisher线性判别分析

本实验的目的是学习和掌握PCA主分量分析方法和Fisher线性判别方法。首先了解PCA主分量分析方法的基本概念,理解利用PCA 分析可以对数据集合在特征空间进行平移和旋转。实验的第二部分是学习和掌握F...

最小生成树Prim与Kruskal算法的比较

最小生成树是图论问题中很基本的一个操作。常用的算法有Prim和Kruskal两种算法。本文对这两种算法稍作区别与讨论。Prim算法是依赖于点的算法。它的基本原理是从当前点寻找一个离自己(集合)最近的点...
  • Mollnn
  • Mollnn
  • 2016年09月19日 21:48
  • 2327

用邻接表实现图的数据结构

  • 2017年01月03日 12:16
  • 12KB
  • 下载

数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

本文给出了图的基于邻接表表示的实现。实现了DFS, BFS等图的基本操作。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构的C实现_图_邻接表表示
举报原因:
原因补充:

(最多只允许输入30个字)