C语言实现键盘输入图的顶点和边信息,建立一个图,实现图的深度优先搜索。
时间: 2023-12-05 17:11:48 浏览: 204
好的,我可以帮你回答这个问题。
首先,我们需要了解图的表示方法。常见的有邻接矩阵和邻接表两种方法。在这里,我以邻接表的方法来实现。
假设你已经有了图的顶点和边信息,可以用以下结构体来表示每个顶点和边:
```c
typedef struct EdgeNode {
int adjvex; // 邻接点的下标
struct EdgeNode *next; // 指向下一个邻接点的指针
} EdgeNode;
typedef struct VertexNode {
char data; // 顶点的数据
EdgeNode *firstedge; // 指向第一个邻接点的指针
} VertexNode;
```
接下来,我们可以定义一个图的结构体:
```c
typedef struct {
VertexNode vertex[MAXVEX]; // 存放顶点信息的数组
int numVertexes; // 顶点数
int numEdges; // 边数
} GraphAdjList;
```
其中,`MAXVEX`是一个常量,表示图中最多有多少个顶点。
接下来,我们可以写出建立图的函数:
```c
void CreateALGraph(GraphAdjList *G) {
int i, j, k;
EdgeNode *e;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &G->numVertexes, &G->numEdges);
printf("请输入顶点信息:\n");
for (i = 0; i < G->numVertexes; i++) {
scanf(" %c", &G->vertex[i].data);
G->vertex[i].firstedge = NULL;
}
printf("请输入边的信息(vi, vj):\n");
for (k = 0; k < G->numEdges; k++) {
scanf("%d %d", &i, &j);
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->vertex[i].firstedge;
G->vertex[i].firstedge = e;
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->vertex[j].firstedge;
G->vertex[j].firstedge = e;
}
}
```
这个函数会从控制台读入顶点数和边数,然后读入每个顶点的信息和每条边的信息。最后,它会根据这些信息建立一个邻接表表示的图。
最后,我们可以写出深度优先搜索的函数:
```c
void DFS(GraphAdjList G, int i, int *visited) {
EdgeNode *p;
printf("%c ", G.vertex[i].data);
visited[i] = 1;
p = G.vertex[i].firstedge;
while (p) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->next;
}
}
void DFSTraverse(GraphAdjList G) {
int i;
int visited[MAXVEX];
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0;
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
}
```
这个函数会遍历整个图,并输出每个顶点的信息。它会先将所有顶点的访问状态初始化为未访问,然后从一个未访问的顶点开始进行深度优先搜索。
这就是用 C 语言实现图的深度优先搜索的方法。
阅读全文