实现邻接矩阵和邻接表存储结构下的createUDG()和createDG()算法。
时间: 2024-03-23 18:37:40 浏览: 42
邻接矩阵和邻接表是两种图的常用存储结构。下面是createUDG()和createDG()算法的实现:
邻接矩阵存储结构:
```
// 无向图的邻接矩阵存储结构
#define MAXV 100 // 最大顶点数
typedef struct {
int vertex[MAXV]; // 存储顶点信息
int edge[MAXV][MAXV]; // 存储边信息
int numVertex, numEdge; // 存储顶点数和边数
} MGraph;
// 创建无向图的邻接矩阵存储结构
void createUDG(MGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d %d", &G->numVertex, &G->numEdge);
// 初始化邻接矩阵,全部边权值为0
for (i = 0; i < G->numVertex; i++) {
for (j = 0; j < G->numVertex; j++) {
G->edge[i][j] = 0;
}
}
// 读入顶点信息
printf("请输入顶点信息:");
for (i = 0; i < G->numVertex; i++) {
scanf("%d", &G->vertex[i]);
}
// 读入边信息
printf("请输入边信息:");
for (k = 0; k < G->numEdge; k++) {
scanf("%d %d", &i, &j);
G->edge[i][j] = 1;
G->edge[j][i] = 1; // 无向图的邻接矩阵是对称的
}
}
```
```
// 有向图的邻接矩阵存储结构
#define MAXV 100 // 最大顶点数
typedef struct {
int vertex[MAXV]; // 存储顶点信息
int edge[MAXV][MAXV]; // 存储边信息
int numVertex, numEdge; // 存储顶点数和边数
} MGraph;
// 创建有向图的邻接矩阵存储结构
void createDG(MGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d %d", &G->numVertex, &G->numEdge);
// 初始化邻接矩阵,全部边权值为0
for (i = 0; i < G->numVertex; i++) {
for (j = 0; j < G->numVertex; j++) {
G->edge[i][j] = 0;
}
}
// 读入顶点信息
printf("请输入顶点信息:");
for (i = 0; i < G->numVertex; i++) {
scanf("%d", &G->vertex[i]);
}
// 读入边信息
printf("请输入边信息:");
for (k = 0; k < G->numEdge; k++) {
scanf("%d %d", &i, &j);
G->edge[i][j] = 1;
}
}
```
邻接表存储结构:
```
// 无向图的邻接表存储结构
#define MAXV 100 // 最大顶点数
typedef struct ArcNode {
int adjvex; // 邻接顶点编号
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct {
int vertex; // 存储顶点信息
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode;
typedef struct {
VNode adjList[MAXV]; // 存储顶点和边信息
int numVertex, numEdge; // 存储顶点数和边数
} ALGraph;
// 创建无向图的邻接表存储结构
void createUDG(ALGraph *G) {
int i, j, k;
ArcNode *p;
printf("请输入顶点数和边数:");
scanf("%d %d", &G->numVertex, &G->numEdge);
// 初始化邻接表为空表
for (i = 0; i < G->numVertex; i++) {
G->adjList[i].firstarc = NULL;
}
// 读入顶点信息
printf("请输入顶点信息:");
for (i = 0; i < G->numVertex; i++) {
scanf("%d", &G->adjList[i].vertex);
}
// 读入边信息,建立邻接表
printf("请输入边信息:");
for (k = 0; k < G->numEdge; k++) {
scanf("%d %d", &i, &j);
// 头插法插入边信息
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->next = G->adjList[i].firstarc;
G->adjList[i].firstarc = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i;
p->next = G->adjList[j].firstarc;
G->adjList[j].firstarc = p; // 无向图的邻接表是对称的
}
}
```
```
// 有向图的邻接表存储结构
#define MAXV 100 // 最大顶点数
typedef struct ArcNode {
int adjvex; // 邻接顶点编号
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct {
int vertex; // 存储顶点信息
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode;
typedef struct {
VNode adjList[MAXV]; // 存储顶点和边信息
int numVertex, numEdge; // 存储顶点数和边数
} ALGraph;
// 创建有向图的邻接表存储结构
void createDG(ALGraph *G) {
int i, j, k;
ArcNode *p;
printf("请输入顶点数和边数:");
scanf("%d %d", &G->numVertex, &G->numEdge);
// 初始化邻接表为空表
for (i = 0; i < G->numVertex; i++) {
G->adjList[i].firstarc = NULL;
}
// 读入顶点信息
printf("请输入顶点信息:");
for (i = 0; i < G->numVertex; i++) {
scanf("%d", &G->adjList[i].vertex);
}
// 读入边信息,建立邻接表
printf("请输入边信息:");
for (k = 0; k < G->numEdge; k++) {
scanf("%d %d", &i, &j);
// 头插法插入边信息
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->next = G->adjList[i].firstarc;
G->adjList[i].firstarc = p;
}
}
```
阅读全文