图2——利用邻接表创建有向图
图
假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表。
主要考查对邻接表的理解。图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是创建表头结点,二是创建边表结点构成的边表。
创建表头结点就是根据输入的结点信息,将结点信息直接存入对应的数据域中,并且将该结点的指针域置为NULL。
for(int i=0;i<G->vexnum;i++)
{
cin>>G->vertex[i].data;
G->vertex[i].firstarc=NULL;
}
创建边表就是根据输入的弧信息,创建新结点,将该结点插入到对应的链表中。
for(int k=0;k<G->arcnum;k++)
{
cin>>v1>>v2;
i=LocateVertex(*G,v1);
j=LocateVertex(*G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->vertex[i].firstarc;
G->vertex[i].firstarc=p;
}
/*
6 9
a b c d e f
a b
a c
a f
f c
b c
b f
c d
d a
e d
*/
code:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define MAXSIZE 100
typedef enum {DG,DN,UG,UN}GraphKind;
typedef struct ArcNode
{
int adjvex;
InfoPtr *info;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAXSIZE];
typedef struct
{
AdjList vertex;
int vexnum, arcnum;
GraphKind kind;
}AdjGraph;
int LocateVertex(AdjGraph G, VertexType v);
void CreateGraph(AdjGraph *G);
void DisplayGraph(AdjGraph G);
void DestoryGraph(AdjGraph *G);
int LocateVertex(AdjGraph G, VertexType v)
{
int i;
for (i = 0; i < G.vexnum; ++i)
{
if (strcmp(G.vertex[i].data, v) == 0)
{
return i;
}
}
return -1;
}
void CreateGraph(AdjGraph *G)
{
int i, j, k;
VertexType v1, v2;
ArcNode *p;
cout << "请输入图的顶点数和边数 ";
cin >> (*G).vexnum >> (*G).arcnum;
cout << "请输入" <<G->vexnum<< "个顶点的值:" << endl;
for (i = 0; i < G->vexnum;i++)
{
cin >> G->vertex[i].data;
G->vertex[i].firstarc = NULL;
}
cout << "请输入弧尾 弧头" << endl;
for (k = 0; k < G->arcnum;k++)
{
cin >> v1 >> v2;
i = LocateVertex(*G, v1);
j = LocateVertex(*G, v2);
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->info = NULL;
p->nextarc = G->vertex[i].firstarc;
G->vertex[i].firstarc = p;
}
(*G).kind = DG;
}
void DestoryGraph(AdjGraph *G)
{
int i;
ArcNode *p, *q;
for (i = 0; i < (*G).vexnum;i++)
{
p = G->vertex[i].firstarc;
if (p!=NULL)
{
q = p->nextarc;
free(p);
p = q;
}
}
(*G).vexnum = 0;
(*G).arcnum = 0;
}
void DisplayGraph(AdjGraph G)
{
int i;
ArcNode *p;
cout << G.vexnum << "个顶点:" << endl;
for (i = 0; i < G.vexnum;i++)
{
cout << G.vertex[i].data << " ";
}
cout << endl << G.arcnum << "条边:"<<endl;
for (i = 0; i < G.vexnum;i++)
{
p = G.vertex[i].firstarc;
while (p)
{
cout << G.vertex[i].data << "→" << G.vertex[p->adjvex].data << " ";
p = p->nextarc;
}
cout << endl;
}
}
void main()
{
AdjGraph G;
cout << "采用邻接矩阵创建有向图G:" << endl;
CreateGraph(&G);
cout << "输入有向图G的邻接表:" << endl;
DisplayGraph(G);
DestoryGraph(&G);
system("pause");
}
结果: