#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct Student {
int id; // 编号
char name[50]; // 姓名
char studentId[20]; // 学号
char college[50]; // 学院
char className[50]; // 班级
char major[50]; // 专业
char phone[20]; // 电话
int age; // 年龄
char birthday[20]; // 生日
char dormitory[100]; // 宿舍
struct Student* next; // 下一个学生的指针
} Student;
Student* headOfStudents = NULL;
//学生课程信息
typedef struct CourseInfo {
int courseId; // 课程编号
char name[50]; // 姓名
char studentId[20]; // 学号
char semester[20]; // 学期
char courseName[100]; // 上课课程名称
char courseTime[50]; // 课程时间
char note[100]; // 备注
struct CourseInfo* next; // 下一个学生的指针
} CourseInfo;
CourseInfo* headOfCourseInfo = NULL;
// 定义课程结构体
typedef struct Course {
int courseId; // 课程编号
char courseName[100]; // 课程名称
char courseDescription[200]; // 课程简介
char teacher[50]; // 任课教师
char courseTime[20]; // 课程时间
char courseAddress[100]; // 课程地址
char note[100]; // 备注
struct Course* next; // 下一个课程的指针(对于同一学生)
} Course;
Course* headOfCourse = NULL;
void input() {
int choice;
do {
printf("\n请选择要录入的信息类型:\n");
printf("1. 学生信息\n");
printf("2. 课程信息\n");
printf("3. 学生课程信息\n");
printf("输入4退出\n");
scanf("%d", &choice);
switch(choice) {
case 1:
{
Student* newStudent = (Student*)malloc(sizeof(Student)); // 创建新的学生结构体实例
if (newStudent == NULL) {
printf("内存分配失败!\n");
break;
}
printf("您选择了录入学生信息。\n");
printf("请输入学生编号(id):");
scanf("%d", &newStudent->id);
printf("请输入学生姓名:");
scanf("%s", newStudent->name);
printf("请输入学生学号:");
scanf("%s", newStudent->studentId);
printf("请输入学生学院:");
scanf("%s", newStudent->college);
printf("请输入学生班级:");
scanf("%s", newStudent->className);
printf("请输入学生专业:");
scanf("%s", newStudent->major);
printf("请输入学生电话:");
scanf("%s", newStudent->phone);
printf("请输入学生年龄:");
scanf("%d", &newStudent->age);
printf("请输入学生生日:");
scanf("%s", newStudent->birthday);
printf("请输入学生宿舍:");
scanf("%s", newStudent->dormitory);
newStudent->next = NULL; // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。
if (headOfStudents == NULL) { // 如果链表为空,将新节点设置为头节点。
headOfStudents = newStudent;
} else { // 如果链表不为空,找到最后一个节点并修改其指针。
Student* current = headOfStudents;
while (current->next != NULL) { // 遍历链表找到最后一个节点。
current = current->next;
}
current->next = newStudent; // 将最后一个节点的指针指向新节点。
}
printf("学生信息录入成功!\n"); // 打印成功消息。
} break;
break;
case 2:
{
Course* newCourse = (Course*)malloc(sizeof(Course)); // 创建新的课程结构体实例
printf("请输入课程编号(courseId):");
scanf("%d", &newCourse->courseId);
printf("请输入课程名称:");
scanf("%s", newCourse->courseName);
printf("请输入课程简介:");
scanf("%s", newCourse->courseDescription);
printf("请输入任课教师:");
scanf("%s", newCourse->teacher);
printf("请输入课程时间:");
scanf("%s", newCourse->courseTime);
printf("请输入课程地址:");
scanf("%s", newCourse->courseTime);
printf("请输入备注:");
scanf("%s", newCourse->note);
newCourse->next = NULL; // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。
if (headOfCourse == NULL) { // 如果链表为空,将新节点设置为头节点。
headOfCourse = newCourse;
} else { // 如果链表不为空,找到最后一个节点并修改其指针。
Course* current = headOfCourse;
while (current->next != NULL) { // 遍历链表找到最后一个节点。
current = current->next;
}
current->next = newCourse; // 将最后一个节点的指针指向新节点。
}
printf("课程信息录入成功!\n");
}
break;
case 3:
{
CourseInfo * newCourseInfo = (CourseInfo *)malloc(sizeof(CourseInfo )); // 创建新的课程结构体实例
printf("请输入课程编号(courseId):");
scanf("%d", &newCourseInfo->courseId);
printf("请输入学生姓名:");
scanf("%s", newCourseInfo->name);
printf("请输入学生学号:");
scanf("%s", newCourseInfo->studentId);
printf("请输入学期:");
scanf("%s", newCourseInfo->semester);
printf("请输入课程名称:");
scanf("%s",newCourseInfo->courseName);
printf("请输入课程时间:");
scanf("%s", newCourseInfo->courseTime);
printf("请输入备注:");
scanf("%s", newCourseInfo->note);
newCourseInfo->next = NULL;
newCourseInfo->next = NULL; // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。
if (headOfCourseInfo == NULL) { // 如果链表为空,将新节点设置为头节点。
headOfCourseInfo = newCourseInfo;
} else { // 如果链表不为空,找到最后一个节点并修改其指针。
CourseInfo* current = headOfCourseInfo;
while (current->next != NULL) { // 遍历链表找到最后一个节点。
current = current->next;
}
current->next = newCourseInfo; // 将最后一个节点的指针指向新节点。
}
printf("课程信息录入成功!\n");
}
break;
case 4:
break;
default:
printf("无效的选择,请重新选择。\n");
}
} while(choice != 4); // 如果用户没有选择1、2或3,则继续循环。
}
void delete1(){
int type;
printf("\n请选择要删除的信息类型:\n");
printf("1. 学生信息\n");
printf("2. 课程信息\n");
printf("3. 学生课程信息\n");
printf("输入4退出\n");
scanf("%d", &type);
switch (type) {
case 1: {
printf("请输入要删除的学生编号(id):");
int id;
scanf("%d", &id);
Student* current = headOfStudents;
Student* prev = NULL;
while (current != NULL) {
if (current->id == id) {
if (prev == NULL) { // 删除头部节点
headOfStudents = current->next;
free(current); // 释放内存空间
} else { // 删除中间节点或尾部节点
prev->next = current->next;
free(current); // 释放内存空间
}
printf("学生信息删除成功!\n");
return;
}
prev = current;
current = current->next;
}
printf("没有找到该学生信息!\n");
break;
}
case 2: {
printf("请输入要删除的课程编号(courseId):");
int courseId;
scanf("%d", &courseId);
Course* current = headOfCourse;
Course* prev = NULL;
while (current != NULL) {
if (current->courseId == courseId) {
if (prev == NULL) { // 删除头部节点
headOfCourse = current->next;
} else { // 删除中间节点或尾部节点
prev->next = current->next;
}
free(current); // 释放内存空间
printf("课程信息删除成功!\n");
return;
}
prev = current;
current = current->next;
}
printf("没有找到该课程信息!\n");
break;
}
case 3:
{
printf("请输入要删除的课程编号(courseId):");
int courseId;
scanf("%d", &courseId);
CourseInfo* current = headOfCourseInfo;
CourseInfo* prev = NULL;
while (current != NULL) {
if (current->courseId == courseId) {
if (prev == NULL) { // 删除头部节点
headOfCourseInfo = current->next;
} else { // 删除中间节点或尾部节点
prev->next = current->next;
}
free(current); // 释放内存空间
printf("学生课程信息删除成功!\n");
return;
}
else {
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("没有找到该课程信息!\n");
return;
}
}
}
void search()
{
int choice;
printf("\n请选择要查找的信息类型:\n");
printf("1. 学生信息\n");
printf("2. 课程信息\n");
printf("3. 学生课程信息\n");
printf("输入4退出\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
int type;
printf("输入1 按姓名查找\n");
printf("输入2 按学号查找\n");
printf("请输入查找方式:\n");
scanf("%d",&type);
switch(type)
{
case 1:
{
printf("请输入要查找的学生姓名:");
char name[10];
scanf("%s", name);
Student* current = headOfStudents;
Student* prev = NULL;
while (current != NULL)
{
if (strcmp(current->name,name)==0)
{
printf("学生信息:\n");
printf("编号\t姓名\t学号\t学院\t班级\t专业\t电话\t年龄\t生日\t宿舍\n"); // 打印表头
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s\n", current->id, current->name, current->studentId, current->college, current->className, current->major, current->phone, current->age, current->birthday, current->dormitory); // 按照制表位输出学生信息
return;
}
else
{
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("未查找到该学生!\n");
return;
}
return;
case 2:
{
printf("请输入要查找的学生姓名:");
char id[10];
scanf("%s", id);
Student* current = headOfStudents;
Student* prev = NULL;
while (current != NULL) {
if (strcmp(current->studentId,id)==0)
{
printf("学生信息:\n");
printf("编号\t姓名\t学号\t学院\t班级\t专业\t电话\t年龄\t生日\t宿舍\n"); // 打印表头
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s\n", current->id, current->name, current->studentId, current->college, current->className, current->major, current->phone, current->age, current->birthday, current->dormitory); // 按照制表位输出学生信息
return;
}
else
{
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("未查找到该学生!\n");
return;
}
}
break;
}
case 2:
{
int type;
printf("输入1 按课程编号查找\n");
printf("输入2 按课程名称查找\n");
printf("输入3 按任课教师查找\n");
printf("请输入查找方式:\n");
scanf("%d",&type);
switch(type)
{
case 1:
{
printf("请输入要查找的课程编号:");
int name;
scanf("%d",&name);
Course* current = headOfCourse;
Course* prev = NULL;
while (current != NULL) {
if(current->courseId==name)
{
printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName, current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息
return;
}
else
{
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("未查找到该课程!\n");
return;
}
return;
case 2:
{
printf("请输入要查找的课程名称:");
char name[10];
scanf("%s", name);
Course* current = headOfCourse;
Course* prev = NULL;
while (current != NULL) {
if (strcmp(current->courseName,name)==0)
{
printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName,
current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息
return;
}
else{
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("未查找到该课程!\n");
return;
}
return;
case 3:{
printf("请输入要查找的任课教师:");
char name[10];
scanf("%s", name);
Course* current = headOfCourse;
Course* prev = NULL;
while (current != NULL) {
if (strcmp(current->teacher,name)==0) {
printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头
printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName,
current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息
return;
}
else
{
prev = current;
current = current->next;
}
}
if(current==NULL)
printf("未查找到该课程!\n");
return;
}
return;
}
break;
}
}
}
// 主函数
int main() {
int choice = 0;
while (choice != 7) { // 7是退出选项的编号
printf("|请选择操作: |\n");
printf("|1. 录入信息 |\n");
printf("|2. 删除信息 |\n");
printf("|3. 查找信息 |\n");
printf("|4. 统计信息 |\n");
printf("|5. 保存及备份 |\n");
printf("|6. 退出 |\n");
scanf("%d", &choice); // 获取用户选择的操作编号
switch (choice) { // 根据用户选择的操作编号执行相应的操作
case 1:
input();
break;
case 2:
delete1();
break;
case 3:
search();
break;
/* case 4:
count();
break;
case 5:
save();
break;
case 6: // 如果用户选择退出,直接退出程序。
printf("谢谢使用!\n");
return; // 退出程序 */
default: // 如果用户输入的操作编号不在选项范围内,提示用户重新输入。
printf("输入有误,请重新输入!\n");
break;
}
}
return 0; // 退出程序时返回0,表示程序正常结束。
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/056e642aecc449d6b175347d56550dde.png "#left")