学生管理系统是现在比较普遍的一个项目,如果用顺序表来进行存储,容易造成空间的浪费,如果用链表比较节省空间,而且增删便于操作
下面学生管理系统单链表的代码
头文件head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 32
typedef struct Data
{
int id;
char name[N];
int china;
int math;
int english;
float sore;
} Datatype;
typedef struct student
{
Datatype *data;
struct student *next;
} stu;
void menu();
void playgame();
//初始化
stu *Stucreat();
//插入数据初始化
void Stunum(stu *student);
//长度
int LLen(stu *student);
//数据的插入
void StuInsert(stu *student, int post);
//打印
void Stuprint(stu *student);
//删除
void Sdel(stu *student);
//修改
void Stualter(stu *student);
//查找按照姓名
void StuFindName(stu *student);
//位置查找
void StuFindPost(stu* student);
//avg计算平均分
void StuAvg(stu* student);
//order排序
void StuOrder(stu* student);//不足
float avg(stu* student);
//退出时清空链表,避免占用内存
void StuQuit(stu * student);
#endif
函数实现模块
#include "head.h"
//play
void playgame()
{
int play;
printf("1:play 2:exit\n");
scanf("%d", &play);
if (play != 1)
return;
//初始化
stu *student = Stucreat();
int flag = 1;
menu();
while (flag)
{
int choice;
printf("请输入你的选择:");
scanf("%d", &choice);
getchar();
switch (choice)
{
case 1:
Stunum(student);
break;
case 2:
Stuprint(student);
break;
case 3:
Stualter(student);
break;
case 4:
Sdel(student);
break;
case 5:
StuFindName(student);
break;
case 6:
StuFindPost(student);
break;
case 7:
StuAvg(student);
break;
case 8:
StuOrder(student);
break;
case 9:
flag = 0;
StuQuit(student);
break;
case 10:
printf("len:%d\n", LLen(student));
break;
case 11:
menu();
break;
default:
break;
}
}
free(student);
student = NULL;
}
//menu
void menu()
{
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("9:退出\n");
printf("10:人数\n");
printf("11:帮助菜单\n");
}
//初始化
stu *Stucreat()
{
stu *student = (stu *)malloc(sizeof(stu));
if (NULL == student)
{
printf("Stucreat err\n");
return NULL;
}
student->next = NULL;
return student;
}
//
//数据插入的初始化
void Stunum(stu *student)
{
int num, post;
printf("input student num:");
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
printf("添加:post 的位置:");
scanf("%d", &post);
StuInsert(student, post);
}
}
//数据的插入
void StuInsert(stu *student, int post)
{
if (post < 0 || post > LLen(student))
{
printf("post err\n");
return;
}
stu *Pnew = (stu *)malloc(sizeof(stu));
if (NULL == Pnew)
{
printf("insert err\n");
return;
}
Pnew->data = (Datatype *)malloc(sizeof(Datatype));
if (NULL == Pnew->data)
{
printf("insert data err\n");
return;
}
printf("学号: 姓名: 语文成绩: 数学成绩: 英语成绩:\n");
scanf("%d %s %d %d %d", &(Pnew->data->id), Pnew->data->name, &(Pnew->data->china), &(Pnew->data->math), &(Pnew->data->english));
for (int i = 0; i < post; i++)
student = student->next;
Pnew->next = student->next;
student->next = Pnew;
}
//长度
int LLen(stu *student)
{
int len = 0;
while (student->next != NULL)
{
len++;
student = student->next;
}
return len;
}
//打印
void Stuprint(stu *student)
{
if (LLen(student) == 0)
{
printf("student table empty ,err\n");
return;
}
printf("学号:姓名:语文成绩:数学成绩:英语成绩:平均分\n");
while (student->next != NULL)
{
student = student->next;
printf("%d\t%s\t%d\t%d\t%d\t%f\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english, student->data->sore);
}
putchar(10);
}
//删除
void Sdel(stu *student)
{
int post;
printf("del: post:");
scanf("%d", &post);
if (post < 0 || post >= LLen(student))
{
printf("Del post err\n");
return;
}
for (int i = 0; i < post; i++)
student = student->next;
stu *Pdel = student->next;
student->next = Pdel->next;
free(Pdel);
Pdel = NULL;
}
//修改
void Stualter(stu *student)
{
int post;
printf("alter: post:");
scanf("%d", &post);
if (post < 0 || post >= LLen(student))
{
printf("alter post err\n");
return;
}
for (int i = 0; i <= post; i++)
student = student->next;
int num;
printf("1:学号 2:姓名 3:语文成绩 4:数学成绩 5:英语成绩\n");
scanf("%d", &num);
if (num == 1)
{
int id;
printf("input alter id:");
scanf("%d", &id);
student->data->id = id;
}
else if (num == 2)
{
char name[N];
printf("aler name");
scanf("%s", name);
strcpy(student->data->name, name);
}
else
{
int sore = 0;
printf("alter sore ");
scanf("%d", &sore);
if (num == 3)
student->data->china = sore;
else if (num == 4)
student->data->math = sore;
else
student->data->english = sore;
}
}
//查找按照姓名
void StuFindName(stu *student)
{
char name[32] = {0};
printf("input find name: ");
scanf("%s", name);
while (student->next != NULL)
{
student = student->next;
if (strcmp(name, student->data->name) == 0)
{
printf("%d\t%s\t%d\t%d\t%d\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english);
return;
}
}
printf("no name\n");
}
//位置查找
void StuFindPost(stu *student)
{
int post;
printf("Find: post:");
scanf("%d", &post);
if (post < 0 || post >= LLen(student))
{
printf("Find post err\n");
return;
}
for (int i = 0; i < post; i++)
student = student->next;
printf("1:学号 2:姓名 3:语文成绩 4:数学成绩 5:英语成绩\n");
printf("%d\t%s\t%d\t%d\t%d\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english);
}
//avg
void StuAvg(stu *student)
{
if (LLen(student) == 0)
{
printf("student table empty ,err\n");
return;
}
while (student->next != NULL)
{
student = student->next;
student->data->sore = avg(student);
}
}
float avg(stu *student)
{
float sore = ((student->data->china) + (student->data->math) + (student->data->english)) / 3;
return sore;
}
//order
void StuOrder(stu *student)
{
if (LLen(student) == 0)
{
printf("student table empty ,err\n");
return;
}
int len = LLen(student);
stu *Ptmp = NULL;
stu *pretmp = NULL;
stu *H = NULL;
int w = 0;
for (int i = 0; i < len - 1; i++)
{
H = student;
while (H->next->next != NULL)
{
pretmp = H->next; //0
Ptmp = H->next->next; //1
if (pretmp->data->sore < Ptmp->data->sore)
{
H->next = Ptmp;
pretmp->next = Ptmp->next;
Ptmp->next = pretmp;
}
H = H->next;
}
}
}
void StuQuit(stu *student)
{
stu *Pdel = NULL;
while (student->next != NULL)
{
Pdel = student->next;
student->next = Pdel->next;
free(Pdel);
Pdel = NULL;
}
}
主函数的代码
#include "head.h"
int main(int argc, char const *argv[])
{
playgame();
return 0;
}
希望以上内容对大家有所帮助,不解的可以留言