关闭

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

标签: 数据结构cstructnull
2958人阅读 评论(0) 收藏 举报
分类:
//图,用邻接表表示
//编译环境: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;
}
///////////////////////////////////////////////////////////////////////////////////////////////////


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:181386次
    • 积分:2147
    • 等级:
    • 排名:第18319名
    • 原创:37篇
    • 转载:13篇
    • 译文:0篇
    • 评论:55条
    文章分类
    最新评论