大学实验4:利用数组表示法建立无向网

实验目的:深入理解图的邻接矩阵存储结构

实验内容:

已知某无向网如图所示,要求利用数组表示法建立该网。

基本思想:编写两个功能函数,一个负责建立无向网的邻接矩阵存储结构,另一个负责对无向网的打印输出。

步骤1:引入必要的函数库

1 #include <stdio.h>
2 #include <stdlib.h>

步骤2:定义常量

/*定义最大的顶点个数*/

#define MAX_VERTEX_NUM 100

/*定义常量INFINITY,该常量表示两个顶点间没有边相关联*/

#define INFINITY 65535

F此时编译一下,看是否正确。

步骤3:对抽象的顶点类型和权值类型进行实例化

1 /* 实例化顶点类型:VertexType是用长度为3的字符串实现的,其中顶点名称占2个字符,结束符"\0"占1个字符 */
2 typedef char VertexType[3];
3 /*实例化权值类型:EdgeType是用整型实现的*/
4 typedef int EdgeType;

F此时编译一下,看是否正确。

步骤4:定义结构体

1 typedef struct {
2     VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
3     EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
4     int vexnum, arcnum;  //顶点数量和边的数量
5 } MGraph;

F此时编译一下,看是否正确。

步骤5:声明以下功能函数

1 /*建立无向网的邻接矩阵存储结构*/
2 void CreateMGraph(MGraph *G);
3 /*输出无向网的邻接矩阵存储结构*/
4 void DisplayGraph(MGraph G);

F此时编译一下,看是否正确。

步骤6:实现函数CreateMGraph()。

提示:先建立顶点向量G->vexs[],然后对邻接矩阵G->arcs[][]进行初始化,最后依次为每一条边赋权值。由于是无向网,因此边<Vi,Vj>对应于邻接矩阵中的两个元素,即G->arcs[i][j]和G->arcs[j][i]。

 1 void CreateMGraph(MGraph *G)
 2 {
 3     /* i,j,k为控制变量,w用于保存用户输入的边的权值*/
 4     int i,j,k,w;
 5     printf("输入顶点数和边数:");
 6     scanf("%d%d",&G->vexnum,&G->arcnum);
 7     printf("\n输入所有的顶点:");
 8     /*输入所有的顶点*/
 9     for (i=0; i<G->vexnum; i++)
10         scanf("%s",&G->vexs[i]);
11     /*初始化邻接矩阵*/
12     for(i=0; i<G->vexnum; i++)
13         for(j=0; j<G->vexnum; j++)
14             G->arcs[i][j]=INFINITY;
15     /*建立邻接矩阵*/
16     for (k=0; k<G->arcnum; k++)
17     {
18         printf("输入边<Vi,Vj>的行下标i,列下标j和权值w:");
19         scanf("%d%d%d",&i,&j,&w);
20         G->arcs[i][j]=w;
21         G->arcs[j][i]=G->arcs[i][j];
22         printf("\n");
23     }
24 }

步骤7:实现函数DisplayGraph()。

 1 void DisplayGraph(MGraph G) {
 2     int i,j;
 3     /*输出网中的顶点数,边数和所有的顶点*/
 4     printf("无向网含有%d个顶点和%d条边,顶点依次为:",G.vexnum,G.arcnum);
 5     for(i=0; i<G.vexnum; i++)
 6         printf("%s,",G.vexs[i]);
 7     printf("\n");
 8     printf("无向图的:\n");
 9     printf("序号i=");
10     /*输出列号*/
11     for(i=0; i<G.vexnum; i++)
12         printf("%8d",i);
13     printf("\n");
14     /*输出邻接矩阵中的每一行*/
15     for(i=0; i<G.vexnum; i++) {
16         /*输出行号*/
17         printf("%8d",i);
18         for(j=0; j<G.vexnum; j++)
19             printf("%8d",G.arcs[i][j]);
20         /*换行,准备输出下一行*/
21         printf("\n");
22     }
23 }

运行效果

参考文献

1.严蔚敏,吴伟民,《数据结构(C语言版)》,清华大学出版社,1997

2.陈锐,《零基础学数据结构》,机械工业出版社,2010

3.程杰,《大话数据结构》,清华大学出版社,2011

原文地址:https://www.cnblogs.com/lgqrlchinese/p/10104851.html

时间: 2024-10-12 15:34:03

大学实验4:利用数组表示法建立无向网的相关文章

虚基类练习:动物(利用虚基类建立一个类的多重继承,包括动物(animal,属性有体长,体重和性别),陆生动物(ter_animal,属性增加了奔跑速度),水生动物(aqu_animal,属性增加了游泳速度)和两栖动物(amp_animal)。)

Description 长期的物种进化使两栖动物既能活跃在陆地上,又能游动于水中.利用虚基类建立一个类的多重继承,包括动物(animal,属性有体长,体重和性别),陆生动物(ter_animal,属性增加了奔跑速度),水生动物(aqu_animal,属性增加了游泳速度)和两栖动物(amp_animal).其中两栖动物保留了陆生动物和水生动物的属性. Input 两栖动物的体长,体重,性别,游泳速度,奔跑速度(running_speed) Output 初始化的两栖动物的体长,体重,性别,游泳速度

EularProject 48: 利用数组求和

Problem 48 The series, 11+22+33+...+1010=10405071317. Find the last ten digits of the series, 11+22+33+...+10001000. Answer: 9110846700 Completed on Thu, 23 Jul 2015, 17:26 初步思路,可以利用元对的方式计算每一个数需要乘的数 def func(a): for i in range(0,len(a)): a[i][1]*=a[i

利用数组求前n个质数

我的算法思想和实现方式都在代码和注释当中呢,这样的方式确实使算法复杂度降低一个等级,很好啊. #include <stdio.h> #include <time.h> /** * 利用数组求前n个质数 * 确定一个数m是否为质数,可以用已求出的质数对m * 的整除性来确定 */ //如果不知道质数的特性和想不到优化思路的方法 void getNPrimes_normal(); //优化之后的方法 void getNPrimes_optimize(); int main(void)

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

1题目 实现两个链表的合并 2基本功能要求: 1.建立两个链表A和B,链表元素个数分别为m和n个. 2.假设元素分别为(x1,x2,-xm),和(y1,y2, -yn).把它们合并成一个线性表C,使得: 当m>=n时,C=x1,y1,x2,y2,-xn,yn,-,xm 当n>m时,C=y1,x1,y2,x2,-ym,xm,-,yn 3.输出线性表C: 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D. 3测试数据: (1)A表(30,41,15,12,56,80) B表(23,56,

【示例】C语言中利用数组存放函数指针

C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: int max(int,int); // 声明函数,比较两数大小 int (*p)(); //声明指向函数的指针变量 p=max; //将函数max的入口地址赋给指针变量p int c=(*p)(a,b); //调用函数 2.函数指针作为函数参数 该例子中每次给process函数不同实参(函数名)

使用数组的方法建立一颗二叉树

说明:使用数组的方法建立一颗二叉树 例如有一个数组 int p[7] = { 0, 1, 2, 3, 4, 5, 6 };那么如何把这个数组建立成一颗二叉树呢?请看下面的代码. /*************************************************************************** * @file: main.cpp * @author: ugly_chen * @date: 2015.1.3 * @remark: this code is for

采用头插插法和尾插法建立单项链表

PS: 来源2014年数据结构联考复习指导 Page27. #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; const int END_INPUT = -1; typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; LinkList CreatList1(LinkList

【算法与数据结构】图 -- 数组表示法

图的数组表示法 借助一个二维数组表示图,该二维数组的第i行,第j列的值表示从Node[i]到Node[j]: 无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称. 有向图(网):是否有弧 / 权值. //图的数组表示法 //最大顶点个数 const int MAX_VERTEX = 100; //最大值 const int MAX_VALUE = (1 << 31) - 1; typedef struct _tagArcCel

SAS笔记(8) 利用数组重构SAS数据集

在实际应用中,我们经常会把宽数据(一个患者一条观测)转化为长数据(一个患者多条观测)或者将长数据(一个患者多条观测)转换为宽数据(一个患者一条观测),在R中我们可以利用Reshape2包来实现.在SAS中有两种实现方法:数组和TRANSPOSE.这一篇博文先讲解利用数组重构SAS数据,下一篇博文将介绍利用TRANSPOSE函数重构SAS数据. 1.宽数据变长数据 ***创建数据集 DATA DIAGNOSE; INPUT @1 PATNO 2. @3 DATE MMDDYY10. @14 DX1