使用c语言 作业1:问题描述:采用递归算法求解迷宫问题,并输出从入口到出口的所有迷宫路径。 作业2:用递归计算单链表中结点的个数。(分别使用带头结点和不带头结点进行计算) 作业3:用递归正向输出单链表中的每个节点元素值。(提示:不带头结点) 作业4:用递归反向输出单链表中的每个节点元素值。(提示:不带头结点)
时间: 2024-02-15 11:02:41 浏览: 77
回答:
作业1:递归解决迷宫问题的基本思路是,从起点开始,按照某个方向前进,如果能够到达终点,则输出路径并结束递归;否则,继续按照不同的方向前进,直到所有的方向都尝试过。具体实现可以使用回溯法和深度优先搜索算法。以下是一个简单的代码示例:
```c
#include <stdio.h>
#define N 5
int maze[N][N] = {
{0, 1, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 1, 0},
};
void print_path(int path[], int len) {
printf("Path: ");
for (int i = 0; i < len; i++) {
printf("(%d,%d) ", path[i] / N, path[i] % N);
}
printf("\n");
}
void maze_solver(int x, int y, int path[], int len) {
if (x < 0 || x >= N || y < 0 || y >= N) return; // 越界
if (maze[x][y] == 1) return; // 遇到障碍物
if (x == N-1 && y == N-1) { // 到达终点
path[len++] = x * N + y;
print_path(path, len);
return;
}
maze[x][y] = 1; // 标记已访问
path[len++] = x * N + y; // 添加到路径
maze_solver(x-1, y, path, len); // 向上走
maze_solver(x+1, y, path, len); // 向下走
maze_solver(x, y-1, path, len); // 向左走
maze_solver(x, y+1, path, len); // 向右走
maze[x][y] = 0; // 恢复标记
}
int main() {
int path[N*N], len = 0;
maze_solver(0, 0, path, len);
return 0;
}
```
作业2:计算单链表中结点的个数可以通过递归实现。具体思路是,先处理头结点,如果头结点为空,则返回0;否则,递归处理头结点的后继结点,并将结果累加。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
int count_node(Node* head) {
if (head == NULL) return 0;
return 1 + count_node(head->next);
}
int main() {
Node* head = (Node*) malloc(sizeof(Node));
head->data = -1;
head->next = NULL;
Node* p = head;
for (int i = 0; i < 5; i++) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = i;
node->next = NULL;
p->next = node;
p = node;
}
printf("Node count: %d\n", count_node(head->next));
return 0;
}
```
作业3:正向输出单链表中每个节点的元素值可以通过递归实现。具体思路是,先处理头结点,如果头结点为空,则返回;否则,递归处理头结点的后继结点,并输出当前结点的元素值。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
void print_list(Node* head) {
if (head == NULL) return;
printf("%d ", head->data);
print_list(head->next);
}
int main() {
Node* head = NULL;
Node* p = head;
for (int i = 0; i < 5; i++) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = i;
node->next = NULL;
if (p == NULL) {
head = node;
p = node;
} else {
p->next = node;
p = node;
}
}
print_list(head);
return 0;
}
```
作业4:反向输出单链表中每个节点的元素值可以通过递归实现。具体思路是,先处理头结点,如果头结点为空,则返回;否则,递归处理头结点的后继结点,并先输出当前结点的后继结点的元素值,再输出当前结点的元素值。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
void print_list_reverse(Node* head) {
if (head == NULL) return;
print_list_reverse(head->next);
printf("%d ", head->data);
}
int main() {
Node* head = NULL;
Node* p = head;
for (int i = 0; i < 5; i++) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = i;
node->next = NULL;
if (p == NULL) {
head = node;
p = node;
} else {
p->next = node;
p = node;
}
}
print_list_reverse(head);
return 0;
}
```
阅读全文