-
学生管理系统c语言链表写法源码
2020-09-06 10:42:17printf("********************学生管理系统***********************\n"); printf("*******************************************************\n"); printf(" MAIN MENU \n"); printf(" 1--显示学生信息 \n"); ...//问题汇总 //第一 注意调用结构体函数的情况以及作用是建立头表和结点时才调用,与功能函数void类区分开 //第二 出现不允许指针指向不完整的类类型,两种情况,第一include未引用,第二字符输入错误,即结构体的字符输入错误 //第三一个完整的单链表创建的实际思路 //第四 出现中文乱码典型的四种原因,数组溢出,字符串未初始化,输入值时选择的输入方式存在问题,内存未释放 //注意 输入中最好不要出现\n的状况特点 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #pragma warning(disable:4996) #define NEW (struct student *)malloc(sizeof(student)) #define LEN sizeof(struct student) struct student { char num[100]; char name[100]; int cgrade; int egrade; int mgrade; int total; struct student *next; }xueshen[100],hz[100]; struct student* list; int STUNUM=0; int n; //------------------------------函数菜单选择---------------------------------------------++ void menu() { printf("*******************************************************\n"); printf("********************学生管理系统***********************\n"); printf("*******************************************************\n"); printf(" MAIN MENU \n"); printf(" 1--显示学生信息 \n"); printf(" 2--增加学生信息 \n"); printf(" 3--删除学生信息 \n"); printf(" 4--修改学生信息 \n"); printf(" 5--查找学生信息 \n"); printf(" 6--退出程序 \n"); printf("*******************************************************\n"); } //------------------------------函数功能实现模块------------------------------------------++ struct student* creat()//注意想要引用结构体的数据时,必须代结构体中的思路状况特点 { struct student * head; head = NEW; head->next = NULL; return (head); } struct student* node()//即给予的是 创建结点时调用的 { struct student *p1; p1 = NEW;//注意建立的结点也需要开辟空间的状况特点 scanf("%s%s%d%d%d%d", p1->num, p1->name, &p1->cgrade, &p1->egrade,&p1->mgrade, &p1->total); p1->next = NULL; return (p1); } //-----------------------------------------保存与读取功能------------------- //保存链表的话就需要用结构体的形式一个一个代存,即本质差不多,只是一个利用的是循环的思路,一个利用的是指针域移动的思路 void save(struct student *head)//即利用结构体的头指针,即表调用 { struct student *p; FILE *fp; fp=fopen("kk.dat","wb+"); p = head; while (p != NULL) { fwrite(p, LEN, 1, fp); p = p->next; } fclose(fp); } //注意指针读取时需要开辟新的空间且需要将值赋予给链表的参数中否则无法读取出,否则就会内存区错误 //即链表写法的读取具有不同且如果是爆不能转换类错误时,需要注意名字是否错误的状况 //注意返回值需要赋值予链表的状况特点 struct student *duq(void) { struct student *p1; struct student *p2 = NEW; struct student *head = NULL; FILE *fp; fp = fopen("kk.dat", "rb+"); while (!feof(fp)) { if ((p1 = NEW) == NULL) { printf("内存申请出错\n"); fclose(fp); exit(0); } if (fread(p1, LEN, 1, fp) != 1) { free(p1); break; } if (head == NULL) head = p2=p1; else { p2->next = p1; p2 = p1; } } fclose(fp); return (head); } //------------------------------函数功能显示模块------------------------------------------++ //显示功能函数 void read(struct student *head)//即可直接代head头文件读取的方式代 { struct student *p2 = head->next; while(p2 != NULL) { printf("%s %s %d %d %d %d\n", p2->num, p2->name, p2->cgrade, p2->egrade, p2->mgrade, p2->total); p2 = p2->next; } printf("\n"); } //增加功能函数 void add(struct student *head) { char name[10]; int j=0; printf("请输入需要增加的用户的名字:\n"); scanf("%s", name); struct student *xz = head; xz = head->next; if (xz == NULL)//判断头表是不是空的状况特点 { j = 0; } else { while (strcmp(name, xz->name) != 0)//即查找值的状况特点 { xz = xz->next; if (xz == NULL) { j = 0; break; } } if (xz != NULL) { ++j; } } if (j == 0) { printf("该用户可添加,请输入用户数据:\n"); struct student* xnode = node(); xnode->next = head->next; head->next = xnode; printf("添加成功\n"); } else { printf("添加失败,该用户已存在\n"); } save(list); } //删除功能函数 void del(struct student *head) { char name[10]; printf("请输入需要删除的用户的名字:\n"); scanf("%s", name); struct student *xz = head; struct student *xzd = head; xz = head->next; if (xz == NULL)//判断头表是不是空的状况特点 { printf("不存在该用户\n"); } else { while (strcmp(name, xz->name) != 0)//即查找值的状况特点 { xzd = xz; xz = xz->next; if (xz == NULL) { printf("不存在该用户\n"); break; } } if (xz != NULL) { xzd->next = xz->next; free(xz); printf("删除成功\n"); } } } //更改功能函数 void cha(struct student *head) { char name[10]; printf("请输入需要修改用户的名字:\n"); scanf("%s", name); struct student *xz = head; xz = head->next; if (xz == NULL)//判断头表是不是空的状况特点 { printf("不存在该用户\n"); } else { while (strcmp(name, xz->name) != 0)//即查找值的状况特点 { xz = xz->next; if (xz == NULL) { printf("不存在该用户\n"); break; } } if (xz != NULL) { printf("查找到用户的信息为:\n"); printf("%s %s %d %d %d %d\n", xz->num, xz->name, xz->cgrade, xz->egrade, xz->mgrade, xz->total); printf("请输入更改后的用户信息数据:\n"); scanf("%s%s%d%d%d%d", xz->num, xz->name, &xz->cgrade, &xz->egrade, &xz->mgrade, &xz->total); } } } //查找功能函数 void see(struct student *head) { char name[10]; printf("请输入需要查找用户的名字:\n"); scanf("%s", name); struct student *xz = head; xz = head->next; if (xz == NULL)//判断头表是不是空的状况特点 { printf("不存在该用户\n"); } else { while (strcmp(name, xz->name) != 0)//即查找值的状况特点 { xz = xz->next; if (xz == NULL) { printf("不存在该用户\n"); break; } } if (xz != NULL) { printf("查找到的信息为:\n"); printf("%s %s %d %d %d %d\n", xz->num, xz->name, xz->cgrade, xz->egrade, xz->mgrade, xz->total); } } } void xuanz() { int j = 0, x=1; menu(); while (n != 5) { printf("请输入数字选择功能:\n"); scanf_s("%d", &n); switch (n)//选择功能 { case 1: list=duq(); read(list); break; case 2: list=duq(); add(list); break; case 3: list=duq(); del(list); save(list); break; case 4: list=duq(); cha(list); save(list); break; case 5: list=duq(); see(list); break; case 6: exit(0); break; default: printf("输出错误,请重新输入:\n"); break; } } } //-----------------------------------主函数模块--------------------------------------------++ int main() { list = NEW; list = creat(); xuanz(); system("pause"); return 0; }
-
学生信息管理系统C语言链表版.rar
2020-08-28 21:06:42自己花了点时间琢磨了一个简易版的链表,里面很多地方还是比较复杂的,希望大佬能指导修改一下,同时也供初学数据结构的码友参考学习 -
C语言链表学生管理系统
2019-06-10 22:29:06C语言链表实现的学生管理系统,codeblock已测试,附带广工C++课设报告 -
学生成绩管理系统 C语言链表版本
2015-03-14 20:37:26可以实现管理学生姓名学号成绩信息,有一定的容错能力。 源代码下载地址.../********************************************************* *程序描述:学生成绩管理系统 *运行环境:Windows 7博客搬家了,最近同时更新,没准什么时候就完全搬走了-_-
http://blog.just666.cn 这个是新博客地址,希望大家多多关照可以实现管理学生姓名学号成绩信息,有一定的容错能力。
源代码下载地址(http://www.oschina.net/code/snippet_2309129_46342%20%E2%80%9Clink%E2%80%9D)/********************************************************* *程序描述:学生成绩管理系统 *运行环境:Windows 7 SP1 X64 *开发环境:CodeBlocks with Win7 *作者:耗子、 *时间:2015.03 **********************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> const int TRUE = 1; const int FALSE = 0; const char BACK[] = "back"; typedef struct Student //链表元素 { char name[100], number[100]; double chinese, math, english; struct Student* next; }LNode, *Student; //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓声明函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// Student initLinkList();//初始化 void insLinkList(Student* pHead, char name[],//插入元素 char number[], double chinese, double math, double english); int delLinkList(Student* pHead, char number[]);//删除元素 int listLength(Student* pHead);//获取链表长度 int findLinkList(Student* pHead, char number[]);//查找元素,返回位置 int modLinkList(Student* pHead, char number[],//修改元素 double chinese, double math, double english); void outPutLinkList(Student* pHead);//输出所有信息 double scoreLegal(char score[]);//判断分数合法 int nameLegal(char name[]);//判断姓名合法 int numberLegal(char number[]);//判断学号合法 int emptyLinkList(Student* pHead);//判断链表是否为空 void swapNode(Student p, Student q);//负责交换 void putMain();//输出主UI void putSort();//输出排序UI int isBack(char str[]);//判断返回 void error(char []);//错误警告 void welcome();//欢迎 void bay();//再见 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑声明函数↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓主函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// int main() { system("color 0A"); system("mode con cols=80 lines=25"); Student pHead; Student q, p; char name[100], number[100], chinese[100], math[100], english[100]; int op, n; //op是选择的选项 double cn, ma, eng; int i, j, sum; pHead = initLinkList(); welcome(); while (1) { begin: q = pHead; putMain(); op = (getch() - '0' ); if (op == -1) continue; switch (op) { case 0://退出 { bay(); return 0; } case 1://添加信息 { for (;;) { printf ("\n\t\t\t叫什么?"); gets(name); if (isBack(name)) goto begin; if (nameLegal(name) == 0) continue; else break; } number: for (;;) { printf ("\t\t\t学号呢?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; else break; } while (q != NULL) { if (strcmp(q->number, number) == 0) { error("学号重复了噻~"); goto number; } else q = q->next; } for (;;) { printf ("\t\t\t语文多少分?\n\t\t\t"); gets(chinese); if (isBack(chinese)) goto begin; cn = scoreLegal(chinese); if (cn == -1) continue; else break; } for (;;) { printf ("\t\t\t数学呢?\n\t\t\t"); gets(math); if (isBack(math)) goto begin; ma = scoreLegal(math); if (ma == -1) continue; else break; } for (;;) { printf ("\t\t\tEnglish:\n\t\t\t"); gets(english); if (isBack(english)) goto begin; eng = scoreLegal(english); if (eng == -1) continue; else break; } insLinkList(pHead, name, number, cn, ma, eng); printf ("\n\t\t\t学生信息添加完毕\a"); getch(); break; } case 2://删除信息 { for(;;) { if (emptyLinkList(pHead)) break; printf ("\t\t\t要删除的学生的学号:"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; if (delLinkList(pHead, number) == 1) { printf ("\t\t\t删除成功!"); getch(); break; } else error ("没有找到该学生!"); continue; } break; } case 3://查找信息 { if (emptyLinkList(pHead)) break; printf ("\n\t\t\t要查找谁的信息?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; findLinkList(pHead, number); break; } case 4://修改信息 { if (emptyLinkList(pHead)) break; for (;;) { printf ("\n\t\t\t要修改哪个的信息?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; else break; } for (;;) { if (strcmp(q->number, number) == 0) break; else q = q->next; if (q == NULL) { error("没有找到该学生!"); getch(); goto begin; } } for (;;) { printf ("\t\t\t语文多少分?\n\t\t\t"); gets(chinese); if (isBack(chinese)) goto begin; cn = scoreLegal(chinese); if (cn == -1) continue; else break; } for (;;) { printf ("\t\t\t数学呢?\n\t\t\t"); gets(math); if (isBack(math)) goto begin; ma = scoreLegal(math); if (ma == -1) continue; else break; } for (;;) { printf ("\t\t\tEnglish:\n\t\t\t"); gets(english); if (isBack(english)) goto begin; eng = scoreLegal(english); if (eng == -1) continue; else break; } modLinkList(pHead, number, cn, ma, eng); break; } case 5://输出信息 { if (emptyLinkList(pHead)) break; q = pHead; p = pHead; sum = listLength(pHead); putSort(); op = (getch() - '0'); switch (op) { case 0://退出 goto begin; case 1://学号 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (strcmp(p->number, q->number) > 0) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 2://语文 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->chinese < p->chinese) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 3://数学 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->math < p->math) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 4://英语 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->english < p->english) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 5://总分 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if ((q->chinese + q->math + q->english) < (p->chinese + p->math + p->english)) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } default: break; } if (op >= 1 && op <= 5) outPutLinkList(pHead); break; default: break; } } } return 0; } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑主函数↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓链表操作↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// Student initLinkList() //初始化 { Student pHead; pHead = (Student)malloc(sizeof(LNode)); pHead->next = NULL; return pHead; } void insLinkList(Student* pHead, char name[], //插入元素 char number[], double chinese, double math, double english) { Student p = pHead; Student pNew = (Student)malloc(sizeof(LNode)); while (p->next != NULL) p = p->next; strcpy(pNew->name, name); strcpy(pNew->number, number); pNew->chinese = chinese; pNew->math = math; pNew->english = english; pNew->next = NULL; p->next = pNew; return ; } int delLinkList(Student* pHead, char number[]) //删除元素 { Student p = pHead, q; while (p->next != NULL) { if (strcmp(p->next->number, number) == 0) { q = p->next->next; free(p->next); p->next = q; free(q); return TRUE; } p = p->next; } return FALSE; } int listLength(Student* pHead) //获得链表长度 { int n = 0; Student p = pHead; while (p != NULL) { p = p->next; n++; } return n; } int findLinkList(Student* pHead, char number[]) //查找元素 { Student p = pHead; p = p->next; double sum; while (p != NULL) { if (strcmp(p->number, number) == 0) { system ("CLS"); sum = p->chinese + p->math + p->english; printf ("\n\n\t\t\t***********************\n\t\t\t* 该学生成 绩如下表 *\n"); printf ("\t\t\t***********************\n"); printf ("\t\t\t* %s *\n", p->number); printf ("\t\t\t***********************\n"); printf ("\t\t\t* 姓名:%-8s *\n", p->name); printf ("\t\t\t* 语文:%-6.2f *\n", p->chinese); printf ("\t\t\t* 数学:%-6.2f *\n", p->math); printf ("\t\t\t* 英语:%-6.2f *\n", p->english); printf ("\t\t\t* 平均:%-7.2f *\n", sum / 3); printf ("\t\t\t* 总分:%-7.2f *\n", sum); printf ("\t\t\t***********************\n"); getch(); return TRUE; } p = p->next; } error("没有该学生的信息~"); return FALSE; } int modLinkList(Student* pHead, char number[], //修改元素 double chinese, double math, double english) { Student p = pHead; p = p->next; while (p != NULL) { if (strcmp(p->number, number) == 0) { p->chinese = chinese; p->math = math; p->english = english; return TRUE; } p = p->next; } return FALSE; } void outPutLinkList(Student* pHead) //输出所有元素 { if (emptyLinkList(pHead)) return ; system ("CLS"); Student p = pHead; p = p->next; printf ("\n\n\t\t\t 所有学生成绩如下\n"); printf ("\n *******************************************************************\n"); printf (" * 学 号 * 姓 名 * 语 文 * 数 学 * 英 语 * 总 分 *"); printf ("\n *******************************************************************\n"); while (p != NULL) { printf (" * %s *", p->number); printf (" %-8s *", p->name); printf (" % 6.2f * %6.2f * %6.2f *", p->chinese, p->math, p->english); printf (" %6.2f *\n", p->chinese + p->math + p->english); p = p->next; } printf (" *******************************************************************\n"); getch(); return ; } int emptyLinkList(Student* pHead) //链表为否为空 { Student p = pHead; if (p->next == NULL) { error("没有任何学生信息!"); return TRUE; } return FALSE; } void swapNode(Student p, Student q) //交换节点内容 { Student temp = initLinkList(); strcpy(temp->name, p->name); strcpy(p->name, q->name); strcpy(q->name, temp->name); strcpy(temp->number, p->number); strcpy(p->number, q->number); strcpy(q->number, temp->number); temp->chinese = p->chinese; p->chinese = q->chinese; q->chinese = temp->chinese; temp->math = p->math; p->math = q->math; q->math = temp->math; temp->english = p->english; p->english = q->english; q->english = temp->english; free(temp); } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑链表操作↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓函数定义↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// int isBack(char ch[]) //判断返回 { if(strcmp(ch, BACK) == 0) return TRUE; return FALSE; } int numberLegal(char number[]) //判断学号 { int i; if (strlen(number) != 11)//位数判断 { error("学号应为十一位纯数字"); return FALSE; } for (i = 0; i < 11; i++) if ( ! isdigit(number[i]))//是否是数字 { error("学号应为十一位纯数字"); return FALSE; } if (number[0] == 0)//学号首位 { error("学号第一位不能为0"); return FALSE; } return TRUE; } int nameLegal(char name[]) //判断姓名 { int i, n = strlen(name); if (n <= 3) { error("科普:所谓姓名,一姓一名,最少得俩字儿"); return FALSE; } for (i = 0; i < n; i++) if (name[i] >= 0) { error("既然是中国人,名字当然也是中国字了啊"); return FALSE; } if (strlen(name) > 8) { error ("名字太长的话,请用缩写"); return FALSE; } return TRUE; } double scoreLegal(char score[]) //判断分数 { int n = strlen(score); int i, d = 0, g = 0; double q = 1, h = 0.1; double sum = 0; for (i = 0; i < n; i++) if (score[i] != '.' && (isdigit(score[i]) == 0)) { error("分数由数字和小数点组成。。。"); return -1; } for (i = 0; i < n; i++) if (score[i] == '.') { d = i; g++; if (g == 2) { error("小数点好多啊"); return -1; } } if (score[0] == '.' || score[n - 1] == '.') { error("小数点不能出现在这么诡异的位置"); return -1; } if (g == 1) i = d - 1; else i = n - 1; for ( ; i != -1; i--) { sum = sum + (score[i] - '0') * q; q *= 10; } if (g == 1) { for (i = d + 1; i < n; i++) { sum = sum + (score[i] - '0') * h; h *= 0.1; } } if (sum > 100.000000) { error("分数略大啊~"); return -1; } return sum; } void error(char ch[]) //提示错误 { system ("color 0C"); printf ("\n\n\t\t\t"); puts(ch); printf ("\n"); printf ("\a"); getch(); system ("color 0A"); } void welcome() //欢迎 { system("title 学生成绩管理系统V1.0 By-耗子、"); printf ("\n\n\n\n\t\t\t\t"); printf ("\n\t\t********************************************"); printf ("\n\t\t* 学生成绩管理系统V1.0 *"); printf ("\n\t\t* *"); printf ("\n\t\t* 欢迎使用 *"); printf ("\n\t\t* *"); printf ("\n\t\t* 耗子、 *"); printf ("\n\t\t********************************************"); getch(); } void putMain() //主UI { system ("CLS"); system("title 学生成绩管理系统V1.0 By-耗子、"); printf ("\n\n"); printf ("\t\t\t 学生成绩管理系统V1.0\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t* 1、添加信息 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 2、删除信息 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 3、查找信息 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 4、修改信息 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 5、显示信息 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 0、退出系统 *\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t请选择:(0~5)"); } void putSort() //排序UI { system("title 请选择排序方式 By-耗子、"); system("CLS"); printf ("\n\n"); printf ("\t\t\t 请选择排序方式 \n"); printf ("\t\t\t************************\n"); printf ("\t\t\t* 1、学号排序 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 2、语文成绩 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 3、数学成绩 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 4、英语成绩 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 5、总分排序 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 0、系统菜单 *\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t请选择:(0~5)"); } void bay() //退出 { system("title 谢谢使用 By-耗子、"); system ("CLS"); printf ("\n\n\n\n\t\t\t\t"); printf ("\n\t\t********************************************"); printf ("\n\t\t* *"); printf ("\n\t\t* *"); printf ("\n\t\t* 谢谢使用 *"); printf ("\n\t\t* *"); printf ("\n\t\t* *"); printf ("\n\t\t********************************************"); printf ("\n\n\n\t\n\t\t -By.耗子\n"); getch(); } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑函数定义↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//
-
C语言链表实现学生管理系统
2020-08-25 21:56:10主要为大家详细介绍了C语言链表实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
学生管理系统C语言(链表实现)
2010-03-26 14:32:07用C语言链表知识编出了简单的学生管理系统,可实现创建、查询、删除、排序、保存、读取等功能 -
C语言链表学生成绩管理系统代码
2019-07-15 11:34:37C语言链表学生成绩管理系统代码,具体内容可以查看博客说明:https://blog.csdn.net/qq_21480607/article/details/90722185 -
C语言链表实现的学生成绩管理系统
2020-07-24 18:21:22用C语言链表实现的学生成绩管理系统,交互友好,包含录入、插入、修改成绩等大量功能,本作业成绩95+,包你满意 -
学生成绩管理系统-C语言链表版
2020-07-20 13:47:32学生成绩管理系统绝对是我们课设的经典选题之一,那么今天就给大家带来一个链表版本的学生成绩管理系统,希望对大家的学习有所帮助,这个项目采用链表这一数据结构最为底层的存储框架,然后是用文件对数据进行一个...学生成绩管理系统绝对是我们课设的经典选题之一,那么今天就给大家带来一个链表版本的学生成绩管理系统,希望对大家的学习有所帮助,这个项目采用链表这一数据结构最为底层的存储框架,然后是用文件对数据进行一个永久存储,达到了数据持久化的目的
以上是代码的运行截图,大家可以仿照我的这个思路编写出自己的管理系统,另外想参考该系统源码的朋友可以在评论区留言! -
学生管理系统(C语言链表版)
2016-09-21 10:57:551,把学号类型改为字符串类型,利用conio.h和getch()函数可以进行判断读取,详细可参考orderdish点餐系统 2,把返回值为指针的函数该为void Funtion (pointer * pOutput)的形式,把对指针的操作改为传递指针值...缺点:
1,没有限制输入位数
2,ReadData函数以及控制输出函数返回值为指针,这个并不安全
改进方法:
1,把学号类型改为字符串类型,利用conio.h和getch()函数可以进行判断读取,详细可参考orderdish点餐系统
2,把返回值为指针的函数该为void Funtion (pointer * pOutput)的形式,把对指针的操作改为传递指针值进行函数内部操作。
#include
#include
#include
#include
#include
#include
#include
#define MAX_LEN 50
#define STLEN sizeof(STSI)
int WhereX()
{
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &pBuffer);
return (pBuffer.dwCursorPosition.X+1);
}
int WhereY()
{
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &pBuffer);
return (pBuffer.dwCursorPosition.Y+1);
}
void gotoxy(int x,int y)
{
COORD c;
c.X=x-1;
c.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
typedef struct tagSTSI
{
int nStuNo;
char szName[MAX_LEN+1];
int nAge;
float fGPA;
float fTuition;
struct tagSTSI * pNext;
}STSI;
char gszFilename[30] = "student.dat";
STSI * ReadData(void)
{
int n;
STSI * pHead = NULL;
STSI * pPrev;
STSI * pCurrent;
FILE * pFile;
if ((pFile = fopen(gszFilename,"ab")) == NULL)
{
puts("创建文档出错");
exit(EXIT_FAILURE);
}
rewind(pFile);
fclose(pFile);
if ((pFile = fopen(gszFilename,"r+b")) == NULL)
{
puts("打开文档出错");
exit(EXIT_FAILURE);
}
while (!feof(pFile))
{
if (fscanf(pFile,"%d",&n) != EOF)
{
if ((pCurrent = (STSI *) malloc(STLEN)) == NULL)
{
puts("内存申请出错");
fclose(pFile);
exit(EXIT_FAILURE);
}
if (fread(pCurrent,STLEN,1,pFile) != 1)
{
puts("文件读取出错");
free(pCurrent);
exit(EXIT_FAILURE);
}
if (pHead == NULL)
{
pHead = pPrev = pCurrent;
}
else
{
pPrev->pNext = pCurrent;
pPrev = pCurrent;
}
}
else
{
break;
}
}
fclose(pFile);
//puts("文件读取成功");
return pHead;
}
STSI * CreatNode(int nCN)
{
int nCount;
size_t nJudge;
int nX,nY;
STSI * pHead;
STSI * pPrev;
STSI * pCurrent;
STSI * pSTF;
pSTF = ReadData();
for (nCount = 0; nCount < nCN; nCount++)
{
pCurrent = (STSI *) malloc(STLEN);
puts("请输入学号,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pCurrent->nStuNo));
system("cls");
if ( pCurrent->nStuNo == 0)
{
return NULL;
}
while (pSTF != NULL)
{
while (pSTF->nStuNo == pCurrent->nStuNo)
{
printf("学号重复,请在下一行重新输入新的学号,返回请输入0\n");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pCurrent->nStuNo));
if ( pCurrent->nStuNo == 0)
{
return NULL;
}
system("cls");
}
pSTF = pSTF->pNext;
}
puts("请输入名字,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%s",pCurrent->szName);
system("cls");
for (nJudge = 0; nJudge < strlen(pCurrent->szName); nJudge++)
{
if ((pCurrent->szName[0] == '0') && (pCurrent->szName[1] == '\0'))
{
return NULL;
}
while (isascii((pCurrent->szName)[nJudge]))
{
puts("名字输入出错,请输入中文名,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%s",pCurrent->szName);
system("cls");
nJudge = 0;
}
}
puts("请输入学生年龄,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pCurrent->nAge));
if (pCurrent->nAge == 0)
{
return NULL;
}
system("cls");
puts("请输入学生绩点,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pCurrent->fGPA));
if (pCurrent->fGPA == 0)
{
return NULL;
}
system("cls");
puts("请输入学费,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pCurrent->fTuition));
if (pCurrent->fTuition == 0)
{
return NULL;
}
system("cls");
pCurrent->pNext = NULL;
if (nCount == 0)
{
pHead = pPrev = pCurrent;
}
else
{
pPrev->pNext = pCurrent;
pPrev = pCurrent;
}
}
return pHead;
}
void WriteDataCover(STSI * pstParm)
{
FILE * pFile;
STSI * pstWDC;
if ((pFile = fopen(gszFilename,"wb")) == NULL)
{
fputs("打开文档出错\n",stderr);
exit(EXIT_FAILURE);
}
pstWDC = pstParm;
while (pstWDC != NULL)
{
if (fwrite(pstWDC, STLEN, 1, pFile) != 1)
{
puts("写入数据出错\n");
fclose(pFile);
return;
}
pstWDC = pstWDC->pNext;
}
fclose(pFile);
}
void WriteDataAdd(STSI * pstParm)
{
FILE * pFile;
STSI * pstWDA;
if ((pFile = fopen(gszFilename,"ab")) == NULL)
{
fputs("打开文档出错\n",stderr);
exit(EXIT_FAILURE);
}
pstWDA = pstParm;
while (pstWDA != NULL)
{
if (fwrite(pstWDA,STLEN,1,pFile) != 1)
{
puts("写入数据出错\n");
fclose(pFile);
return;
}
pstWDA = pstWDA->pNext;
}
fclose(pFile);
}
void MonPrint (void)
{
time_t timer;
timer = time (NULL);
puts(" 学生信息管理系统 ");
puts("1、显 示 2、增 加");
puts("3、查 询 4、修 改");
puts("5、删 除 6、退 出");
puts(ctime(&timer));
}
void InfoPrint (void)
{
STSI * pstIP;
int nJudge;
int nX,nY;
pstIP = ReadData();
if (pstIP == NULL)
{
printf("没有学生信息,请重新进入程序输入\n");
}
else
{
printf("学号 姓名 年龄 绩点 学费\n");
}
while (pstIP != NULL)
{
printf(" %d %s %d %.1f %.2f\n",pstIP->nStuNo,pstIP->szName,pstIP->nAge,pstIP->fGPA,pstIP->fTuition);
pstIP = pstIP->pNext;
}
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
while ((nJudge != 1) && (nJudge != 0))
{
puts("输入有误,请重新输入。");
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
}
if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
}
void InfoAdd (void)
{
int nAddNum;
int nJudge;
int nX,nY;
puts("需要增加几个学生的信息?");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nAddNum);
system("cls");
WriteDataAdd(CreatNode(nAddNum));
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
while ((nJudge != 1) && (nJudge != 0))
{
puts("输入有误,请重新输入。");
puts("进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
system("cls");
}
if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
}
void InfoSerch (void)
{
int nSN;
int nJudge;
int nX,nY;
STSI * pstIS;
STSI * pstPa;
pstPa = pstIS = ReadData();
if (pstIS->pNext == NULL)
{
puts("没有学生信息,按任意键返回");
getchar();
return;
}
puts("请输入学号,返回上级菜单请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nSN);
if (nSN == 0)
{
return;
}
system("cls");
while (pstIS->nStuNo != nSN)
{
if((pstIS->pNext) == NULL)
{
puts("请输入正确的学号");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",nSN);
system("cls");
pstIS = pstPa;
}
else
{
pstIS = pstIS->pNext;
}
}
puts("学号 姓名 年龄 绩点 学费");
printf(" %d %s %d %.1f %.2f\n",pstIS->nStuNo,pstIS->szName,pstIS->nAge,pstIS->fGPA,pstIS->fTuition);
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
while ((nJudge != 1) && (nJudge != 0))
{
puts("输入有误,请重新输入。");
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
}
if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
}
void InfoAlter (void)
{
int nAN;
int nSN;
size_t nJudge;
int nX,nY;
STSI * pstIS;
STSI * pstPa;
pstPa = pstIS = ReadData();
puts("请输入学号,返回上级菜单请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nSN);
if (nSN == 0)
{
return;
}
system("cls");
if (pstIS->pNext == NULL)
{
puts("没有学生信息,按任意键返回上级菜单");
getchar();
return;
}
while (pstIS->nStuNo != nSN)
{
if((pstIS->pNext) == NULL)
{
puts("请输入正确的学号");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nSN);
pstIS = pstPa;
system("cls");
}
else
{
pstIS = pstIS->pNext;
}
}
puts("学号 姓名 年龄 绩点 学费");
printf(" %d %s %d %.1f %.2f\n",pstIS->nStuNo,pstIS->szName,pstIS->nAge,pstIS->fGPA,pstIS->fTuition);
puts("确认修改请按1,返回上级菜单请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nAN);
if (nAN == 0)
{
return;
}
system("cls");
if (nAN)
{
puts("全部修改请按0,修改姓名请按1");
puts("修改年龄请按2,修改绩点请按3");
puts("修改学费请按4");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
switch (nJudge)
{
case 0:
puts("请输入姓名");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%s",pstIS->szName);
system("cls");
for (nJudge = 0; nJudge < strlen(pstIS->szName); nJudge++)
{
while (isascii((pstIS->szName)[nJudge]))
{
puts("名字输入出错,请输入中文名");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%s",pstIS->szName);
system("cls");
nJudge = 0;
}
}
puts("请输入年龄");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pstIS->nAge));
system("cls");
puts("请输入绩点");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pstIS->fGPA));
system("cls");
puts("请输入学费");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pstIS->fTuition));
system("cls");
puts("输入成功");
break;
case 1:
puts("请输入姓名");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%s",pstIS->szName);
break;
case 2:
puts("请输入年龄");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pstIS->nAge));
break;
case 3:
puts("请输入绩点");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pstIS->fGPA));
break;
case 4:
puts("请输入学费");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%f",&(pstIS->fTuition));
break;
}
}
system("cls");
WriteDataCover(pstPa);
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
while ((nJudge != 1) && (nJudge != 0))
{
puts("输入有误,请重新输入。");
puts("重新进入学生信息管理系统请按1,退出请按0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
}
if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
}
void InfoDelete()
{
int nID;
int nSN;
int nJudge;
int nX,nY;
FILE * pFile;
STSI * pstHead;
STSI * pstCurrent;
STSI * pstPrev;
puts("删除全部学生信息请按1,删除单个学生信息请按2,返回上级菜单请按0");
while (1)
{
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nID);
system("cls");
if (nID == 1)
{
pFile = fopen(gszFilename,"wb");
fclose(pFile);
puts("已删除全部学生信息,返回上级菜单请按1,退出请按0");
while (1)
{
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
if (nJudge == 1)
{
return;
}
else if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
else
{
puts("输入有误,请重新输入");
puts("返回上级菜单请按,退出请按0");
}
}
}
if (nID == 2)
{
puts("请输入学号");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nSN);//cID = NumberControl();
system("cls");
pstHead = pstCurrent = ReadData();
pstPrev = pstCurrent->pNext;
while (pstPrev != NULL)
{
if (pstCurrent->nStuNo == nSN)
{
WriteDataCover(pstPrev);
}
else if (pstPrev->nStuNo == nSN)
{
pstCurrent->pNext = pstPrev->pNext;
WriteDataCover(pstHead);
}
pstCurrent = pstCurrent->pNext;
pstPrev = pstPrev->pNext;
}
if (pstPrev == NULL)
{
pFile = fopen(gszFilename,"wb");
fclose(pFile);
}
puts("删除单个学生信息成功");
puts("返回上级菜单请按1,退出请按0");
while (1)
{
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nJudge);
system("cls");
if (nJudge == 1)
{
return;
}
else if (nJudge == 0)
{
exit(EXIT_SUCCESS);
}
else
{
puts("输入有误,请重新输入");
puts("返回上级菜单请按,退出请按0");
}
}
}
if (nID == 0)
{
return;
}
else
{
puts("输入有误,请重新输入");
puts("删除全部学生信息请按1,删除单个学生信息请按2,返回上级菜单请按0");
}
}
}
int main (void)
{
int nType;
int nX,nY;
while(1)
{
system("cls");
MonPrint();
printf("请输入数字1-6 ");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&nType);
system("cls");
switch (nType)
{
case 1 :
InfoPrint();
break;
case 2 :
InfoAdd();
break;
case 3 :
InfoSerch();
break;
case 4 :
InfoAlter();
break;
case 5 :
InfoDelete();
break;
case 6 :
exit(EXIT_SUCCESS);
default :
puts("输入有误,请重按任意健重新输入.");
system("pasue");
break;
}
}
return 0;
}
-
C语言链表 简单学生成绩管理系统含注释
2018-10-17 21:16:30学生成绩管理系统,用C语言中链表写的 -
用C语言链表编写学生成绩管理系统
2018-09-06 20:04:12一、设计题目:学生成绩管理系统 二、目的与要求 每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生... -
学生信息管理系统的C语言链表实现
2020-07-14 18:11:59printf("| 欢迎使用学生信息管理系统!请输入您想要进行的操作的指令 |\n"); printf("| |\n"); printf("*----------------------------------------------------------------*\n"); printf("| 1.添加学生信息 |... -
数据结构c语言链表实现学生管理系统.cpp
2020-03-10 10:38:12这个是利用C语言实现学生管理系统,主要是应用了链表,结构体知识,经过调试并作为课程设计作业,如果您正在学习这部分内容,或许对你有用。 -
C语言链表-学生管理系统
2020-12-04 08:34:54链表: 1)链表分类: 表头:只有指针域 节点:指针域+数据域 指针域指向下一节点数据域,指针域为下一节点的首地址 即ptemp->next=pnew 表尾:指针域+数据域 指针域指向为NUL 2)链表是链式存贮结构,在空间内... -
C语言链表学生管理系统模板
2021-01-26 19:17:25void SystemMenu() { printf("\t\t\t\t**********欢迎使用学生信息管理系统**********\n"); printf("\t\t\t\t____________________________________________\n"); printf("\t\t\t\t请选择您所需的服务选项\n"); ... -
C语言链表学生信息管理系统
2018-03-30 22:20:13//创建链表,输入学生信息 struct student *create() { struct student *head; struct student *pl; n=0; pl=(struct student*) malloc(LEN); printf("\n\n\t请输入学生的信息: \n"); printf("\t输入格式为:... -
C语言链表实现学生信息管理系统
2020-06-03 08:27:58大一做的这个程序,主要是链表的增删查改操作。.../////////////////学生信息管理系统 /////////////////存入、查找、删除、修改、输出学生信息,学生信息包括姓名,性别,年龄,学号,电话; typedef -
《学生证管理系统》C语言链表版(附带图文讲解)
2019-05-14 22:01:24《学生证管理系统》作为一个用来统计学生的学生证信息的应用软件,在对其进行需求分析的过程中,需要充分考虑系统的可用性和有效性,联系实际应用,从而得到合理的需求分析的结论。 1.系统概述 该软件主要用来给... -
c语言链表学生管理系统相关问题请教
2015-11-29 14:52:34要做课程作业了,就学着网上模版写了个链表学生信息系统,但我想分成老师-学生两个登陆模块。思路如下: mian()中设置ahead结构体指针。 老师模块完成学生成绩的增删改查排序(借鉴网上的已完成)。。老师模块结束后... -
C语言链表实现简单的学生信息管理系统
2019-07-02 11:56:48第一次写博客,今天学习了C语言链表的相关知识,自己实现了一个很简单的学生成绩管理系统,同时也温习了一下多文件编程,想和大家分享一下自己从中的一些经验和感受。 头文件 //List.h 包含结构体的定义 #... -
c语言链表的增删改查--简单的学生管理系统
2020-07-09 19:08:24c语言链表的增删改查–简单的学生管理系统 利用链表写成的学生管理系统,有增删改查基础操作。 注释大都写在代码里 下面展示全部代码,因为英语不是很好,大部分英语语句为拼凑而成。 链表的控制界面都写在user_face... -
C语言链表学习--学生信息管理系统
2019-08-16 15:55:17最近学习了下C语言的链表,为了更加熟悉链表,就随意写了个学生信息管理系统(写的很垃圾,大佬勿喷) 本人最近刚好有点时间,就去看了看c语言的链表,看到网上各种c语言的学生信息管理代码,确实都是现成的东西,... -
学生管理系统(C语言综合链表实现)
2019-04-08 14:39:39学生管理系统(C语言综合链表实现) 题目:定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项,分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,其中:学号、姓名、... -
C语言链表项目-学生信息管理系统
2020-07-01 12:14:25单向链表基本操作+对文件的基本操作 使用说明 请先建好一个.txt文件并记下路径名,文件可以为空,也可以预先存好数据 建议创建一个空文件,通过程序来向文件中存数据。 手动去文件中存数据需要严格按照格式。 ...
-
Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)
-
Typora+PicGo-(SM.MS/七牛/Gitee)实现自动上传图片
-
利用tcpdump抓取udp数据
-
2021 PHP租车系统 毕业设计 毕设源码 源代码使用教程
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
small_progams-源码
-
以有效改进项目管理技能的十个过程
-
esc_re-源码
-
Glasterfs 分布式网络文件系统
-
华为1+X认证——网络系统建设与运维(初级)
-
深究字符编码的奥秘,与乱码说再见
-
最短路径问题的复习整理(2)
-
数学建模-房屋最佳保温层厚度问题
-
PPT大神之路高清教程
-
IDEA-Map集合概述、子类、常用方法
-
Jsplumb从入门到实战
-
基于Qt的LibVLC开发教程
-
MDK SVN 代码托管
-
11 | 怎么给字符串字段加索引?
-
LVS三种模式配置及优点缺点比较