1)编写一个能够创建4种不同类型图的邻接表存储的通用函数,函数格式如下: CreateALGraph(GraphKind GKind, ALGraph &G, int vexnum, int arcnum, char *vexs, int *arcs)
时间: 2024-03-17 08:46:01 浏览: 84
好的,我可以帮你解答这个问题。根据你的要求,我可以为你编写一个能够创建4种不同类型图的邻接表存储的通用函数,函数格式如下:
```C++
typedef enum {DG, DN, UDG, UDN} GraphKind; //图的种类,分别为有向图、有向网、无向图、无向网
typedef struct ArcNode { //边结点定义
int adjvex; //邻接点在顶点数组中的下标
struct ArcNode *nextarc; //指向下一条边的指针
int weight; //边的权重
} ArcNode;
typedef struct VNode { //顶点结点定义
char data; //顶点存储的数据
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct { //邻接表图的定义
AdjList vertices; //邻接表
int vexnum, arcnum; //顶点数和边数
GraphKind kind; //图的种类
} ALGraph;
void CreateALGraph(GraphKind GKind, ALGraph &G, int vexnum, int arcnum, char *vexs, int *arcs) {
G.kind = GKind; //设置图的种类
G.vexnum = vexnum; //设置顶点数
G.arcnum = arcnum; //设置边数
for (int i = 0; i < G.vexnum; i++) { //初始化邻接表
G.vertices[i].data = vexs[i]; //设置顶点的数据
G.vertices[i].firstarc = NULL; //初始化指向第一条边的指针为空
}
int k = 0;
for (int i = 0; i < G.arcnum; i++) { //依次读取每条边的信息并添加到邻接表中
int v1, v2, w;
v1 = arcs[k++]; //读取边的起点下标
v2 = arcs[k++]; //读取边的终点下标
w = arcs[k++]; //读取边的权重
ArcNode *p = new ArcNode; //创建新的边结点
p->adjvex = v2; //设置邻接点在顶点数组中的下标
p->weight = w; //设置边的权重
p->nextarc = G.vertices[v1].firstarc; //将新边结点插入到起点的边链表的头部
G.vertices[v1].firstarc = p;
if (G.kind == UDG || G.kind == UDN) { //如果是无向图或无向网,则还需要在终点处添加一条反向边
p = new ArcNode; //创建新的边结点
p->adjvex = v1; //设置邻接点在顶点数组中的下标
p->weight = w; //设置边的权重
p->nextarc = G.vertices[v2].firstarc; //将新边结点插入到终点的边链表的头部
G.vertices[v2].firstarc = p;
}
}
}
```
该函数的实现思路如下:
1. 首先根据参数中给定的图的种类、顶点数和边数,初始化邻接表图的基本信息。
2. 然后依次读取每条边的信息,将其添加到邻接表中。
3. 对于每条边,我们需要创建新的边结点,并将其插入到起点的边链表的头部。如果是无向图或无向网,则还需要在终点处添加一条反向边。
4. 最后返回创建好的邻接表图。
希望这个函数能够帮助到你,如果你还有其他问题,可以继续问我。
阅读全文