c语言编程

写了一个存储图结构的代码,但是总是报错。经过和同学的讨论,原因竟然是scanf()可以吃掉一个字符,通过在此句话前面添加getchar()函数。谢谢这个同学的指导,心里面暖暖的。

/*
time:2020.7.4
reference:
1.C:\Users\wzq\Desktop\数据结构\数据结构 陈越 第2版.pdf
2.https://blog.csdn.net/qq_42304888/article/details/94992661 关于scanf()吃回车的解决办法
学习使用二维矩阵存储图中的矩阵
*/
#include
#include
#include

//定义一个图中最大的顶点数目,可以使用数据集中图顶点最大的个数作为顶点个数,比如AIDS数据库为200(假设情况)
#define MaxVertexNum 200
//定义二维数组的权重为计算机最大的数字65535
#define INFINITY 65535

//定义顶点编号的数据类型
typedef int Vertex;
//定义顶点信息的数据类型
typedef char DataType; 
//定义边的数据类型
typedef int WeightType;

typedef struct GNode *PtrToGNode;
//利用顺序存储,即二维数组的方式存储图的信息。GNode是图这个存储方式的节点信息,用结构体构建
struct GNode
{
	//存储顶点的个数
	int Nv;
	//存储边的个数
	int Ne;
	//一维数组存储顶点的信息.MaxVertexNum是顶点最大数量,DataType是顶点信息的数据类型
	//二者设置为100,char类型(后期可能要变,因为Si是俩个字符)
	DataType Data[MaxVertexNum];
	//二维数组存储边的信息
	WeightType G[MaxVertexNum][MaxVertexNum];
};

//使用别名MGraph
typedef PtrToGNode MGraph;

//定义指向边类型的指针
typedef struct ENode *PtrToENode;
//存储边的信息:起点 终点 权重三个信息
struct ENode 
{
	//边的起始顶点,边的终点
	Vertex start;
	Vertex end;
	//边的权值或者边的属性信息,按照边的属性要求修改数据类型
	WeightType weight;
};
typedef PtrToENode Edge;//这边什么意思?

//用链表表示的结构体分别是图信息和边信息,需要将整个图的信息组织到一起,这需要创建一个没有边的图
//输入:图顶点个数VertexNum 
//输出:数据类型为图节点类型MGraph的结构体变量MGraph
//功能:创建一个有VertexNum个顶点、边权重无穷大的图。顶点暂时不存放任何属性信息
MGraph CreateGraph(int VetexNum)
{
	//定义内存中所指向的图的变量
	MGraph Graph;
	//定义二维数组循环的变量
	Vertex V;
	Vertex W;

	//分配所需要开辟的空间
	Graph = (MGraph)malloc(sizeof(struct GNode));//这个函数需要理解含义,老不懂的如何分配空间
	//在Graph中添加图的信息:顶点个数 边个数 图的二维矩阵 。
	Graph->Nv = VetexNum;
	Graph->Ne = 0;//此时边的数量还未决定,下面插入边的操作实现
	//实现图的二维矩阵
	for(V=0; V<Graph->Nv;V++)
		for(W=0; W<Graph->Nv;W++)
			Graph->G[V][W] = INFINITY;// 设置边的权重

	//建立只含有顶点的图完毕,返回Graph
	return Graph;
}

//在只含有顶点个数,不含有边的图中插入边权重。可以理解为更新权重矩阵
//输入:已经含有顶点的图
//输出:插入边的图
void InsertEdge(MGraph graph,Edge e)
{
	//如果是有向图,则插入边的权重
	//在已经创建好的图graph中插入边权重e->weight
	graph->G[e->start-1][e->end-1]=e->weight;
	//如果无向图,插入边的权重
	graph->G[e->end-1][e->start-1] = e->weight;

}

//利用上面构建好的图结构和对图的操作,使用具体的数据,如何创建图
//输入:空(但是在控制台输入边数、边的起点 终点 权重、顶点的属性)
//输出:创建好的图Graph
MGraph BuildGraph()
{
	int Nv;
	int i;
	Edge E;
	Vertex V;
	MGraph Graph;

	//1.创建不含顶点和边信息的图。输入顶点个数,调用CreateGraph(int VertexNum)
	printf("输入顶点个数,如30:\n");
	scanf("%d",&Nv);
	Graph = CreateGraph(Nv);
	
	//2.在创建好的图中插入边的权重。因为创建好的图边数量为0,所以需要在这里指定边属性:边数graph->Ne,边的起点E->start,E->end,E->weight
	//边的数据格式为 start end weight
	printf("输入边条数,如3:\n");
	scanf("%d",&Graph->Ne);
	//开辟边结构的空间
	E  = (Edge)malloc(sizeof(struct ENode));
	for (i = 0;i<Graph->Ne;i++)
	{
		//边属性存储。如果边不是整形,需要改变输入格式
		printf("输入边.输入格式:1 3 1(之间用空格分隔),这里可以从文件读入\n");
		scanf("%d%d%d",&E->start,&E->end,&E->weight);
		InsertEdge(Graph,E);
	}
	
	//3.输入顶点的属性
	for(V=0;V<Graph->Nv;V++)
	{
		printf("输入顶点信息。如:C\n");
		getchar();//gerchar()读取输入的回车换行符
		scanf("%c",&Graph->Data[V]);
	}

	//输出顶点信息
	for(i=0;i<Graph->Nv;i++)
	{
		printf("顶点信息如下%c\n",Graph->Data[i]);
	}
	

	printf("顶点个数%d\n",Graph->Nv);
	return Graph;
}

void main()
{
	//通过控制台输入图的信息,创建一个图g。
	MGraph g;
	g = BuildGraph();
	system("PAUSE");
}





你可能感兴趣的:(C语言)