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;
}
例题二://咳咳~,找不到了//