您的当前位置:首页正文

Graph.c

2022-01-04 来源:榕意旅游网
一.实验目的

一是让学习者通过实习掌握《数据结构》中的知识。对于《图的存储与遍历》这一课题来说,所要求实现的是:图的邻接表存贮结构,输出该图中的元素。

二是通过实习巩固并提高实习者的C语言知识,提高其编程能力与专业水平。 二.问题描述

以邻接表存储图,并对图进行遍历,根据提示从键盘输入相应的内容来实现相应的功能。 数据结构设计: typedef struct ArcNode {

int adjvex;

struct ArcNode *nextArc; }ArcNode;

adjvex

typedef struct VNode {

char data; ArcNode *firstArc;

}VNode, AdjList[MAX_VERTEXT_NUM];

nextArc nextArc

typedef struct {

AdjList verTices; int vexNum; int arcNum; }ALGraph;

verTices

三.功能(函数)设计

vexNum firstArc arcNum 1.void CreateGraph(ALGraph *G)//以邻接表存储一个图 2.void DisplayGraph(ALGraph *G)//输出图中的每一个元素 该程序的流程图为:

DisplayGraph() CreateGraph() Main() 四、实验结果(程序)及分析 1.实验的的源代码及相关的注释:

//包含头文件 #include #include

#define MAX_VERTEXT_NUM 20 //宏定义

typedef struct ArcNode//边表结点 {

int adjvex;//邻接点域

struct ArcNode *nextArc;//链域 }ArcNode;

typedef struct VNode//顶点表结点 {

char data;//顶点域

ArcNode *firstArc;//边表头指针 }VNode, AdjList[MAX_VERTEXT_NUM];

typedef struct//定义了一个结构体,里面有三个成员 {

AdjList verTices;//相当于定义了一个元素类型为 struct VNode的

数组

int vexNum;//用来存输入的顶点数 int arcNum;//用来存输入的边数 //int kind; }ALGraph;

//函数声明

void CreateGraph(ALGraph *G);//建立图的邻接表 void DisplayGraph(ALGraph *G);//输出图中的每一个元素

void main() {

ALGraph *Graph = (ALGraph *)malloc(sizeof(ALGraph));//动态分配内存

CreateGraph(Graph); DisplayGraph(Graph); }

void CreateGraph(ALGraph *G)//以邻接表存储一个图 {

int i,j,k;

ArcNode *arcNode;//定义边表结点 printf(\"请输入顶点数和边数:\");

scanf(\"%d%d\

//建立顶点表

printf(\"建立顶点表\\n\"); for (i = 0; i < G->vexNum; i++) {

printf(\"请输入第%d个顶点:\

fflush(stdin);//刷新缓冲区,不能省略,省去可能会出错 G->verTices[i].data = getchar();//读入顶点信息 G->verTices[i].firstArc = NULL;//边表置为空表

}

//建立边表

printf(\"建立边表\\n\");

for (k = 0; k < G->arcNum; k++) {

printf(\"请输入(vi-vj)的顶点对序号\");

scanf(\"%d%d\读入边(Vi,Vj)的顶点对序号 arcNode = (ArcNode *)malloc(sizeof(ArcNode));//生成边表结点

arcNode->adjvex = j;//邻接点序号为j

arcNode->nextArc = G->verTices[i].firstArc;//插入表头 G->verTices[i].firstArc = arcNode;//将新结点插入顶点Vi的边表头部

arcNode = (ArcNode *)malloc(sizeof(ArcNode)); arcNode->adjvex = i;//邻接点序号为i

arcNode->nextArc = G->verTices[j].firstArc;//插入表头 G->verTices[j].firstArc = arcNode;//将新结点插入顶点Vj的边表头部 } }

void DisplayGraph(ALGraph *G)//输出图中的每一个元素 { int i;

for (i = 0; i < G->vexNum; i++) {

printf(\"%d->\

while (G->verTices[i].firstArc != NULL) {

printf(\"%d->\

G->verTices[i].firstArc G->verTices[i].firstArc->nextArc; }

printf(\"\\n\"); } }

2.测试数据

输入顶点数为4,边数为5,该图为:

经程序运行测试,结果如下:

2 1 3 0 =

五.实验总结

这次课程设计也让我充分认识到《数据结构》这门课的重要性。它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。同时它也有广泛的实际应用。总之,在这实验中,自己的C语言以及数据结构知识得到提高,编程能力也得到了提高。

因篇幅问题不能全部显示,请点此查看更多更全内容