纯属分享一下课程设计代码,仅供参考 欢迎大佬指正!!!!!
软件:vs2017(在devc++中有些许地方要改一下也可以运行,如有需要私聊我。)
#define _CRT_SECURE_NO_WARNINGS;
#ifndef LyStudenT_H
#define LyStudenT_H
#define Maxsize 10
#define GMaxsize 3
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//链表结构
typedef struct Student {
char Xh[Maxsize];//学号
char name[Maxsize];//姓名
float grade[GMaxsize];//成绩
int length;//长度
struct Student *next;
}Student, *StudentList;
//菜单栏
void Option() {
printf("------------------------------------------------------------------------------------------------------------------------\n");
printf(" 1).成绩信息录入功能.\n");
printf(" 2)成绩信息浏览功能.\n");
printf(" 3)查询功能:按学号查询和按成绩段查询.\n");
printf(" 4)成绩信息的删除:按学号进行删除某学生的成绩.\n");
printf(" 5)成绩信息的修改:按成绩修改,把55~59分之间的成绩都加上5分.\n");
printf(" 6)退出.\n");
printf("------------------------------------------------------------------------------------------------------------------------\n");
}
//初始化链表
void Initlist(StudentList &L) {
L = (StudentList)malloc(sizeof(Student)); //向内存申请空间
L->next = NULL; //初始化将头结点指向NULL
L->length = 0;//长度为0
}
//输出链表
void Pr_list(StudentList &L) {
if (L->length > 0)
{
printf("目前有%d条信息。\n", L->length);
Student *p; //申请一个临时节点用来指向数据
p = L->next;
for (int i = 0; i < L->length; i++)
{
printf("第%d位姓名和学号是:%s %s \n", i + 1, p->name, p->Xh);
printf("第%d位同学的三门成绩%.2f, %.2f, %.2f \n", i + 1, p->grade[0], p->grade[1], p->grade[2]);
if (p->next != NULL)
{
p = p->next; //如果不是最后一个的话就指向下一个
}
}
printf("查询成功\n");
}
else {
printf("目前没有信息。\n");
}
}
//尾插法 结构是使用单链表尾插法进行插入
bool Sc_listwc(StudentList &L) {
Student *s, *w;
w = L;
int x;
printf("请输入有几条信息:");
scanf_s("%d", &x);
FILE *fp; //定义一个FILE指针
fopen_s(&fp, "C:\\Structshixun\\wbout.txt", "a");
if (x > 0)
{
for (int i = 0; i < x; i++)
{
s = (Student*)malloc(sizeof(Student));
printf("请输入第%d位同学的姓名和学号(小于5位)空格隔开:", i + 1);
scanf_s("%s", &s->name, 10);
scanf_s("%s", &s->Xh, 10);
printf("请输入三个成绩空格隔开:");
scanf_s("%f %f %f", &s->grade[0], &s->grade[1], &s->grade[2]);
s->next = w->next;
w->next = s;
w = s;
//将写入的信息格式化,然后在末尾换行
fprintf(fp, "姓名:%s,学号:%s,成绩分别是:%.2f %.2f %.2f.\n", s->name, s->Xh, s->grade[0], s->grade[1], s->grade[2]);
}
L->length += x;
fclose(fp); //写入成功,关闭文件
return true;
}
fclose(fp);//写入失败,关闭文件
return false;
}
//修改成绩
bool Update_grade(StudentList &L) {
Student *p;
p = L->next; //让p指针指向头结点的下一个
if (p == NULL) {
printf("目前没有学生成绩。\n");//当p指向空时即当前是空链表或为最后一个
return false;
}
for (int i = 0; i < L->length; i++) {
if (p->grade[0] >= 55 && p->grade[0] <= 59)
{
p->grade[0] += 5;
p = p->next;
}
}
printf("第一门成绩为55-59区间的分数添加成功。\n");
return true;
}
//比较字符串
int strStr(char* haystack, char* needle) {
int len1 = strlen(haystack), len2 = strlen(needle);//获取两个字符串的长度
if (len1 != len2) { //长度不同则不用比较
return false;
}
int i = 1;
while (i <= len1) {
if (haystack[i - 1] == needle[i - 1]) { //两两比较
i++;
}
else {
return false;
}
}
return true;
}
//删除元素
bool Delete_id(StudentList &L) {
char num[5] = "\0";
printf("请输入要删除的学生学号:");
scanf_s("%s", &num, 5);
Student *w = L;
while (1) {
Student *p = w->next;
if (w->next == NULL) {
printf("没有此学号。\n");
return false;
}
if (strStr(p->Xh, num)) {
w->next = p->next;
L->length--;
free(p);
printf("已删除.\n");
w = L;
return true;
}
else {
p = p->next;
w = w->next;
}
}
}//按学号查询
bool List_xuehao(StudentList &L) {
char num[5] = "\0";
printf("请输入要查询成绩的学号:");
scanf_s("%s", &num, 5);
Student *p;
if (L->next == NULL) {
printf("没有信息.\n");
return false;
}
p = L->next;
for (;;) {
if (strStr(p->Xh, num)) {
printf("此学生姓名是:%s,学号:%s,", p->name, p->Xh);
printf("此学生的三门成绩分别是:%.2f %.2f %.2f. \n", p->grade[0], p->grade[1], p->grade[2]);
return true;
}
else {
if (p->next == NULL) {
printf("没有此学号。\n");
return false;
}
p = p->next;
}
}
}
//按成绩查询
bool List_grade(StudentList &L) {
//a和b用于存储要查询的范围起始与终止
int a, b, num = 0;
printf("请输入要查询的成绩范围起始:");
scanf_s("%d", &a);
printf("请输入要查询的成绩范围终止:");
scanf_s("%d", &b);
Student *p;
if (L->next == NULL) { //判断是否为空
printf("没有信息.\n");
return false;
}
p = L->next;
for (;;) {
if (p->grade[0] >= a && p->grade[0] <= b) {
printf("此学生姓名是:%s,学号:%s,", p->name, p->Xh);
printf("此学生所在范围成绩的是:%.2f. \n", p->grade[0]);
printf("此学生的其他两门成绩分别是:%.2f %.2f. \n", p->grade[1], p->grade[2]);
num++;
}
p = p->next;
if (p == NULL) {
printf("查找完毕,共有%d条信息.\n", num);
return false;
}
}
return true;
}
#endif // !LyStudenT_H
int main() {
StudentList L;
Initlist(L);
int option, xz;
//菜单栏
printf(" 欢迎使用学生成绩管理系统!\n");
Option();
printf("请输入功能序号:");
scanf_s("%d", &option);
while (option != 6) {
switch (option) {
case 1://录入信息
Sc_listwc(L);
break;
case 2://输出信息
Pr_list(L);
break;
case 3://按学号或成绩查询
printf("1.按学号查询;2.按成绩查询;");
scanf_s("%d", &xz);
switch (xz) {
case 1:
List_xuehao(L);
break;
case 2:
List_grade(L);
break;
}
break;
case 4://按学号删除某学生的成绩
Delete_id(L);
break;
case 5://修改成绩,将55——59分的成绩加5分
Update_grade(L);
break;
}
//本次运行结束后再次弹出菜单窗口
Option();
printf("请输入功能序号:");
scanf_s("%d", &option);
}
printf("欢迎下次使用。");
return 0;
}