数据结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
第 6 次实验
学号:20141060106 :叶佳伟
一、实验目的
1、复习图的逻辑结构、存储结构及基本操作;
2、掌握邻接矩阵、邻接表及图的创建、遍历;
3、了解图的应用。
二、实验容
1、(必做题)假设图中数据元素类型是字符型,请采用邻接矩阵或邻接表实现图的以下基本操作:
( 1)构造图(包括有向图、有向网、无向图、无向网);
( 2)根据深度优先遍历图;
( 3)根据广度优先遍历图。
三、算法描述
(采用自然语言描述)
四、详细设计
(画出程序流程图)
五、程序代码
(给出必要注释)
#include
#include
#include
#include
#include
#define INFINITY 255678 /*赋初值用*/
#define MAX_VERTEX_NUM 20 /* 最大顶点个数*/
enum {DG, DN, UDG, UDN};
.
.
typedef struct ArcCell
{
int adj;/*顶点关系类型,对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值*/ char *info;/*弧相关信息指针*/
}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
char vexs[MAX_VERTEX_NUM][5];/*顶点向量*/
AdjMatrix arcs; /*邻接矩阵*/
int vexnum, arcnum;/*图的当前顶点数和弧数*/
int kind;
}MGraph;
void CreateDG(MGraph *G);
void CreateDN(MGraph *G);
void CreateUDG(MGraph *G);
void CreateUDN(MGraph *G);
int LocateVex(MGraph *G, char v[]);
void print(MGraph *G);
int main(void)
{
MGraph *G;
G = (MGraph *)malloc(sizeof(MGraph));
printf("请选者0-有向图,1-有向网,2-无向图,3-无向网: ");
scanf("%d", &G->kind);
switch(G->kind)
{
case DG :
CreateDG(G);
print(G);
break;
case DN :
CreateDN(G);
print(G);
break;
case UDG :
CreateUDG(G);
.
.
print(G);
break;
case UDN :
CreateUDN(G);
print(G);
break;
default :
break;
}
getch();
}
/*建立有向图*/
void CreateDG(MGraph *G)
{
int i, j, k;
char v1[5], v2[5];
printf("输入顶点数和弧数: ");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar();
for(i = 0; i < G->vexnum; i++)
{
scanf("%s", G->vexs[i]); /*自动赋值顶点向量*/ }
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;
}
}
for(k = 0; k < G->arcnum; k++)
{
scanf("%s%s", v1, v2); /*输入一条边依附的顶点和权值*/
i = LocateVex(G, v1); /*确定v1和v2在G中位置*/
j = LocateVex(G, v2);
.
.
G->arcs[i][j].adj = 1; /*弧的权值赋值*/
}
}
/*建立有向网*/
void CreateDN(MGraph *G)
{
int i, j, k, w;
char v1[5], v2[5];
printf("输入顶点数和弧数: ");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar();
for(i = 0; i < G->vexnum; i++)
{
scanf("%s", G->vexs[i]); /*自动赋值顶点向量*/ }
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;
}
}
for(k = 0; k < G->arcnum; k++)
{
scanf("%s%s%d", v1, v2, &w); /*输入一条边依附的顶点和权值*/
i = LocateVex(G, v1); /*确定v1和v2在G中位置*/
j = LocateVex(G, v2);
G->arcs[i][j].adj = w; /*弧的权值赋值*/
}
}
/*建立无向图*/
void CreateUDG(MGraph *G)
{
int i, j, k;
char v1[5],v2[5];
.
.