数据结构:旅游路线图设计问题,1.编写一个函数让用户输入这张图,用邻接表存储。2.编写函数实现此图的深度优先搜索遍历。3.编程实现循环队列,编写初始化、创建、入队、出队等算法。4.利用循环队列对图1实现广度优先搜索遍历。且已有a—n的无向图(c语言编写)
时间: 2024-03-26 10:40:51 浏览: 92
不好意思,我之前回答的内容有误,我重新回答一遍。
1. 旅游路线图的邻接表存储可以用C语言中的结构体来实现。定义一个结构体表示每个顶点,包含一个顶点名称和一个指向邻接点链表的指针。邻接点链表中每个节点包含一个邻接点的名称和一个指向下一个邻接点的指针。可以这样实现:
```
typedef struct edge {
char name;
struct edge *next;
} Edge;
typedef struct vertex {
char name;
Edge *edge_list;
} Vertex;
```
然后编写一个函数,让用户输入这张图,用邻接表存储。可以先输入顶点数量,然后逐个输入每个顶点及其邻接点。
```
void create_graph(Vertex *graph, int n) {
for (int i = 0; i < n; i++) {
printf("Input vertex name: ");
scanf(" %c", &graph[i].name);
graph[i].edge_list = NULL;
printf("Input %c's edges (end with #): ", graph[i].name);
char name;
while (scanf(" %c", &name) == 1 && name != '#') {
Edge *edge = (Edge *)malloc(sizeof(Edge));
edge->name = name;
edge->next = graph[i].edge_list;
graph[i].edge_list = edge;
}
}
}
```
2. 深度优先搜索遍历可以用递归实现。从任意一个顶点开始,先访问该顶点,然后递归访问它的邻接点,直到所有可达的顶点都被访问过。可以这样实现:
```
void dfs(Vertex *graph, int v, int *visited) {
visited[v] = 1;
printf("%c ", graph[v].name);
Edge *edge = graph[v].edge_list;
while (edge != NULL) {
int w = edge->name - 'a';
if (!visited[w]) {
dfs(graph, w, visited);
}
edge = edge->next;
}
}
```
其中visited数组用来记录每个顶点是否被访问过。
3. 循环队列的初始化可以用一个数组和两个指针来实现。定义一个结构体表示队列,包含一个数组和两个指针,分别表示队头和队尾。入队操作将元素插入队尾,出队操作从队头取出元素。需要注意的是,队列满时需要循环利用数组空间,即从队头位置重新插入元素。
```
#define MAX_SIZE 100
typedef struct queue {
int data[MAX_SIZE];
int front, rear;
} Queue;
void init_queue(Queue *q) {
q->front = q->rear = 0;
}
int is_empty(Queue *q) {
return q->front == q->rear;
}
int is_full(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
void enqueue(Queue *q, int value) {
if (is_full(q)) {
printf("Queue is full.\n");
return;
}
q->data[q->rear] = value;
q->rear = (q->rear + 1) % MAX_SIZE;
}
int dequeue(Queue *q) {
if (is_empty(q)) {
printf("Queue is empty.\n");
return -1;
}
int value = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return value;
}
```
4. 利用循环队列对图实现广度优先搜索遍历。从任意一个顶点开始,先访问该顶点,然后将其邻接点入队,依次取出队头元素并访问其邻接点,直到队列为空。可以这样实现:
```
void bfs(Vertex *graph, int v, int *visited) {
Queue q;
init_queue(&q);
visited[v] = 1;
printf("%c ", graph[v].name);
enqueue(&q, v);
while (!is_empty(&q)) {
int v = dequeue(&q);
Edge *edge = graph[v].edge_list;
while (edge != NULL) {
int w = edge->name - 'a';
if (!visited[w]) {
visited[w] = 1;
printf("%c ", graph[w].name);
enqueue(&q, w);
}
edge = edge->next;
}
}
}
```
其中visited数组用来记录每个顶点是否被访问过。
阅读全文