C语言使用单链表的学生成绩管理系统
2013-07-08 00:22
1221 查看
本系统的代码冗余还是蛮多的,其实可以再精简很多,可是后期自己懒得改了,这里强调一个思想----代码复用,这会大大节约自己的编程量,也可以使自己看待一个向项目有宏观的思想。关于这个系统,是采用单链表和文件写的,单链表在数据录入部分已经按照学号排好序,后期的数据输出也即很方便看待数据,其实可以在后期进行排序,我的想法有两种,①创建一个结构体数组,把数据重新导入结构体数组中,再进行快速排序;②使用指针,不过这对数据结构以及指针的要求很高,基础不扎实还是不要乱试;不然会出现大量改也不知道怎么改的bug;关于文件部分
其实文件有大量的方法写入 比如二进制也可以 ,写起来都差不多 不过从文件读出来 和 写进去文件 的部分得多种方法试试 这样就可以加强基础了。 关于指针 这是头疼的问题 总之不能乱用 。关于链表的部分 看数据结构的基础了 这是数据结构最简单的部分 不过得细心和足够的耐心。
系统的图片如下:
以下为本系统的部分源码内含注释:
感想:
其实自己的基础还不怎么扎实,最近帮忙做这个东西也让自己复习了一遍,无论怎么说,好歹我也是ACM的,数据结构可不能忘。写完这个系统,感觉面向过程的程序实在是有点繁琐,可能是自己接触面向对象多了吧 不过C依旧强大。有什么不懂的读友可评论,会及时评论。------Dash
其实文件有大量的方法写入 比如二进制也可以 ,写起来都差不多 不过从文件读出来 和 写进去文件 的部分得多种方法试试 这样就可以加强基础了。 关于指针 这是头疼的问题 总之不能乱用 。关于链表的部分 看数据结构的基础了 这是数据结构最简单的部分 不过得细心和足够的耐心。
系统的图片如下:
以下为本系统的部分源码内含注释:
# include <stdio.h> # include <conio.h> # include <malloc.h> # include <stdlib.h> struct Node { int num; int age; char name[30]; char sex[5]; int sroce; struct Node *next; }; Node *head; Node *Load() //载入文件中的数据到结构体中 { FILE *fp; Node *cur,*p,*q; cur = NULL; fp = fopen("Student","r"); //以"r"形式打开student的文件 if(fp == NULL) //如果文件不存在 { fp = fopen("Student","w"); //创立一个student文件 fclose(fp); //关闭文件 return cur; //返回链表中,存入head } p=(struct Node*)malloc(sizeof(struct Node)); //如果存在 if(fread(p,sizeof(struct Node),1,fp) != 1) //判断文件中的数据 是否只有1个 return cur; //是就返回 cur = p; while(!feof(fp)) //否则就开始从文件中读数据 { q = p; p = (struct Node *)malloc(sizeof(struct Node)); fread(p,sizeof(struct Node),1,fp); q -> next = p; } q -> next = NULL; free(p); //释放指针p所指向的内存空间 fclose(fp); return cur; //返回链表中,存入head } void Interface() //主界面函数 { system( "cls" ); //清屏函数 printf("\n\n\n"); printf("\t-----------------------------------------------------\n"); printf("\t-----------------------------------------------------\n"); printf("\t|| ||\n"); printf("\t|| 首页 ||\n"); printf("\t|| ||\n"); printf("\t-----------------------------------------------------\n"); printf("\t-----------------------------------------------------\n"); printf("\t|| ||\n"); printf("\t|| ||\n"); printf("\t|| ◆1.输入 ||\n"); printf("\t|| ◆2.查询 ||\n"); printf("\t|| ◆3.显示 ||\n"); printf("\t|| ◆4.删除 ||\n"); printf("\t|| ◆5.修改 ||\n"); printf("\t|| ◆0.退出 ||\n"); printf("\t|| ||\n"); printf("\t|| ||\n"); printf("\t-----------------------------------------------------\n"); printf("\t-----------------------------------------------------\n"); return ; } void Add_Data() //输入学生信息函数 { Node *p,*q; Node *cur; char flag = '0'; cur = (struct Node *)malloc(sizeof(struct Node)); //创建新结点 while(flag == '0') //输入学生信息 { q = p = head; cur ->next = NULL; printf("请输入姓名:"); scanf("%s",&cur -> name); printf("请输入学号:"); scanf("%d",&cur -> num); printf("请输入年龄 :"); scanf("%d",&cur -> age); printf("请输入性别 :"); scanf("%s",&cur -> sex); printf("请输入成绩 :"); scanf("%d",&cur -> sroce); fflush(stdin); //用来清空输入缓存,以便不影响后面输入的东西 if(head == NULL)head = cur; //如果输入的节点是头一个,就把头结点head等于cur else //否则在头结点后面加入结点 { while(p -> num < cur -> num && p -> next != NULL) //按学号建立链表 { q = p; //P节点 p = p -> next; //P后一接点 } if(p -> num > cur -> num) //找到head表中的学号大于新建学生的学号,插入学生信息 { if(p == head) //如果为头结点,前插 { cur -> next = head; head = cur; } else { q -> next = cur; cur -> next = p; } } else //找不到比新建学生更大的学号,放在链表最好面 p -> next = cur; } cur = (struct Node *)malloc(sizeof(struct Node)); //又创建新结点,为下次输入准备 printf("输入结束,是否继续输入,按 0 键继续,否者退出.\n"); flag = getch(); //0就继续输入,其他键就返回主界面 fflush(stdin); //清除缓冲区的数据 } free(cur); return ; } void Find_Data() //按学号查找学生信息 { Node *p; int num; char flag = '0'; bool mark; while(flag == '0') { printf("请输入要查找的学生的学号: "); scanf("%d",&num); fflush(stdin); mark = false; //标记是否找到学生 p = head; //将头结点head赋值与p if(head == NULL) //如果链表中头结点为空,则查询错误 { printf("查询失败.\n"); printf("不存在此学生信息.\n"); return ; } else //否则开始查询 { while(p != NULL) { if(p -> num == num) //找到学号为num的学生就输出 { printf("你要查找的学生信息如下:\n"); printf("学号 :%d\n",p -> num); printf("名字 :%s\n",p -> name); printf("性别 :%s\n",p -> sex); printf("年龄 :%d\n",p -> age); printf("成绩 :%d\n",p -> sroce); mark = true; break; } else p = p -> next; } } if(!mark) //没找到学生与num匹配的学生 { printf("查询失败.\n"); printf("不存在此学生信息.\n"); return ; } printf("查找结束,是否继续查找,按 0 键继续,否者退出.\n"); flag = getch(); fflush(stdin); } return ; } void Show_Data() //显示学生信息 { Node *p; p = head; char flag; while(p != NULL) { printf("你要查找的学生信息如下:\n"); printf("学号 :%d\n",p -> num); printf("名字 :%s\n",p -> name); printf("性别 :%s\n",p -> sex); printf("年龄 :%d\n",p -> age); printf("成绩 :%d\n",p -> sroce); p = p -> next; } printf("输出结束,请按任意键继续.\n"); flag = getch(); fflush(stdin); return ; } void Delete_Data() //按学号删除学生信息 { Node *p,*q,*cur; int num; char flag = '0'; bool mark; while(flag == '0') { printf("请输入要删除的学生的学号: "); scanf("%d",&num); fflush(stdin); mark = false; //标记是否找到学生 p = q = head; //将头结点head赋值与p if(head == NULL) //如果链表中头结点为空,则查询错误 { printf("删除失败.\n"); printf("不存在此学生信息.\n"); return ; } else //否则开始查询 { while(p != NULL) { if(p -> num == num) //找到学号为num的学生就输出 { if(head == p) head = p -> next; else q -> next = p -> next; mark = true; break; } else { q = p; p = p -> next; } } } if(!mark) //没找到学生与num匹配的学生 { printf("删除失败.\n"); printf("不存在学生信息.\n"); return ; } printf("删除结束,按 0 键继续,否者退出.\n"); flag = getch(); fflush(stdin); } return ; } void Update_date() //修改学生信息 { Node *p; int num; char flag = '0'; bool mark; while(flag == '0') { printf("请输入要修改的学生的学号: "); scanf("%d",&num); fflush(stdin); mark = false; //标记是否找到学生 p = head; //将头结点head赋值与p if(head == NULL) //如果链表中头结点为空,则查询错误 { printf("修改失败.\n"); printf("不存在此学生信息.\n"); return ; } else //否则开始查询 { while(p != NULL) { if(p -> num == num) //找到学号为num的学生就输出 { printf("请输入姓名:"); scanf("%s",&p -> name); printf("请输入学号:"); scanf("%d",&p -> num); printf("请输入年龄 :"); scanf("%d",&p -> age); printf("请输入性别 :"); scanf("%s",&p -> sex); printf("请输入成绩 :"); scanf("%d",&p -> sroce); fflush(stdin); //用来清空输入缓存,以便不影响后面输入的东西 mark = true; break; } else p = p -> next; } } if(!mark) //没找到学生与num匹配的学生 { printf("修改失败.\n"); printf("不存在此学生信息.\n"); return ; } printf("修改结束,按 0 键继续,否者退出.\n"); flag = getch(); fflush(stdin); } return ; } void Solve_Data() //将处理后的链表中的信息存进文件 { FILE *fp; fp = fopen("Student","w"); //以"w"形式打开student文件 while(head != NULL) { fwrite(head,sizeof(struct Node),1,fp); //写进student文件 head = head -> next; } fclose(fp); return ; } void List() //菜单选择函数 { char x; bool flag = true; while(flag) { Interface(); //菜单函数 x = getch(); system( "cls" ); fflush(stdin); switch(x) { case '1': Add_Data(); break; case '2': Find_Data(); break; case '3': Show_Data(); break; case '4': Delete_Data(); break; case '5': Update_date(); break; default: Solve_Data(); flag=false; break; } } return ; } int main() { head = Load(); List(); return 0; }
感想:
其实自己的基础还不怎么扎实,最近帮忙做这个东西也让自己复习了一遍,无论怎么说,好歹我也是ACM的,数据结构可不能忘。写完这个系统,感觉面向过程的程序实在是有点繁琐,可能是自己接触面向对象多了吧 不过C依旧强大。有什么不懂的读友可评论,会及时评论。------Dash
相关文章推荐
- C语言链表实现的简易学生成绩管理系统
- 学生成绩管理系统课程设计(C语言,链表实现)
- 学生成绩管理系统--C语言:使用curses函数库和MySQL数据库
- 使用C++结合文件操作和链表实现学生成绩管理系统
- <C语言>使用一个二维数组实现学生姓名管理系统,要求不能使用链表
- 学生成绩管理系统 C语言链表版本
- 链表《5》使用链表实现学生成绩管理系统
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息
- C语言使用链表实现学生信息管理系统
- 用C++写的学生成绩管理系统(比较简单的没有使用链表,只是用到了类和对象)
- c语言制作的学生成绩管理系统 加链表
- 学生成绩学籍管理系统(链表)
- 《C语言编写 学生成绩管理系统》
- C语言学生信息管理系统(动态链表版559)【不会】
- 《C语言编写 学生成绩管理系统》
- C语言利用结构体数组实现学生成绩管理系统
- [置顶] c语言文件读取 学生成绩管理系统的设计与实现
- C语言实现学生信息管理系统(单链表)
- 基于链表的学生成绩管理系统
- (C语言)利用结构体数组制作学生成绩管理系统