C数据结构学习历程(7) 图之十字链表 表示法

       我是参照《严蔚敏数据结构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;
}


调试如下:



猜你喜欢

转载自blog.csdn.net/snailyww/article/details/52230142