我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《大话数据结构》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。
#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
#define INFINITY 65535 //用这个值代表无穷,define的用法还可以带参数
typedef char VertexType; //顶点类型
typedef int InfoType ; //typedef为类型定义
typedef struct ArcBox{
int tailvex,headvex; //表示一条弧的尾和头 的下标
struct ArcBox * hlink,*tlink;
InfoType *info;
}ArcBox;
typedef struct VexNode{
VertexType data;
ArcBox *firstin,*firstout;
}VexNode;
typedef struct{
VexNode xlist[MAX_VERTEX_NUM];
int vexnum,arcnum; //顶点数和弧数
}OLGraph;
int LocateVex(OLGraph G,VertexType vp)
{
for(int k=0;k<G.vexnum ;k++)
{
if(G.xlist [k].data ==vp)
{
return k;
}
}
return (-1);
}
void CreateDG(OLGraph &G)
{
//构造有向图
VertexType v1,v2;
int i1,i2;
cin>>G.vexnum>>G.arcnum ;
for(int i=0;i<G.vexnum;i++) //构造表头向量
{
cin>>G.xlist [i].data ; //输入顶点值
G.xlist [i].firstin =NULL;G.xlist [i].firstout =NULL; //初始化指针
}
for(int k=0;k<G.arcnum ;k++)
{
cin>>v1>>v2; //这是输入弧 的两个开始点(对应为弧的尾巴)和结尾点
i1=LocateVex(G,v1);
i2=LocateVex(G,v2);
ArcBox *p=(ArcBox*)malloc(sizeof(ArcBox));
/* ArcBox *p;
ArcBox p1={i1,i2,G.xlist[i2].firstin,G.xlist[i1].firstout,NULL}; //这样子就不用开指针了
p=&p1;*/ //书上好像有错做不到 *p={};
p->tailvex =i1;p->headvex =i2;
p->hlink =G.xlist[i2].firstin;
p->tlink =G.xlist[i1].firstout;
p->info=NULL;
G.xlist[i2].firstin=G.xlist[i1].firstout=p;
}
}
int main()
{
OLGraph G;
CreateDG(G);
G.xlist [0].firstin ;
return 0;
}