80分提问,怎么就没有初始化呢?
再次把这个问题拿出来:
以邻接表为存储结构创建一个图,如下:
// DepthFirstSearch.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h "
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 10
typedef int ARC_INFO_TYPE; //弧相关信息类型
typedef char VERTEX_TYPE; //结点信息类型
typedef enum{UDG, DG}GRAPH_TYPE; //图的类型:无向,有向图
//弧结点(表结点)
typedef struct ArcNode{
int num; //结点编号
ARC_INFO_TYPE* info;//弧的其他相关信息,如权值等等
struct ArcNode* nextArcNode;//指向下一个表结点的指针
}ArcNode;
//顶点(头节点)
typedef struct VNode{
VERTEX_TYPE data;//顶点的数据
ArcNode* firstArcNode;//指向第一个弧结点的指针
}VNode, AdjList[MAX_VERTEX_NUM];//邻接表
//整个图的信息
typedef struct ALGraph{
int vertexNum;//结点个数
int arcNum;//边或者弧个数
GRAPH_TYPE kind;
}ALGraph;
//定义全局变量,便于操作
ALGraph Graph;
AdjList adjList;
//辅助数组,记录每个顶点是否被访问过
int visited[MAX_VERTEX_NUM];
//创建一个图(有向图比较简单,因为它是单向的,无向图在有向图的基础上添加一个弧结点)
int CreateALGraph(void){
int i;
int v1,v2;//暂时存放两个相关联点的编号
ArcNode* p=NULL;
printf( "输入结点个数,边数,图类型:\n ");
scanf( "%d,%d,%d ",&Graph.vertexNum,&Graph.arcNum,&Graph.kind);
printf( "输入顶点的数据:\n ");
for(i = 0; i < Graph.vertexNum; ++i){ //初始化各个顶点(头节点)
scanf( "%c ",&adjList[i].data);
adjList[i].firstArcNode = NULL;
}
printf( "输入相关联的边:\n ");
for(i = 0 ; i < Graph.arcNum; ++i){ //输入所有边(关联的点)编号
scanf( "%d,%d ",&v1,&v2);
p = (ArcNode*)malloc(sizeof(ArcNode));
p-> num = v2;
p-> nextArcNode = adjList[v1].firstArcNode;(提示:p-> nextArcNode = 0xcdcdcdcd {num=??? info=??? nextArcNode=??? }。是没有初始化的意思吧,但是不明白怎么初始化呢?我的程序错在什么地方呢?谢谢)
adjList[v1].firstArcNode = p;
if(!Graph.kind){ //若为无向图
p = (ArcNode*)malloc(sizeof(ArcNode));
p-> num = v1;
p-> nextArcNode = adjList[v2].firstArcNode;
adjList[v2].firstArcNode = p;
}
}
return 1;
}
[解决办法]
int CreateALGraph(void)
{
int i;
int v1,v2;//暂时存放两个相关联点的编号
ArcNode* p=NULL;
printf( "输入结点个数,边数,图类型:\n ");
scanf( "%d,%d,%d ",&Graph.vertexNum,&Graph.arcNum,&Graph.kind);
char c = '0 ';
scanf( "%c ", &c); // absorp the '\n ' character in the above input
printf( "输入顶点的数据:\n "); // input should in the form: abcde for five vertices
for(i = 0; i < Graph.vertexNum; ++i){ //初始化各个顶点(头节点)
scanf( "%c ",&adjList[i].data);
adjList[i].firstArcNode = NULL;
}
printf( "输入相关联的边:\n ");
for(i = 0 ; i < Graph.arcNum; ++i){ //输入所有边(关联的点)编号
scanf( "%d,%d ",&v1,&v2);
p = (ArcNode*)malloc(sizeof(ArcNode));
p-> num = v2;
p-> nextArcNode = adjList[v1].firstArcNode; //(提示:p-> nextArcNode = 0xcdcdcdcd {num=??? info=??? nextArcNode=??? }。是没有初始化的意思吧,但是不明白怎么初始化呢?我的程序错在什么地方呢?谢谢)
adjList[v1].firstArcNode = p;
if(!Graph.kind){ //若为无向图
p = (ArcNode*)malloc(sizeof(ArcNode));
p-> num = v1;
p-> nextArcNode = adjList[v2].firstArcNode;
adjList[v2].firstArcNode = p;
}
}
return 1;
}
[解决办法]
for(i = 0; i < Graph.vertexNum; ++i){
scanf( "%c ",&adjList[i].data);
adjList[i].firstArcNode = NULL;
fflush(stdin);//加这一句,清除缓冲区的残余流,回车符很特殊,实际是两个符号
}