书本当然是严奶奶的那本《数据结构(C语言版)》
参考代码:《数据结构》算法实现及解析(高一凡)
本文主要还是对这两位大神的东西整理一下,其实哈哈,还是代码的搬运工(逃)
/*****************图的邻接表存储表示*********************
******************制作人:Guosam'*************************
*****************时间:2015/5/22************************/
#define MAX_VERTEX_NUM 20
typedef enum GraphKind{DG,DN,UDG,UDN}GraphKind; //{有向图,有向网,无向图,无向网}
typedef struct ArcNode
{
int adjvex; // 该弧所指向的顶点的位置
ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; // 网的权值指针
}ArcNode; //表结点
typedef struct VNode
{
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;
/*****************图的邻接表存储表示的基本操作*********************
******************制作人:Guosam*************************
*****************时间:2015/5/22************************/
//若G中存在顶点u,则返回该顶点在图中的位置
int LocateVex(ALGraph G,VertexType u)
{
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G,vertices[i].data)==0)
return i;
return -1;
}
//采用邻接表存储结构,构造没有相关信息图或网G(用一个函数构造4种图)
void CreateGraph(ALGraph &G)
{
int i,j,k,w; //w是权值
VertexType va,vb; //链接边或者弧的两个顶点
ElemType e;
printf("请输入图G的类型(有向图:0,有向网:1,无向图:2,无向图:3)");
scanf("%d",&G.kind);
printf("请输入图的顶点数,边数:");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("请输入%d个顶点的值(<%d个字符):\n",G.vexnum,MAX_NAME);
for(i=0;i<G.vexnum;++i) //构造顶点向量
{
scanf("%s",G.vertices[i].data);
G.vertices[i].firstarc==NULL; //初始化与该顶点有关的出弧链表
}
if(G.kind%2) //网
printf("请输入每条弧(边)的权值、弧尾和弧头(以空格为间隔):\n&#