数据结构C语言版 图的邻接表存储表示和实现
数据结构C语言版 图的邻接表存储表示和实现.txt师太,你是我心中的魔,贫僧离你越近,就离佛越远……初中的体育老师说:谁敢再穿裙子上我的课,就罚她倒立。/*
数据结构C语言版 图的邻接表存储表示和实现
P163
编译环境:Dev-C++ 4.9.9.2
日期:2011年2月15日
*/
#include
// 图的邻接表存储表示
#define MAX_NAME 3// 顶点字符串的最大长度+1
#define MAX_VERTEX_NUM 20
typedef int InfoType;// 存放网的权值
typedef char VertexType[MAX_NAME];// 字符串类型
typedef enum{DG,DN,AG,AN}GraphKind; // {有向图,有向网,无向图,无向网}
typedef struct ArcNode
{
int adjvex;// 该弧所指向的顶点的位置
struct 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;
typedef int QElemType; // 队列类型
// 单链队列--队列的链式存储结构
typedef struct QNode
{
QElemType data;//数据域
struct QNode *next;//指针域
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,//队头指针,指针域指向队头元素
rear;//队尾指针,指向队尾元素
}LinkQueue;
// 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
int LocateVex(ALGraph G,VertexType u)
{
int i;
for(i=0;i
if(strcmp(u,G.vertices[i].data)==0)
return i;
return -1;
}
// 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4种图)。
int CreateGraph(ALGraph *G)
{
int i,j,k;
int w;// 权值
VertexType va,vb;
ArcNode *p;
printf("请输入图的类型(有向图:0,有向网:1,无向图:2,无向网:3): ");
scanf("%d",&(*G).kind);
printf("请输入图的顶点数和边数:(空格)\n");
scanf("%d%d", &(*G).vexnum, &(*G).arcnum);
printf("请输入%d个顶点的值(
for(i = 0; i < (*G).vexnum; ++i)// 构造顶点向量
{
scanf("%s", (*G).vertices[i].data);
(*G).vertices[i].firstarc = NULL;
}
if((*G).kind == 1 || (*G).kind == 3) // 网
printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n");
else // 图
printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):\n");
for(k = 0;k < (*G).arcnum; ++k)// 构造表结点链表
{
if((*G).kind==1||(*G).kind==3) // 网
scanf("%d%s%s",&w,va,vb);
else// 图
scanf("%s%s",va,vb);
i = LocateVex(*G,va); // 弧尾
j = LocateVex(*G,vb); // 弧头
p = (ArcNode*)malloc(