写了一个存储图结构的代码,但是总是报错。经过和同学的讨论,原因竟然是scanf()可以吃掉一个字符,通过在此句话前面添加getchar()函数。谢谢这个同学的指导,心里面暖暖的。
/*
time:2020.7.4
reference:
1.C:\Users\wzq\Desktop\数据结构\数据结构 陈越 第2版.pdf
2.https://blog.youkuaiyun.com/qq_42304888/article/details/94992661 关于scanf()吃回车的解决办法
学习使用二维矩阵存储图中的矩阵
*/
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
//定义一个图中最大的顶点数目,可以使用数据集中图顶点最大的个数作为顶点个数,比如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)
{
//如果是有向图,则插入边<v1,v2>的权重
//在已经创建好的图graph中插入边权重e->weight
graph->G[e->start-1][e->end-1]=e->weight;
//如果无向图,插入边<v2,v1>的权重
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");
}