标签:
大话数据结构第一版第二次印刷中P231-P232中的无向图的邻接表创建,有一点小问题。修改了http://blog.csdn.net/jnu_simba/article/details/8866844的代码,Qt Creater测试可以运行。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXVEX 5 /* 最大顶点数,应由用户定义 */
typedef char VertexType[3]; /* 顶点类型应由用户定义,这里是V0~V3,所以应设置一个char类型的数组 */
typedef struct EdgeNode/* 边表结点 */
{
int adjvex;/* 邻接点域,存储该顶点对应的下标 */
struct EdgeNode *next; /* 链域,指向下一个邻接点 */
} EdgeNode;
typedef struct VextexNode/* 顶点表结点 */
{
VertexType data;/* 顶点域,存储顶点信息 */
EdgeNode *firstedge;/* 边表头指针 */
} VextexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
/*AdjList是VertexNode类的数组别名。
AdjList adjList;实例化一个数组,数组每个元素是VertexNode结构体。
AdjList adjList;等价于VertexNode adjList[MAXVEX];*/
int numNodes, numEdges; /* 图中当前顶点数和边数 */
} GraphAdjList;
void CreateALGraph(GraphAdjList *Gp)
{
int i, j, k;
EdgeNode *pe;
cout << "input numNodes and numEdges:" <<endl;
cin >> Gp->numNodes >> Gp->numEdges;
for (i = 0 ; i < Gp->numNodes; i++)
{
cout << "input VertexType data:" <<endl;
cin >> Gp->adjList[i].data;
Gp->adjList[i].firstedge = NULL;/* 将边表置为空表 */
}
for (k = 0; k < Gp->numEdges; k++)/* 建立边表 */
{
cout << "input vi and vj:" <<endl;
cin >> i >> j;
pe = (EdgeNode *)malloc(sizeof(EdgeNode));
pe->adjvex = j;/* 邻接序号为j */
pe->next = Gp->adjList[i].firstedge;/* 将pe的指针指向当前顶点上指向的结点 */
Gp->adjList[i].firstedge = pe;/* 将当前顶点的指针指向pe */
pe = (EdgeNode *)malloc(sizeof(EdgeNode));
pe->adjvex = i;
pe->next = Gp->adjList[j].firstedge;
Gp->adjList[j].firstedge = pe;/*同上,对无序图其实可以不需要*/
}
}
int main(void)
{
GraphAdjList GL;
CreateALGraph(&GL);
return 0;
}
//input numNodes and numEdges:
//4 5
//input VertexType data:(分4次输入)
//V0 V1 V2 V3
//input vi and vj:(分5次输入)
//0 1
//0 2
//0 3
//1 2
//2 3
书中无向图如下:
问题如下:
1、如果data信息是V0,V1,V2,V3,需要typedef char VertexType[3];
2、根据图7-4-6,V0的firstedge指向V1,V1的firstedge指向V0,V2的firstedge指向V0,V3的firstedge指向V1。但是这个代码,最终创建结果是,V0的firstedge指向V3,V1的firstedge指向V2,V2的firstedge指向V3,V3的firstedge指向V2。正好与图颠倒了,虽然代码同样能创建出一个无向图。
注意:
对于邻接表结构,一定要注意的是边表节点,并不是真正的节点,是为了寻找设计的结构。通过顶点节点的firstedge找到与它相连的第一个顶点节点,再通过它找到与该顶点相连的第二个节点,于此类推。类似于二叉树中的孩子节点表示法。
标签:
原文地址:http://www.cnblogs.com/hslzju/p/5396883.html