/*
一、实验目的与要求
1、掌握函数、指针、结构体
2、掌握线性表的顺序存储结构
3、熟悉对线形表的一些基本操作和具体的函数定义。
二、实验内容
定义一个包含学生信息(学号,姓名,成绩)的的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号、姓名和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
*/
#include <stdio.h>
#include <string.h>
#define MAX 100 // 最多存100个学生
// 学生结构体
typedef struct {
int id; // 学号
char name[50]; // 姓名
float score; // 成绩
} Student;
// 顺序表结构
typedef struct {
Student data[MAX];
int length; // 当前学生数量
} StudentList;
// 初始化
void initList(StudentList* list) {
list->length = 0;
}
// (1) 批量输入学生信息
void addStudents(StudentList* list) {
int n;
printf("请输入学生数量: ");
scanf("%d", &n);
if (n <= 0 || n > MAX) {
printf("数量不合法!\n");
return;
}
for (int i = 0; i < n; i++) {
printf("第%d个学生:\n", i + 1);
printf(" 学号: "); scanf("%d", &list->data[i].id);
printf(" 姓名: "); scanf("%s", list->data[i].name);
printf(" 成绩: "); scanf("%f", &list->data[i].score);
}
list->length = n;
printf("成功录入%d个学生!\n", n);
}
// (2) 显示所有学生信息
void showAll(StudentList* list) {
if (list->length == 0) {
printf("暂无学生信息!\n");
return;
}
printf("\n学号\t姓名\t成绩\n");
for (int i = 0; i < list->length; i++) {
printf("%d\t%s\t%.2f\n", list->data[i].id, list->data[i].name, list->data[i].score);
}
}
// (3) 按姓名查找学生
void findByName(StudentList* list) {
char name[50];
printf("请输入姓名: ");
scanf("%s", name);
for (int i = 0; i < list->length; i++) {
if (strcmp(list->data[i].name, name) == 0) {
printf("找到学生: 学号=%d, 姓名=%s, 成绩=%.2f\n",
list->data[i].id, list->data[i].name, list->data[i].score);
return;
}
}
printf("未找到该学生!\n");
}
// (4) 按位置查找学生
void findByPosition(StudentList* list) {
int pos;
printf("请输入位置(1-%d): ", list->length);
scanf("%d", &pos);
if (pos < 1 || pos > list->length) {
printf("位置不合法!\n");
return;
}
Student s = list->data[pos - 1];
printf("学号=%d, 姓名=%s, 成绩=%.2f\n", s.id, s.name, s.score);
}
// (5) 插入学生
void insertStudent(StudentList* list) {
if (list->length >= MAX) {
printf("表已满!\n");
return;
}
int pos;
printf("请输入插入位置(1-%d): ", list->length + 1);
scanf("%d", &pos);
if (pos < 1 || pos > list->length + 1) {
printf("位置不合法!\n");
return;
}
// 元素后移
for (int i = list->length; i >= pos; i--) {
list->data[i] = list->data[i - 1];
}
// 输入新学生
printf("请输入新学生信息:\n");
printf(" 学号: "); scanf("%d", &list->data[pos - 1].id);
printf(" 姓名: "); scanf("%s", list->data[pos - 1].name);
printf(" 成绩: "); scanf("%f", &list->data[pos - 1].score);
list->length++;
printf("插入成功!\n");
}
// (6) 删除学生
void deleteStudent(StudentList* list) {
int pos;
printf("请输入要删除的位置(1-%d): ", list->length);
scanf("%d", &pos);
if (pos < 1 || pos > list->length) {
printf("位置不合法!\n");
return;
}
for (int i = pos - 1; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
printf("删除成功!\n");
}
// (7) 统计学生数量
void countStudents(StudentList* list) {
printf("当前学生总数:%d\n", list->length);
}
// 主函数
int main() {
StudentList list;
initList(&list);
int choice;
while (1) {
printf("\n=== 学生信息顺序表系统 ===\n");
printf("1. 输入学生信息\n");
printf("2. 显示所有学生\n");
printf("3. 按姓名查找\n");
printf("4. 按位置查找\n");
printf("5. 插入学生\n");
printf("6. 删除学生\n");
printf("7. 统计学生数量\n");
printf("8. 退出\n");
printf("请选择(1-8): ");
scanf("%d", &choice);
switch (choice) {
case 1: addStudents(&list); break;
case 2: showAll(&list); break;
case 3: findByName(&list); break;
case 4: findByPosition(&list); break;
case 5: insertStudent(&list); break;
case 6: deleteStudent(&list); break;
case 7: countStudents(&list); break;
case 8: printf("程序结束,再见!\n"); return 0;
default: printf("无效选择,请重新输入!\n");
}
}
}
效果图

1546

被折叠的 条评论
为什么被折叠?



