基于双向循环链表实现的学生管理系统,包括初始化,插入,删除,查抄,保存,自动按照姓名排序功能,退出并保存功能。

实现思想是将程序的各个部分划分为三个层次。主函数为界面层,即客户端层;其中后缀为Student的一般是某个功能的调度函数,属于逻辑层的内容;在调度函数之下有相应的被调度的函数,也就是相应功能的实现函数,一般后缀名为Node,意思就是这个函数直接操作链表中的结点,可以简单的划分为实现层;

这样分层实现呢有利于代码维护和个功能之间对包含或者重叠功能的直接调用,从而提高代码重用度,而降低代码冗余,并且最低成的实现函数也可以用于别的项目中对双向循环链表的操作。

本次学生管理系统的实现是先用一个初始化文件函数将一些学生信息先存入磁盘中,然后用初始化函数读出到链表中进行各种操作,保存功能和退出功能可以将链表中操作了的内容,也就是内存中的内容写入磁盘中,其中对文件的操作采用二进制读写文件,读写对象为学生结构体。

以下是代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning (disable:4996)
//定义学生信息结点
struct SNode{char name[50];char sex;int math;int chinese;int history;
};
typedef struct SNode Student;
//定义链表结点
struct Node{Student student;struct Node *left;struct Node *right;
};
typedef struct Node Node;
void init(void);//初始化一个学生信息文件
Node * createList();//创建双向循环链表
void initializationList(Node *head);//初始化链表
int insertStudent(Node *head);//菜单中插入功能调度函数
int insertList(Node *head, Student newStudent);//插入功能实现函数,头插法插入结点
void searchStudent(Node *head);//查找功能的调度函数
Node *searchNode(Node *head, char *name);//查找功能的实现函数
int  deleteStudent(Node *head);//菜单中删除功能的调度函数
int deleteNode(Node *head, char *name);//删除功能的实现函数
int lenList(Node *head);//求双向循环链表的长度
void sortList(Node *head, int len);//依据姓名字符串的排序函数
int saveToFile(Node *head);//将存放在内存中的学生数据写回磁盘文件中
void printList(Node * head);//打印链表内容int main(void)
{
//    init();//若没有学生信息文件,可打开此函数,初始化完成后可关闭此函数,//可在本函数内修改初始学生信息printf("学生管理系统\n");printf("目前所有学生:\n");Node *head = createList();//创建双向循环链表管理学生initializationList(head);//从文件中读取初始学生信息初始化链表while (1){int len = lenList(head);sortList(head, len);//输出之前按照名字排序system("CLS");//调用系统清屏函数printf("学生管理系统\n");printf("目前所有学生:\n");printList(head);//打印链表中的信息printf("1->添加\t2->删除\t3->查找4->保存5->退出\n");int select = 0;scanf("%d",&select);switch (select){case 1:insertStudent(head);system("CLS");printf("学生管理系统\n");printf("目前所有学生:\n");printList(head);break;case 2:deleteStudent(head);system("CLS");printf("学生管理系统\n");printf("目前所有学生:\n");printList(head);break;case 3:searchStudent(head);printf("请按下任意键返回主菜单\n");getchar();break;case 4:saveToFile(head);printf("保存成功\n");system("CLS");printf("学生管理系统\n");printf("目前所有学生:\n");initializationList(head);printList(head);break;case 5:printf("程序即将退出\n");saveToFile(head);printf("保存成功\n");exit(1);break;}}return 0;
}
//创建初始化文件
void init(void)
{FILE *fop = fopen("D:/Test/classTest/student.txt", "wb");Student students[5] = { { "zhao", 'm', 90, 100, 100 },{ "qian", 'w', 60, 60, 60 },{ "sun", 'm', 85, 85, 90 },{ "li", 'm', 60, 100, 100 },{ "zhou", 'w', 100, 100, 100 } };fwrite(students, sizeof(Student), 5, fop);fclose(fop);
}
//创建双向循环链表
Node * createList()
{Node *head = (Node *)malloc(sizeof(Node));if (head){head->left = head;head->right = head;return head;}elsereturn NULL;
}
//初始化链表
void initializationList(Node *head)
{FILE *fip = fopen("D:/Test/classTest/student.txt", "rb");Student newStudent;while (fread(&newStudent, sizeof(Student), 1, fip) != 0){insertList(head, newStudent);}
}
//菜单中插入功能调度函数
int insertStudent(Node *head)
{Student newStudent;printf("请输入学生信息:\n");printf("姓名:");scanf("%s",&newStudent.name);getchar();printf("性别:");newStudent.sex=getchar();printf("数学:");scanf("%d",&newStudent.math);printf("语文:");scanf("%d",&newStudent.chinese);printf("历史:");scanf("%d",&newStudent.history);insertList(head, newStudent);}
//结点插入
//插入功能实现函数,头插法插入
int insertList(Node *head, Student data)
{Node *newNode = (Node *)malloc(sizeof(Node));if (newNode){newNode->student = data;newNode->left = head;newNode->right = head->right;head->right = newNode;newNode->right->left = newNode;return 1;}elsereturn -1;
}
//菜单中删除功能的调度函数
int  deleteStudent(Node *head)
{printf("请输入需要删除的学生的姓名:");char name[50];scanf("%s",name);getchar();int flag=deleteNode(head, name);if (flag)printf("删除成功\n");elseprintf("删除失败\n");return flag;
}
//删除功能的实现函数
int deleteNode(Node *head, char *name)
{Node *searchStudent = searchNode(head, name);if (searchStudent){searchStudent->left->right = searchStudent->right;searchStudent->right->left = searchStudent->left;free(searchStudent);return 1;}return 0;
}
//查找功能的调度函数
void searchStudent(Node *head)
{printf("请输入需要删除的学生的姓名:");char name[50];scanf("%s", name);getchar();Node *result = searchNode(head, name);if (result){printf("姓名\t性别\t数学\t语文\t历史\n");printf("%s\t%c\t%d\t%d\t%d\n", result->student.name, result->student.sex,result ->student.math, result->student.chinese, result->student.history);}elseprintf("没有找到该学生\n");
}
//查找功能的实现函数
Node *searchNode(Node *head, char *name)
{Node *left = head;Node *right = head;do{left = left->left;right = right->right;if (strcmp(left->student.name, name)==0)return left;if (strcmp(right->student.name, name)==0)return right;} while (left != right && left->left != right);return NULL;
}
//依据姓名字符串的排序函数
void sortList(Node *head, int len)
{Node *p, *q, *max, *temp;Student t;p = head->right;q = p->right;int i = 0, j = 0;for (i = 0; i < len - 1; i++){if (p == head)break;max = p;q = p;for (j = i; j < len; j++){if (q == head)break;if (strcmp(max->student.name, q->student.name)>0)max = q;q = q->right;}if (max != p){t = max->student;max->student = p->student;p->student = t;}p = p->right;}
}
//求双向循环链表的长度
int lenList(Node *head)
{Node *p = head;int len = 0;while (p->right != head){len++;p = p->right;}return len;
}
//打印链表内容
void printList(Node * head)
{Node *p = head->right;while (p != head){printf("%s\t%c\t%d\t%d\t%d\n", p->student.name, p->student.sex,p->student.math, p->student.chinese, p->student.history);p = p->right;}
}
//将存放在内存中的学生数据写回磁盘文件中
int saveToFile(Node *head)
{FILE *fop = fopen("D:/Test/classTest/student.txt", "wb");Node *p = head->right;while (p != head){fwrite(&p->student,sizeof(Student), 1, fop);p = p->right;}return 1;
}

