#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
typedef int InfoType; /* 该弧相关信息的指针类型 */
typedef char VertexType; /* 顶点的类型 */
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;
int CreateUDG(ALGraph &G) /* 邻接表建立无向图 */
{
int i,s,d;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的顶点位置 */
q->adjvex = s; /* 保存该弧所指向的顶点位置 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateUDN(ALGraph &G) /* 邻接表建立无向网 */
{
int i,s,d,w;
ArcNode *p, *q;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
q = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->info = (InfoType *)malloc(sizeof(InfoType));
q->info = (InfoType *)malloc(sizeof(InfoType));
p->adjvex = d; /* 保存该弧所指向的顶点位置 */
q->adjvex = s; /* 保存该弧所指向的顶点位置 */
*(p->info) = w; /* 保存权值到一个结点里 */
*(q->info) = w; /* 保存权值到一个结点里 */
p->nextarc = G.vertices[s].firstarc;
G.vertices[s].firstarc = p;
q->nextarc = G.vertices[d].firstarc;
G.vertices[d].firstarc = q;
}
return OK;
}
int CreateDG(ALGraph &G) /* 邻接表建立有向图 */
{
int i,s,d;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d",&s,&d); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的终点位置 */
/* 这两句代码相当于单链表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 保存顶点所对应的终点位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int CreateDN(ALGraph &G) /* 邻接表建立有向网 */
{
int i,s,d,w;
ArcNode *p;
scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */
getchar();
for(i=1; i<=G.vexnum; i++) /* 输入顶点 */
{
scanf("%c",&G.vertices[i].data); /* 输入顶点 */
getchar();
G.vertices[i].firstarc = NULL; /* 首先初始化为NULL */
}
for(i=1; i<=G.arcnum; i++)
{
scanf("%d%d%d",&s,&d,&w); /* 输入一条边依附的起点序号和终点序号 */
getchar();
p = (struct ArcNode *)malloc(sizeof(struct ArcNode));
p->adjvex = d; /* 保存该弧所指向的终点位置 */
p->info = (InfoType*)malloc(sizeof(InfoType));
*(p->info) = w;
/* 这两句代码相当于单链表的插入操作 */
p->nextarc = G.vertices[s].firstarc; /* 保存顶点所对应的终点位置 */
G.vertices[s].firstarc = p;
}
return OK;
}
int PrintALGraphUDG(ALGraph *G) /* 打印无向图每个结点的单链表 */
{
int i;
printf("打印无向图/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
while(G->vertices[i].firstarc->nextarc != NULL)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%d/n",G->vertices[i].firstarc->adjvex);
}
return OK;
}
int PrintALGraphUDN(ALGraph *G) /* 打印无向网每个结点的单链表 */
{
int i, j;
printf("打印无向网/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc->nextarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex;
printf("%c",G->vertices[j].data);
printf("/tweight: %d/n",*(G->vertices[i].firstarc->info));
printf("------------------------------------------/n");
}
return OK;
}
int PrintALGraphDG(ALGraph *G) /* 打印有向图每个结点的单链表 */
{
int i;
printf("打印有向图/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
printf("%c: ",G->vertices[i].data);
if(G->vertices[i].firstarc == NULL)
{
printf("/n");
continue;
}
while(G->vertices[i].firstarc)
{
printf("%d ",G->vertices[i].firstarc->adjvex);
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
printf("/n");
}
return OK;
}
int PrintALGraphDN(ALGraph *G) /* 打印有向网每个结点的单链表 */
{
int i, j;
printf("打印有向网/n");
for(i = 1 ; i <= G->vexnum ; i++)
{
while(G->vertices[i].firstarc)
{
printf("%c --> ",G->vertices[i].data);
j = G->vertices[i].firstarc->adjvex; /* 取得终点的位置 */
printf("%c",G->vertices[j].data);
printf("/tweight = %d/n",*(G->vertices[i].firstarc->info));
G->vertices[i].firstarc = G->vertices[i].firstarc->nextarc;
}
}
return OK;
}
void main()
{
ALGraph G;
//CreateUDG(G); /* 建立无向图 */
//PrintALGraphUDG(&G); /* 打印无向图 */
//CreateDG(G); /* 建立有向图 */
//PrintALGraphDG(&G); /* 打印有向图 */
//CreateUDN(G); /* 建立无向网 */
//PrintALGraphUDN(&G); /* 打印无向网 */
CreateDN(G); /* 建立有向网 */
PrintALGraphDN(&G); /* 打印有向网 */
}
图 的测试数据为:5 4 a b c d e 1 2 1 3 1 5 4 5
网 的测试数据为:5 4 a b c d e 1 2 10 1 3 15 1 5 20 4 5 30
提示:粘贴进控制台按回车运行!