#基于linux系统的学生管理系统
作为c语言学习阶段的最终检验,一个管理系统的好坏能比较直接的反应初学者的基础扎实与否。
一个完整且经用的学生管理系统的组成无非就是以下几个方面的知识点
(作者自我介绍:在校大学生一枚,暑假学习了将近一个月的c语言,想作一篇自我总结,一开始成就感还是有的,(后面肯定是挫折感了)看着一个能运行并履行功能的程序,有一种创造者的欣喜,第一次做有很多不足的地方,犯了许多错误,虽然最终不太会影响程序的运行,但存在隐患,文章末尾总结)
知识点介绍:
1:C语言的基础部分,顺序结构,循环结构,选择结构
2:C语言的数据结构部分:结构体,单链表,双链表,内核链表
3:文件操作:如何打开文件,写入文件。
我们再来看一看学生管理系统的基本要求
1:能够储存信息到文件中(最重要的要求)
2:能够对学生信息进行增删改查以及排序等功能
3:能对至少两类用户使用,如老师以及学生
4:程序无问题,以上要求都能实现
程序介绍:
/*
-
程序名:简易学生管理系统
-
功能 :对学生的增删改查
-
负责人:王瑜
*/
#ifndef DLIST_H
#define DLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//功能:安全检查宏
//@x:要检查的变量
//@opt:操作符: ==,<,>
//@y:要检查的值; if(NULL == p) { printf("p is null\n"); return -1; }
//@z:返回值 SYSERR(NULL,==,p,"p is null",-1);
// if(index < 0) { printf("index must >= 0",-1); }
// SYSERR(index,<,0,"index must >= 0",-1);
//
// 如果函数定义是: void fun(int *p); 没有返回值
// if(NULL == p)
// {
// printf("p is null\n");
// return;
// }
// SYSERR(NULL,==,p,"p is null\n",);
#define SYSERR(x, opt, y, message, z) \
if (x opt y) \
{
\
printf("%s %d %s : error %s\n", __FILE__, __LINE__, __func__, message); \
return z; \
}
/*链表节点定义:*/
typedef struct node
{
struct node *before; //前向指针
void *data; //数据指针,链表更通用
struct node *after; //后向指针
} node_t; //node_t是struct node的类型别名
typedef struct student
{
char name[16];
int cla;
int sno;
int age;
char sex[8];
int score;
int chinese;
int math;
int total;
char admin[16];
int rank;
} stu_t;
//功能:创建链表
//参数:无
//返回值:已创建链表的头节点地址
node_t *create_dlist();
//功能:向双循环链表头部插入数据
//@head:要插入的链表头节点
//@data:要插入链表的数据
//@size:数据的字节大小
//返回值为插入成功与否: 0表示成功,非0表示失败
int insert_hdlist(node_t *head, void *data, int size);
//功能:向双向循环链表尾部插入数据
int insert_tdlist(node_t *head, void *data, int size);
//功能:按值从链表中查找某节点
//@head:从哪个链表去查找
//@data:要查找的数据
//@cmpfun:比较函数指针,在调用时必须使用具体的函数名:返回类型必须为int,且有两个参数,
//两个参数必须为void *型
//返回值:如果查找到返回此节点,如果未找到返回NULL;
typedef int (*cmpfun_t)(void *data1, void *data2); //比较函数指针类型
node_t *find_vdlist(node_t *head, void *data, cmpfun_t cmpfun);
//功能:用于遍历显示链表中所有节点的函数
//@head:要显示的链表
//@showfun:显示函数指针,要怎么显示,在调用时必须使用具体的函数名:返回类型必须为void,有1个参数,
//这个参数的类型必须为void *
typedef void (*showfun_t)(void *data); //显示函数指针类型
void show_hdlist(node_t *head, showfun_t showfun);
void show_tdlist(node_t *head, showfun_t showfun);
//功能:删除第一个数据节点
//@head:要从哪个链表删除
int delete_hdlist(node_t *head);
//功能:删除链表尾部节点
int delete_tdlist(node_t *head);
//功能:按值删除,只会删除指定值第一次出现的节点
//@head:要从哪个链表删除
//@cmpfun:比较函数指针
//返回值:删除成功返回0,失败返回非0值
int delete_vdlist(node_t *head, void *data, cmpfun_t cmpfun);
//功能:对链表按指定方式排序
//@head:对哪个链表进行排序,
//@cmpfun:比较函数指针,排序的方式,函数指针
//返回值:排序成功返回0,失败返回非0值
int maopao_sortdlist(node_t *head, cmpfun_t cmpfun);
//功能:销毁链表,销毁后head为NULL
//返回值:销毁成功返回0,失败返回非0
int destroy_dlist(node_t **head);
int length_dlist(node_t *head);
/*功能:添加学生信息到链表
* 返回值:void
* 参数:head头结点
*/
void add_info(node_t *head);
/*
*参数:head
*功能:实现显示信息
*/
void show_info(node_t *head); //调用显示函数show_fun以及遍历查找
void find_info(node_t *head); //查找函数
//node_t *find_t(node_t *head,void *data,cmpfun_t cmpfun);
void modify_info(node_t *head); //修改学生函数入口
void del_info(node_t *head); //删除信息函数入口
void lodastu(node_t *head); //加载文本信息到链表
int savestu(node_t *head); //保存信息到文本
void stu_modify_info(node_t *head, stu_t stu1); //修改函数
#endif`
***接下来就是.c文件
`#include <stdio.h>***
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "dlist.h"
#define SYSERR(x, opt, y, message, z) \
if (x opt y) \
{
\
printf("%s %d %s : error %s\n", __FILE__, __LINE__, __func__, message); \
return z; \
}
typedef void (*showfun_t)(void *data);
typedef int (*cmpfun_t)(void *data1, void *data2);
//功能:创建链表
//参数:无
//返回值:已创建链表的头节点地址
node_t *create_dlist()
{
node_t *head = (node_t *)malloc(sizeof(node_t));
SYSERR(NULL, ==, head, "head is null", NULL);
sleep(1);
head->before = head->after = head;
head->data = NULL;
return head;
}
//功能:向双循环链表头部插入数据
//@head:要插入的链表头节点
//@data:要插入链表的数据
//@size:数据的字节大小
//返回值为插入成功与否: 0表示成功,非0表示失败
int insert_hdlist(node_t *head, void *data, int size)
{
SYSERR(NULL, ==, head, "head is null", -1);
SYSERR(NULL, ==, data, "data is null", -1);
node_t *newnode = (node_t *)malloc(sizeof(node_t));
SYSERR(NULL, ==, newnode, "malloc error", -2);
newnode->data = malloc(size);
SYSERR(NULL, ==, newnode->data, "malloc error", -2);
memcpy(newnode->data, data, size);
newnode->before = head;
newnode->after = head->after;
head->after->before = newnode;
head->after = newnode;
return 0;
}
//功能:用于遍历显示链表中所有节点的函数
//@head:要显示的链表
//@showfun:显示函数指针,要怎么显示,在调用时必须使用具体的函数名:返回类型必须为void,有1个参数,
//这个参数的类型必须为void *
void show_hdlist(node_t *head, showfun_t showfun)
{
SYSERR(NULL, ==, head, "head is null", );
node_t *temp = head->after;
while (temp != head && (temp->data != NULL))
{
showfun(temp->data);
temp = temp->after;
}
printf("\n");
sleep(1);
}
void show_tdlist(node_t *head, showfun_t showfun)
{
SYSERR(NULL, ==, head, "head is null", );
node_t *temp = head->before;
while (temp != head && (temp->data != NULL))
{
showfun(temp->data