文章转载自 开源中国社区[https://www.oschina.net]

学生管理系统——基于双向循环链表相关推荐

  1. php做一个学生管理系统,基于php技术的学生管理系统实现方法

    标签和路由Route::get("dologin","Admin\\login@dologin")连接控制器loginController并加载dologin( ...

  2. 基于html5的学生管理系统,基于HTML5的学生信息管理系统的设计与实现

    [摘要] 目前学校依然使用人工对学生信息进行管理,没有相关的学生信息管理系统,虽然学校硬件和网络设施已经提高,但对网络的利用最多也就是用QQ来传送文件及信息,效率低下,这种状态急需改变. 基于这种现状 ...

  3. 以xml html编写的的学生管理系统,基于.NET和XML的学生中心数据库管理系统的研究与实现...

    摘要: 随着互联网的蓬勃发展,传统的HTML数据交换方式已经越来越满足不了日益增长的数据交换的需求.XML(可扩展标记语言)作为一种极有前途的互联网上数据交换的新模式,已越来越多的受到业内人士的关注. ...

  4. 基于jsp servlet javabean的学生管理系统

    日期:2019/10/24 该学生管理系统基于jsp+servlet+javabean,使用MVC模式,是一个很基础的学生管理系统,由于这是本学期的课程大作业,所以现在还没有完全写完,这篇博文会根据进 ...

  5. 基于Android的学生管理系统的设计与实现

    一.选题理论及实际意义 目前, 无线通信技术日臻成熟.在此背景下,移动通信技术快速发展,信息传递方式产生了革命性的变化,信息传递的质量.效率大大提高,为人们的生活提供了极大便利.随着WiFi及4G无线 ...

  6. C语言基于链表的学生管理系统,超详细

    基于链表的学生管理系统 基于链表的学生管理系统 前言 功能 整体思路 Function.h Function.cpp 主文件StudentManageSystem.cpp 各函数详细说明 保存 读取 ...

  7. C语言学生成绩管理系统——检查学号姓名,双向循环链表

    设计一个学生管理系统,存储学生的基本信息和成绩.我是用C语言写的,最近在学习C++,回过头看,C++的特性可以减少很多冗余的代码. 功能 增删查改以及排序,数据可保存到磁盘,每次初始化的时候读取文件信 ...

  8. 基于BootStrap,FortAweSome,Ajax的学生管理系统

    一. 基于BootStrap,FortAweSome,Ajax的学生管理系统代码部分 1.students.html <1>html页面文件 <!DOCTYPE html> & ...

  9. 用python设计学生管理系统_基于python和tkinter实现的一个简单的学生信息管理系统...

    一个简单的学生信息管理系统基于python和tkinter 1.需求分析1.大学生信息管理系统使用tkinter接口创建一个窗口.使界面更漂亮.2. 实现与数据库的连接,教师和学生的信息可以保存或读取 ...

最新文章

  1. 北大BBS2008年毕业生晒工资
  2. Rabbitmq-理论基础
  3. python学习笔记 -- reduce合并减少
  4. SetTimer的使用问题
  5. SIC插槽,WSIC插槽,XSIC插槽
  6. php 垃圾回收机制----写时复制和引用计数
  7. ASP.NET vs MVC vs WebForms
  8. CCPC网络赛前一周的充电计划
  9. data.name.toLowerCase() is not a function问题
  10. scrum回顾_[PM]敏捷开发之Scrum总结
  11. 最近,我在Spring的BeanUtils踩了不少坑
  12. R语言——决策树模型
  13. web页面的回流,认识与避免
  14. Windows编程入门
  15. 计算机打表格图,怎么把电脑整个表格截屏,表格太长,还有部(怎么把excle表格截图)...
  16. python算法练习——解空间的穷举搜索与Google方程式
  17. element-ui的基本使用(一)
  18. office_professional_plus_2010安装
  19. SQL Server高级编程
  20. 操作系统课程设计-二级文件系统,Windows平台版本,c语言

热门文章

  1. jarsigner签名过程
  2. iphone4基本操作
  3. v8学习笔记(二) Handle和HandleScope机制
  4. latex的资料ftp
  5. OGC和Khronos建立合作关系,共同推动地理信息和3D图形社群的交互操作
  6. CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别
  7. 在乌班图中将py3设置为默认解释器
  8. Java Spring MVC
  9. 2010502260926_《avolon》
  10. CI框架源码阅读笔记4 引导文件CodeIgniter.php