数据结构的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;
}
///////////////////////////////////////////////////////////////////////////////////////////////////


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

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

数据结构:图的存储结构之邻接表

对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即...
  • Simba888888
  • Simba888888
  • 2013年04月30日 00:05
  • 49073

【数据结构】图的构建(邻接表法)

最近整理电脑,发现了以前写的数据结构的代码,由于时间久了,好多代码都找不到了,现在扒出来复习一下。 如果看不懂下面关于图的术语或者压根就不知道图。建议看一下严蔚敏版的《数据结构》中对图的介绍 ...
  • sundong_d
  • sundong_d
  • 2015年04月10日 19:12
  • 9584

数据结构之图的邻接表表示法

上篇
  • doubleselect
  • doubleselect
  • 2014年10月16日 16:31
  • 1200

数据结构:图的实现--邻接表

当图中的边数较少时,用邻接表来实现图结构,则会浪费很多内存空间。因此,考虑另一种实现图结构的方法:邻接表。在邻接表中主要有两种节点结构体:...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月01日 01:02
  • 5635

【数据结构】图邻接表存储实现

一个图 G = (V,E)由顶点(vertex)集 V 和边(edge)集 E 组成。
  • yeswenqian
  • yeswenqian
  • 2014年04月29日 21:46
  • 2344

数据结构---图(邻接表)

// Graph_Adjacency List.cpp : Defines the entry point for the console application. /*-----CODE FOR F...
  • Dream_WHui
  • Dream_WHui
  • 2015年03月02日 17:29
  • 1342

数据结构之用邻接表实现图(详解)

用邻接表表示图G=(V,E)时,对每个顶点i属于V,将它的所有邻接顶点存放在一个表中,这个表称为顶点i的邻接表。对每个顶点的邻接表存储在图G的邻接表数组中。 #include #incl...
  • qq544529563
  • qq544529563
  • 2013年11月12日 21:30
  • 1077

C语言实现数据结构图的遍历

  • 2010年06月19日 12:37
  • 192KB
  • 下载

《数据结构(C语言版)》- 图

本文将讨论非线性数据结构中的图型结构及其Java实现。
  • yz930618
  • yz930618
  • 2017年08月27日 22:37
  • 194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构的C实现_图_邻接表表示
举报原因:
原因补充:

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