用C语言解决:现有A、B两个班级的学生,学生的信息包括学号、姓名、成绩,将这两个班级的学生按照学号顺序分别保存在两个单链表中(学号从1开始编号)。 期末时经过转专业考试后,A班从i号开始有len个学生转专业考试通过,转到B班级,转到B班级后,将这len个学生安排在B班的j号学生之前。 请编写程序,先输入A、B班级的学生信息,再输入i,len和j的值,最后输出转专业后,A、B班的学生信息(按照顺序输出)。 2、任务一: 请书写本题的算法设计思路,并分步骤描述出来;并附上程序代码
时间: 2024-03-17 15:40:14 浏览: 138
算法设计思路:
1. 定义一个学生结构体,包含学号、姓名、成绩等信息;
2. 定义一个单链表结构体,包含头指针、尾指针、链表长度等信息;
3. 定义一个函数用于创建单链表,从键盘输入学生信息,按照学号顺序插入链表中;
4. 定义一个函数用于将A班级中从i号开始的len个学生转到B班级的j号学生之前;
5. 定义一个主函数,分别创建A、B两个班级的单链表,调用函数将A班级中的学生转到B班级中,最后输出A、B班级的学生信息。
程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义学生结构体
typedef struct student {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
} Student;
// 定义单链表结构体
typedef struct node {
Student data; // 数据域
struct node *next; // 指针域
} Node, *LinkedList;
// 创建新节点
Node *create_node(Student stu) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = stu;
new_node->next = NULL;
return new_node;
}
// 创建单链表
LinkedList create_list() {
LinkedList head = NULL, tail = NULL;
int n;
printf("请输入学生人数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
Student stu;
printf("请输入第%d个学生的学号、姓名、成绩:", i + 1);
scanf("%d %s %f", &stu.id, stu.name, &stu.score);
Node *new_node = create_node(stu);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}
return head;
}
// 将A班级中从i号开始的len个学生转到B班级的j号学生之前
void transfer(LinkedList A, LinkedList B, int i, int len, int j) {
if (A == NULL || B == NULL || len <= 0 || i < 1 || j < 1) {
return;
}
Node *p = A, *q = B; // p指向A班级的第i个学生,q指向B班级的第j个学生
int count = 1;
while (p != NULL && count < i) {
p = p->next;
count++;
}
if (p == NULL) {
return;
}
Node *pre = NULL; // pre指向A班级中第i-1个学生
while (p != NULL && count <= i + len - 1) {
pre = p;
p = p->next;
count++;
}
if (p == NULL) {
return;
}
while (q != NULL && q->data.id != j) {
q = q->next;
}
if (q == NULL) {
return;
}
Node *r = q->next; // r指向B班级中第j+1个学生
q->next = p; // 将A班级中的学生插入到B班级中
pre->next = r;
}
// 输出单链表
void print_list(LinkedList head) {
if (head == NULL) {
printf("链表为空!\n");
return;
}
Node *p = head;
while (p != NULL) {
printf("%d %s %.2f\n", p->data.id, p->data.name, p->data.score);
p = p->next;
}
}
// 主函数
int main() {
LinkedList A, B;
int i, len, j;
printf("请输入A班级的学生信息:\n");
A = create_list();
printf("请输入B班级的学生信息:\n");
B = create_list();
printf("请输入转专业考试的相关信息(i、len、j):");
scanf("%d %d %d", &i, &len, &j);
transfer(A, B, i, len, j);
printf("A班级的学生信息:\n");
print_list(A);
printf("B班级的学生信息:\n");
print_list(B);
return 0;
}
```
阅读全文