任选一个存储结构存储一个无向图,要求最少8个顶点,12个活动,完成如下功能: 1.创建图。接收从键盘输入的边信息,存储到图中。 2.增加边的信息。 3.删除边的信息。 4.对图进行深度优先遍历。
时间: 2024-05-15 16:18:01 浏览: 40
好的,我明白了。对于你的问题,最少需要使用邻接表存储结构。邻接表是将每个顶点的相邻顶点存储在一个链表中,具体实现步骤如下:
1. 定义一个结构体表示图中的每个结点,包括结点编号和与该结点相邻的其他结点信息,比如:
```c
struct Node {
int vertex;
struct Node *next;
};
```
其中 vertex 表示结点编号,next 指针指向下一个相邻结点。
2. 定义一个数组,每个元素表示一个顶点,数组中的每个元素是一个链表结构体,存储与该顶点相邻的所有结点信息,比如:
```c
struct Node *adjList[MAXN];
```
其中 MAXN 表示最大顶点数,可以根据题目具体要求进行定义。
3. 创建图。从键盘输入边信息,根据输入的信息连接顶点之间的边,将边信息存储到邻接表中,比如:
```c
void createGraph() {
int u, v;
for (int i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
// 创建结点
struct Node *node1 = (struct Node *) malloc(sizeof(struct Node));
struct Node *node2 = (struct Node *) malloc(sizeof(struct Node));
node1->vertex = v;
node2->vertex = u;
node1->next = adjList[u];
node2->next = adjList[v];
adjList[u] = node1;
adjList[v] = node2;
}
}
```
其中 m 表示边数,u 和 v 分别表示边的两个端点,将 v 结点加入 u 结点的链表中,将 u 结点加入 v 结点的链表中。
4. 增加边的信息。在邻接表中添加一条新的边信息,比如:
```c
void addEdge(int u, int v) {
// 创建结点
struct Node *node1 = (struct Node *) malloc(sizeof(struct Node));
struct Node *node2 = (struct Node *) malloc(sizeof(struct Node));
node1->vertex = v;
node2->vertex = u;
node1->next = adjList[u];
node2->next = adjList[v];
adjList[u] = node1;
adjList[v] = node2;
}
```
5. 删除边的信息。从邻接表中删除一条边信息,比如:
```c
void removeEdge(int u, int v) {
struct Node *cur = adjList[u], *prev = NULL;
// 遍历 u 结点的链表,找到 v 结点,并删除
while (cur != NULL) {
if (cur->vertex == v) {
if (prev == NULL)
adjList[u] = cur->next;
else
prev->next = cur->next;
free(cur);
break;
}
prev = cur;
cur = cur->next;
}
cur = adjList[v];
prev = NULL;
// 遍历 v 结点的链表,找到 u 结点,并删除
while (cur != NULL) {
if (cur->vertex == u) {
if (prev == NULL)
adjList[v] = cur->next;
else
prev->next = cur->next;
free(cur);
break;
}
prev = cur;
cur = cur->next;
}
}
```
6. 对图进行深度优先遍历。使用栈来实现深度优先遍历,具体实现步骤如下:
```c
void DFS(int u, int visited[]) {
visited[u] = 1;
printf("%d ", u);
struct Node *cur = adjList[u];
while (cur != NULL) {
int v = cur->vertex;
if (!visited[v]) {
DFS(v, visited);
}
cur = cur->next;
}
}
void DFSTraversal(int start) {
int visited[MAXN] = {0};
struct Stack *s = createStack();
// 将起点入栈,并设置为已访问
push(s, start);
visited[start] = 1;
while (!isEmpty(s)) {
int u = pop(s);
printf("%d ", u);
struct Node *cur = adjList[u];
while (cur != NULL) {
int v = cur->vertex;
if (!visited[v]) {
visited[v] = 1;
push(s, v);
}
cur = cur->next;
}
}
}
```
其中 start 表示遍历的起点,visited 数组表示每个顶点是否被访问过。首先将 start 入栈,并设置为已访问,然后不断从栈中取出元素,遍历其相邻结点,并将未访问的结点入栈。直到栈为空为止。
阅读全文