- 添加学生
- 删除学生
- 修改学生
- 查询学生
- 显示所有学生信息
- 菜单
该系统主要使用了链表、循环、条件语句等相关模块, 其中包含头文件string.h、windows.h等函数库。使用链表做为学生数据的存储结构,该链表存放了学生的基本信息,包括学号、姓名、性别、年龄、院系、专业等相关信息,系统实现了对于学生的CRUD操作。
运行截图 代码#include总结#include #include #include #define N 100 //最大学生数量为50 typedef struct Student{ int id; //编号 char name[20]; //姓名 char sex[20]; //性别 int age; //年龄 char depart[40]; //院系 char major[40]; //专业 struct Student * next; }Student; Student * studentList; void initList(); void addStu(Student * head); //添加学生信息 void delStu(Student * head); //删除学生信息 void modStu(Student * head); //修改学生信息 Student * seaStuById(int id,Student * head); //查询学生信息 - 根据ID void showStu(Student * head); //显示学生信息 void print(int id,Student * head); //显示一条学生信息 void menu(); //菜单 void initList(){ studentList = (Student*)malloc(sizeof(Student)); studentList->next = NULL; } //添加学生信息 void addStu(Student * head){ Student * s = head; while(s->next != NULL){ s = s->next; } Student * student = malloc(sizeof(Student)); printf("请输入学生编号(1 - N):"); scanf("%d",&student->id); printf("请输入学生姓名:"); scanf("%s",student->name); printf("请输入学生性别(男/女):"); scanf("%s",student->sex); printf("请输入学生年龄:"); scanf("%d",&student->age); printf("请输入学生院系:"); scanf("%s",student->depart); printf("请输入学生专业:"); scanf("%s",student->major); student->next = NULL; s->next = student; } //删除学生信息 void delStu(Student * head){ int id; printf("请输入学生编号:"); scanf("%d",&id); Student * p = head; while(p->next){ if(p->next->id == id) break; p = p->next; } if(p->next == NULL){ printf("未查找到!n"); return; } p->next = p->next->next; //移除结点 printf("删除成功!n"); } //修改学生信息 void modStu(Student * head){ int id; printf("请输入学生编号:"); scanf("%d",&id); Student * student; student = seaStuById(id,head); if(student == NULL){ printf("未查找到!n"); return; } printf("请输入学生编号(1 - N):"); scanf("%d",&student->id); printf("请输入学生姓名:"); scanf("%s",student->name); printf("请输入学生性别(男/女):"); scanf("%s",student->sex); printf("请输入学生年龄:"); scanf("%d",&student->age); printf("请输入学生院系:"); scanf("%s",student->depart); printf("请输入学生专业:"); scanf("%s",student->major); printf("修改成功!n"); } //查询学生信息 - 根据ID Student * seaStuById(int id,Student * head){ Student * p = head->next; while(p){ if(p->id == id){ return p; } p = p->next; } return NULL; //查询失败 - 返回 NULL 的意义在于可以根据返回值的不同做成功与否的验证 } //显示学生信息 void showStu(Student * head){ int i; Student * student = head->next; printf("---------------------------------------------n"); printf("学生编号 姓名 性别 年龄 院系 专业n"); while(student){ printf("%d %s %s %d %s %sn",student->id,student->name,student->sex,student->age,student->depart,student->major); student = student->next; } printf("---------------------------------------------n"); } //显示一条学生信息 void print(int id,Student * head){ Student * student; student = seaStuById(id,head); if(student == NULL){ printf("未查找到!n"); return; } printf("---------------------------------------------n"); printf("学生编号 姓名 性别 年龄 院系 专业n"); printf("%d %s %s %d %s %sn",student->id,student->name,student->sex,student->age,student->depart,student->major); printf("---------------------------------------------n"); } //菜单 void menu(){ int choice,id; while(1){ printf("---------------------------------------------n"); printf("0、退出n"); printf("1、添加学生信息n"); printf("2、删除学生信息n"); printf("3、修改学生信息n"); printf("4、查询学生信息n"); printf("5、显示学生信息n"); printf("---------------------------------------------n"); printf("请输入您的选择:"); scanf("%d",&choice); switch(choice){ case 0: exit(0); break; case 1: addStu(studentList); break; case 2: delStu(studentList); break; case 3: modStu(studentList); break; case 4: printf("请输入查找的学生编号:"); scanf("%d",&id); print(id,studentList); break; case 5: showStu(studentList); break; default: printf("输入有误!n"); break; } system("pause"); system("cls"); } } int main() { initList(); menu(); return 0; }
链表结构算是比较有难度的一种结构, 但是也是最节省空间的一种存取方式, 当然它仅仅只是数据存取的一种载体而已。这里给出的带头结点 + 尾插法 的方式完成数据的添加, 具体还有 不带头节点和头插法 的区别, 在此便不再一一讨论。



