任选一个存储结构存储一个无向图,要求最少8个顶点,12个活动,完成如下功能: 1.创建图。接收从键盘输入的边信息,存储到图中。 2.增加边的信息。 3.删除边的信息。 4.对图进行深度优先遍历。
时间: 2024-05-16 19:12:37 浏览: 72
我建议使用邻接表来存储这个无向图。
具体实现可以按照以下步骤:
1. 定义图的结构体,包含顶点数和边数,以及邻接表的头指针数组。
```C++
#define MAX_VERTEX_NUM 20
// 边结构体
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode* next; // 指向下一条边的指针
}ArcNode;
// 顶点结构体
typedef struct VertexNode {
char data; // 顶点数据
ArcNode* first; // 指向第一条依附该顶点的边的指针
}VertexNode;
// 图结构体
typedef struct Graph {
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
int arcnum; // 边数
}Graph;
```
2. 实现创建图的功能,接收从键盘输入的边信息,存储到图中。
```C++
void CreateGraph(Graph& G) {
printf("请输入顶点数和边数:");
scanf_s("%d%d", &G.vexnum, &G.arcnum);
getchar(); // 将输入缓冲区中的回车读取掉
printf("请输入%d个顶点的数据:\n", G.vexnum);
for (int i = 0; i < G.vexnum; i++) {
printf("第%d个顶点的数据:", i + 1);
scanf_s("%c", &G.vexs[i].data);
G.vexs[i].first = NULL; // 将该顶点的第一条边的指针初始化为空
getchar(); // 将输入缓冲区中的回车读取掉
}
printf("请输入%d条边的信息(每条边包含两个顶点的位置):\n", G.arcnum);
for (int i = 0; i < G.arcnum; i++) {
int v1, v2;
printf("第%d条边的信息:", i + 1);
scanf_s("%d%d", &v1, &v2);
// 在v1的邻接表中插入一条指向v2的边
ArcNode* arc1 = (ArcNode*)malloc(sizeof(ArcNode));
arc1->adjvex = v2;
arc1->next = G.vexs[v1].first;
G.vexs[v1].first = arc1;
// 在v2的邻接表中插入一条指向v1的边
ArcNode* arc2 = (ArcNode*)malloc(sizeof(ArcNode));
arc2->adjvex = v1;
arc2->next = G.vexs[v2].first;
G.vexs[v2].first = arc2;
}
}
```
3. 实现增加边的信息。
```C++
void AddArc(Graph& G) {
int v1, v2;
printf("请输入要添加的边的信息(两个顶点的位置):");
scanf_s("%d%d", &v1, &v2);
// 在v1的邻接表中插入一条指向v2的边
ArcNode* arc1 = (ArcNode*)malloc(sizeof(ArcNode));
arc1->adjvex = v2;
arc1->next = G.vexs[v1].first;
G.vexs[v1].first = arc1;
// 在v2的邻接表中插入一条指向v1的边
ArcNode* arc2 = (ArcNode*)malloc(sizeof(ArcNode));
arc2->adjvex = v1;
arc2->next = G.vexs[v2].first;
G.vexs[v2].first = arc2;
G.arcnum++;
}
```
4. 实现删除边的信息。
```C++
void DeleteArc(Graph& G) {
int v1, v2;
printf("请输入要删除的边的信息(两个顶点的位置):");
scanf_s("%d%d", &v1, &v2);
// 删除v1邻接表中指向v2的边
ArcNode* pre = NULL;
ArcNode* p = G.vexs[v1].first;
while (p != NULL && p->adjvex != v2) {
pre = p;
p = p->next;
}
if (p != NULL) {
if (pre == NULL) {
G.vexs[v1].first = p->next;
}
else {
pre->next = p->next;
}
free(p);
}
// 删除v2邻接表中指向v1的边
pre = NULL;
p = G.vexs[v2].first;
while (p != NULL && p->adjvex != v1) {
pre = p;
p = p->next;
}
if (p != NULL) {
if (pre == NULL) {
G.vexs[v2].first = p->next;
}
else {
pre->next = p->next;
}
free(p);
}
G.arcnum--;
}
```
5. 实现深度优先遍历。
```C++
void DFS(Graph& G, int v, bool* visited) {
visited[v] = true;
printf("%c ", G.vexs[v].data);
ArcNode* p = G.vexs[v].first;
while (p != NULL) {
int adjvex = p->adjvex;
if (!visited[adjvex]) {
DFS(G, adjvex, visited);
}
p = p->next;
}
}
void DFSTraverse(Graph& G) {
bool visited[MAX_VERTEX_NUM] = { false }; // 初始化所有顶点为未访问
printf("DFS遍历结果:");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
}
```
完整代码如下:
阅读全文