用c语言定义两个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 合并两个顺序表,并根据学号进行排序; (4) 逐个显示新表中所有学生的相关信息。
时间: 2023-05-30 12:02:56 浏览: 110
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 顺序表最大长度
// 学生信息结构体
typedef struct {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
} Student;
// 顺序表结构体
typedef struct {
Student data[MAX_SIZE]; // 存储学生信息的数组
int length; // 顺序表长度
} SqList;
// 根据指定学生个数,逐个输入学生信息
void input_students(SqList *L, int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的学号:", i + 1);
scanf("%d", &L->data[i].id);
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", L->data[i].name);
printf("请输入第%d个学生的成绩:", i + 1);
scanf("%f", &L->data[i].score);
}
L->length = n; // 更新顺序表长度
}
// 逐个显示学生表中所有学生的相关信息
void print_students(SqList L) {
printf("学号\t姓名\t成绩\n");
for (int i = 0; i < L.length; i++) {
printf("%d\t%s\t%.2f\n", L.data[i].id, L.data[i].name, L.data[i].score);
}
}
// 根据学号进行排序
void sort_by_id(SqList *L) {
for (int i = 0; i < L->length - 1; i++) {
for (int j = i + 1; j < L->length; j++) {
if (L->data[i].id > L->data[j].id) {
Student temp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = temp;
}
}
}
}
// 合并两个顺序表,并根据学号进行排序
SqList merge_lists(SqList L1, SqList L2) {
SqList L;
L.length = L1.length + L2.length;
int i = 0, j = 0, k = 0;
while (i < L1.length && j < L2.length) {
if (L1.data[i].id < L2.data[j].id) {
L.data[k++] = L1.data[i++];
} else {
L.data[k++] = L2.data[j++];
}
}
while (i < L1.length) {
L.data[k++] = L1.data[i++];
}
while (j < L2.length) {
L.data[k++] = L2.data[j++];
}
sort_by_id(&L); // 根据学号进行排序
return L;
}
int main() {
SqList L1, L2, L3;
int n1, n2;
printf("请输入第一个顺序表中学生的个数:");
scanf("%d", &n1);
input_students(&L1, n1);
printf("第一个顺序表中的学生信息如下:\n");
print_students(L1);
printf("请输入第二个顺序表中学生的个数:");
scanf("%d", &n2);
input_students(&L2, n2);
printf("第二个顺序表中的学生信息如下:\n");
print_students(L2);
L3 = merge_lists(L1, L2);
printf("合并后的顺序表中的学生信息如下:\n");
print_students(L3);
return 0;
}
```