数据结构 C语言 图

图:图是现实生活中经常经常用到的一种多对多的数据组织形式,在程序设计中有着广泛的应用,邻接矩阵则是用一组一维数组存储途中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。
通过该程序可以实现以邻接矩阵为储存结构的有向图,无向图,有向网,无向网的创建操作。
程序如下

#include<stdlib.h>
#include<stdio.h>
#define max_vertex_num 10
#define infinity 32768
#define Ture 1
#define False 0
#define Error -1
#define Ok 1

typedef enum{dg,dn,udg,udn} graphkind;
typedef char vertexdata;
typedef struct arcnode
{
	int adj;
} arcnode;

typedef struct
{
	vertexdata vexs[max_vertex_num];
	arcnode arcs[max_vertex_num][max_vertex_num];
	int vexnum,arcnum;
	graphkind kind;
}adjmatrix;

int locatevertex(adjmatrix *G,vertexdata v)//求顶点位置的函数
{
	int j=Error,k;
	for(k=0;k<G->vexnum;k++)
		if(G->vexs[k]==v)
		{
			j=k;
			break;
		}
		return j;
}

void menu()
{
	printf("*************************\n");
	printf("*请选择命令序号(0-4):\t*\n");
	printf("*1 输入有向网:\t\t*\n");
	printf("*2 输入无向网:\t\t*\n");
	printf("*3 输入有向图:\t\t*\n");
	printf("*4 输入无向图:\t\t*\n");
	printf("*0 退出:\t\t*\n");
	printf("*************************\n");
}

int creatdn(adjmatrix *G)
{
	int i,j,k,weight;
	vertexdata v1,v2;
	printf("您选择的是输入有向网!\n");
	printf("请输入有向网的弧数和顶点数\n");
	fflush(stdin); //清空输入缓冲区
	scanf("%d,%d",&G->arcnum,&G->vexnum);
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j].adj=infinity;
	for(i=0;i<G->vexnum;i++)
	{
		printf("输入图的顶点\n");
		fflush(stdin);
		scanf("%c",&G->vexs[i]);
	}
	for(k=0;k<G->arcnum;k++)
	{
		printf("输入一条边的两个顶点及权值\n");
		fflush(stdin);
		scanf("%c,%c,%d",&v1,&v2,&weight);
		i=locatevertex(G,v1);
		j=locatevertex(G,v2);
		G->arcs[i][j].adj=weight;
	}
	return Ok;
}

int creatudn(adjmatrix *G)
{
	int i,j,k,weight;
	vertexdata v1,v2;
	printf("您选择的是输入无向网!\n");
	printf("请输入无向网的弧数和顶点数\n");
	fflush(stdin); //清空输入缓冲区
	scanf("%d,%d",&G->arcnum,&G->vexnum);
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j].adj=infinity;
	for(i=0;i<G->vexnum;i++)
	{
		printf("输入图的顶点\n");
		fflush(stdin);
		scanf("%c",&G->vexs[i]);
	}
	for(k=0;k<G->arcnum;k++)
	{
		printf("输入一条边的两个顶点及权值\n");
		fflush(stdin);
		scanf("%c,%c,%d",&v1,&v2,&weight);
		i=locatevertex(G,v1);
		j=locatevertex(G,v2);
		G->arcs[i][j].adj=weight;
		G->arcs[j][i].adj=weight;
	}
	return Ok;
}

int creatdg(adjmatrix *G)
{
	int i,j,k;
	vertexdata v1,v2;
	printf("您选择的是输入有向图!\n");
	printf("请输入有向图的弧数和顶点数\n");
	fflush(stdin);
	scanf("%d,%d",&G->arcnum,&G->vexnum);
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j].adj=0;
	for(i=0;i<G->vexnum;i++)
	{
		printf("输入图的顶点\n");
		fflush(stdin);
		scanf("%c",&G->vexs[i]);
	}
	for(k=0;k<G->arcnum;k++)
	{
		printf("输入一条弧的两个顶点\n");
		fflush(stdin);
		scanf("%c,%c",&v1,&v2);
		i=locatevertex(G,v1);
		j=locatevertex(G,v2);
		G->arcs[i][j].adj=1;
	}
	return Ok;
}

int creatudg(adjmatrix *G)
{
	int i,j,k;
	vertexdata v1,v2;
	printf("您选择的是输入无向图!\n");
	printf("请输入无向图的弧数和顶点数\n");
	fflush(stdin);
	scanf("%d,%d",&G->arcnum,&G->vexnum);
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j].adj=0;
	for(i=0;i<G->vexnum;i++)
	{
		printf("输入图的顶点\n");
		fflush(stdin);
		scanf("%c",&G->vexs[i]);
	}
	for(k=0;k<G->arcnum;k++)
	{
		printf("输入一条弧的两个顶点\n");
		fflush(stdin);
		scanf("%c,%c",&v1,&v2);
		i=locatevertex(G,v1);
		j=locatevertex(G,v2);
		G->arcs[i][j].adj=1;
		G->arcs[j][i].adj=1;
	}
	return Ok;
}

void display(adjmatrix *G)
{
	int i,j;
	printf("输出如下:\n");
	for(i=0;i<G->vexnum;i++)
	{
		for(j=0;j<G->vexnum;j++)
			printf("%d\t",G->arcs[i][j].adj);
		printf("\n");
	}
}

void function()
{
	adjmatrix G;
	int i;
	menu();
	scanf("%d",&i);
	while(1)
	{
		switch(i)
		{
		case 1:{
			creatdn(&G);
			display(&G);}break;
		case 2:{
			creatudn(&G);
			display(&G);}break;
		case 3:{
			creatdg(&G);
			display(&G);}break;
		case 4:{
			creatudg(&G);
			display(&G);}break;
		case 0:exit(1);
		default:printf("输入的命令错误!请重新输入:\n");
		}
		menu();
		scanf("%d",&i);
	}
}

int main()
{
	function();
	return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值