一、数据结构设计
1. 结构体定义
所有版本均采用结构体存储学生信息,典型实现如下:
// 基础版
struct Student {
char name[15];
int age;
char sex[5];
char tele[12];
char address[20];
};
// 进阶版带成绩(0)
typedef struct Student {
char name[30];
int age;
bool male;
float scores;
} Student;
// 链表实现版(7)
typedef struct node {
int num; // 学号
char name[15]; // 姓名
int english; // 英语成绩
struct node next;
} student_info;
二、核心功能实现
1. 初始化系统
// 数组实现初始化
struct Contact {
struct Student data[1000];
int size;
};
void InitContact(struct Contact ps) {
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;
// 链表初始化(0)
void CreateList(LinkList &L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
2. 添加学生
// 数组版本
void AddContact(struct Contact ps) {
if (ps->size == 1000) {
printf("系统已满!
);
return;
// 逐个字段录入
scanf("%s", ps->data[ps->size].name);
ps->size++;
// 链表尾部追加(0)
void NodeAppend(LinkList &L, ElemType e) {
LNode q = malloc(sizeof(LNode));
q->data = e;
LNode p = L;
while(p->next) p = p->next; // 找到尾节点
p->next = q;
3. 删除学生
// 数组覆盖法
void DeleteContact(struct Contact ps) {
int pos = FindByName(name, ps); // 查找位置
for(int j=pos; jps->data[j] = ps->data[j+1]; // 数据前移
ps->size--;
// 链表删除(7)
int delete_student_info(int num) {
student_info p = search(num); // 查找节点
q->next = p->next;
free(p); // 释放内存
4. 查找功能
// 按姓名查找
int FindByName(char name[], const struct Contact ps) {
for(int i=0; iif(strcmp(ps->data[i].name, name) == 0)
return i;
return -1;
// 按学号查找(7)
student_info search(int num) {
while(p && p->num != num)
p = p->next;
return p;
三、进阶功能实现
1. 文件存储
// 保存到文件(4)
void students_save(const char file, const Student students, size_t n) {
FILE fp = fopen(file, "w");
fprintf(fp, "%d
n); // 写入记录数
for(int i=0; i fprintf(fp, "%s %d %d %f students[i].name, students[i].age, students[i].male, students[i].scores); fclose(fp); // 从文件读取(7) size_t students_load(const char file, Student students) { FILE fp = fopen(file, "r"); fscanf(fp, "%d", &n); for(int i=0; i fscanf(fp, "%s%d%d%f", ...); // qsort排序 int CmpByName(const void e1, const void e2) { return strcmp(((Student)e1)->name, ((Student)e2)->name); void SortContact(struct Contact ps) { qsort(ps->data, ps->size, sizeof(Student), CmpByName); | 方案 | 优点 | 缺点 | 适用场景 | |-|--|--|-| | 静态数组 | 实现简单,访问速度快 | 固定容量,内存浪费 | 小型系统(<1000人)| | 动态链表 | 内存灵活,可动态扩展 | 实现复杂,访问速度慢 | 大型动态系统 | | 文件存储 | 数据持久化 | 需处理IO异常 | 所有需要保存数据的系统 | 1. 输入验证:对年龄、成绩等数字字段添加范围检查(如年龄应>0) 2. 防重复处理:添加学号时检查唯一性(7实现) 3. 内存管理:链表版本需确保每个malloc都有对应的free 4. 错误处理:文件操作添加fopen返回值检查(4示例) 5. 界面优化:采用菜单循环结构(8的while(1)+switch实现) 1. 电话号码存储:中将tele定义为int数组不合理,应改为char数组 2. 性别字段优化:使用枚举类型(男/女)代替字符串存储 3. 成绩计算:7中的平均分计算应使用浮点除法而非整数除法 完整实现建议5和7的实现方案,前者提供了完整的数组实现,后者展示了链表与文件操作的结合。动态内存版本可30的链表设计,结合4的文件存储功能构建完整系统。2. 排序功能
四、架构设计对比
五、代码优化建议
六、典型问题解析