图的创建和遍历

1 、采用书上第 161 页定义的图的邻接矩阵存储表示,编写算法实现图的下列基本操作。
(1)构造无向图 (2)构造无向网 (3)构造有向图 (4)构造有向网
2 、采用书上第 163 页定义的图的邻接表存储表示,编写算法实现图的下列基本操作。
(1)构造图 (2)深度优先搜索遍历图 (3)广度优先搜索遍历图
例题一:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int VRType;
typedef int InfoType;
typedef  char VertexType;
typedef int Status;
typedef enum {DG,DN,UDG,UDN} Graphkind;//{有向图,有向网,无向图,无向网}
typedef struct ArcCell {
	VRType adj;
	InfoType* info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
	VertexType vexs[MAX_VERTEX_NUM];
	AdjMatrix arcs;
	int vexnum, arcnum;
	Graphkind kind;
}MGraph;
int LocateVex(MGraph G, char v)
{
	int i;
	for (i = 0; i < G.vexnum; ++i)
	{
		if (G.vexs[i] == v)
			return i;
	}
	return -1;
}
Status CreateDG(MGraph& G)
{
	VertexType v1, v2;
	int i, j, k;
	printf("请分别输入顶点数目和边的数目:");
	scanf("%d %d", &G.vexnum,&G.arcnum);
	getchar();
	printf("输入顶点 G.vexs[1~%d]:", G.vexnum);
	for (i = 0; i < G.vexnum; ++i)
	{
		scanf("%c", &G.vexs[i]);
		getchar();
	}
	for (i = 0; i < G.vexnum; ++i)
	{
		for (j = 0; j < G.vexnum; ++j)
		{
			G.arcs[i][j].adj = INFINITY;
			G.arcs[i][j].info = NULL;
	    }
	}
	printf("输入边 G.arcs[1~%d]:",G.arcnum);
	for (k = 0; k < G.arcnum; ++k)
	{
		scanf("%c %c", &v1, &v2);
		getchar();
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[i][j].adj = 1;
	}
	return OK;
}
Status CreateDN(MGraph& G)
{
	int i, j, k, w;
	VertexType v1, v2;
	printf("请分别输入顶点数目和边的数目:");
	scanf("%d %d", &G.vexnum, &G.arcnum);
	getchar();
	printf("输入顶点 G.vexs[1~%d]:", G.vexnum);
	for (i = 0; i < G.vexnum; ++i)
	{
		scanf("%c", &G.vexs[i]);
		getchar();
	}
	for (i = 0; i < G.vexnum; ++i)
	{ //Init()
		for (j = 0; j < G.vexnum; ++j)
		{
			G.arcs[i][j].adj = INFINITY;
			G.arcs[i][j].info = NULL;
		}
	}
	for (k = 0; k < G.arcnum; ++k)
	{
		printf("输入第%d条边vi,vj和权值 w(int): \n", k + 1);
		scanf("%c %c %d", &v1, &v2, &w);
		getchar();
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[i][j].adj = w;
	}
	return OK;
}
Status CreateUDG(MGraph& G)
{
	int i, j, k;
	VertexType v1, v2;
	printf("请分别输入顶点数目和边的数目:");
	scanf("%d %d", &G.vexnum, &G.arcnum);
	getchar();
	printf("输入顶点 G.vexs[1~%d]:", G.vexnum);
	for (i = 0; i < G.vexnum; ++i)
	{
		scanf("%c", &G.vexs[i]);
		getchar();
	}
	for (i = 0; i < G.vexnum; ++i)
	{ //Init()
		for (j = 0; j < G.vexnum; ++j)
		{
			G.arcs[i][j].adj = INFINITY;
			G.arcs[i][j].info = NULL;
		}
	}
	printf("输入边 G.arcs[1~%d]:",G.arcnum);
	for (k = 0; k < G.arcnum; ++k)
	{
		scanf("%c %c", &v1, &v2);
		getchar();
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[j][i].adj = G.arcs[i][j].adj = 1;
	}
	return OK;
}
Status CreateUDN(MGraph& G)
{
	int i, j, k, w;
	VertexType v1, v2;
	printf("请分别输入顶点数目和边的数目:");
	scanf("%d %d", &G.vexnum, &G.arcnum);
	getchar();
	printf("输入顶点 G.vexs[1~%d]:", G.vexnum);
	for (i = 0; i < G.vexnum; ++i)
	{
		scanf("%c", &G.vexs[i]);
		getchar();
	}
	for (i = 0; i < G.vexnum; ++i)
	{ //Init()
		for (j = 0; j < G.vexnum; ++j)
		{
			G.arcs[i][j].adj = INFINITY;
			G.arcs[i][j].info = NULL;
		}
	}
	for (k = 0; k < G.arcnum; ++k)
	{
		printf("输入第%d条边vi,vj和权值 w(int): \n", k + 1);
		scanf("%c %c %d", &v1, &v2, &w);
		getchar();
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[j][i].adj = G.arcs[i][j].adj = w;
	}
	return OK;
}
Status CreateGraph(MGraph& G) {
	printf("输入图的种类:");
	scanf("%d",&G.kind);
	switch (G.kind) 
	{
	case DG:return CreateDG(G);
	case DN:return CreateDN(G);
	case UDG:return CreateUDG(G);
	case UDN:return CreateUDN(G);
	default:return ERROR;
	}
}
void list(MGraph G)
{
    int i, j;
    printf("输出邻接矩阵: \n");
    for (i = 0; i < G.vexnum; ++i)
    {
        printf("%c----", G.vexs[i]);
        for (j = 0; j < G.vexnum; ++j)
        {
            if (G.arcs[i][j].adj == INFINITY)
            {
                printf("%4s", "∞");
            }
            else
            {
                printf("%4d", G.arcs[i][j].adj);
            }
        }
        printf("\n");
    }
}
int main()
{
	MGraph G;
	CreateGraph(G);
	list(G);
	return 0;
}

例题二://咳咳~,找不到了//

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值