编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_LEN 20
#define MAX_ID_LEN 10
#define MAX_DORM_LEN 30
#define MAX_QQ_LEN 15
#define MAX_PHONE_LEN 15
#define MAX_GRADE 710

struct student {
char name[MAX_NAME_LEN];
char id[MAX_ID_LEN];
char dorm[MAX_DORM_LEN];
char qq[MAX_QQ_LEN];
char phone[MAX_PHONE_LEN];
int grade;
struct student *next;
};

// 添加一个新的学生信息
void add_student(struct student **head) {
// 创建一个新节点
struct student *new_student = (struct student *)malloc(sizeof(struct student));

// 输入学生信息
printf("请输入学生姓名:\n");
scanf("%s", new_student->name);
printf("请输入学生学号:\n");
scanf("%s", new_student->id);
printf("请输入学生宿舍:\n");
scanf("%s", new_student->dorm);
printf("请输入学生QQ号:\n");
scanf("%s", new_student->qq);
printf("请输入学生电话:\n");
scanf("%s", new_student->phone);
printf("请输入学生CET4成绩:\n");
scanf("%d", &(new_student->grade));

// 把新节点添加到链表头部
new_student->next = *head;
*head = new_student;

printf("添加成功!\n");
}

// 删除一个学生信息
void delete_student(struct student **head) {
// 获取要删除的学生信息的学号或电话号码
char id_or_phone[MAX_ID_LEN];
printf("请输入要删除的学生学号或电话号码:\n");
scanf("%s", id_or_phone);

// 如果要删除的学生信息就是链表头节点,直接删除即可
if (strcmp((*head)->id, id_or_phone) == 0 || strcmp((*head)->phone, id_or_phone) == 0) {
*head = (*head)->next;
printf("删除成功!\n");
return;
}

// 遍历链表,查找要删除的节点
struct student *current = *head;
while (current->next != NULL) {
if (strcmp(current->next->id, id_or_phone) == 0 || strcmp(current->next->phone, id_or_phone) == 0) {
// 找到要删除的节点,删除该节点并释放空间
struct student *to_delete = current->next;
current->next = to_delete->next;
free(to_delete);
printf("删除成功!\n");
return;
}
current = current->next;
}

printf("未找到要删除的学生信息!\n");
}

// 屏幕上打印一个学生信息
void print_student(const struct student *s) {
printf("姓名:%s\n", s->name);
printf("学号:%s\n", s->id);
printf("宿舍:%s\n", s->dorm);
printf("QQ号:%s\n", s->qq);
printf("电话:%s\n", s->phone);
printf("CET4成绩:%d\n", s->grade);
}

// 打印所有学生信息
void print_all_students(const struct student *head) {
printf("所有学生信息如下:\n");
while (head != NULL) {
print_student(head);
head = head->next;
}
}

// 按姓名首字母排序
int cmp_by_name(const void *a, const void *b) {
return strcmp(((struct student *)a)->name, ((struct student *)b)->name);
}

// 按电话号码排序
int cmp_by_phone(const void *a, const void *b) {
return strcmp(((struct student *)a)->phone, ((struct student *)b)->phone);
}

// 排序并打印所有学生信息
void sort_and_print(struct student *head) {
// 把所有学生信息存储到数组中
int n = 0;
struct student **students = (struct student **)malloc(sizeof(struct student *));
while (head != NULL) {
students[n++] = head;
head = head->next;
}

// 按姓名首字母排序
qsort(students, n, sizeof(struct student *), cmp_by_name);

// 按电话号码排序
qsort(students, n, sizeof(struct student *), cmp_by_phone);

// 打印排序后的所有学生信息
printf("所有学生信息按照姓名首字母和电话号码排序如下:\n");
for (int i = 0; i < n; ++i) {
print_student(students[i]);
}
free(students);
}

int main() {
struct student *head = NULL;

while (1) {
printf("+---------------------+\n");
printf("| 1. 添加学生信息 |\n");
printf("| 2. 删除学生信息 |\n");
printf("| 3. 显示所有学生信息 |\n");
printf("| 4. 按姓名首字母和电话号码排序 |\n");
printf("| 0. 退出程序 |\n");
printf("+---------------------+\n");

int choice;
scanf("%d", &choice);

switch (choice) {
case 0:
return 0;
case 1:
add_student(&head);
break;
case 2:
delete_student(&head);
break;
case 3:
print_all_students(head);
break;
case 4:
sort_and_print(head);
break;
default:
printf("无效的输入,请重新输入!\n");
}
}
}