C语言小程序-基于链表的学生信息管理
程序支持增加、查询、删除、存盘和读取操作
一 程序定义和函数声明
头文件studentsys.h定义如下
/* student management system by list */
#ifndef _StudentSys_H
#define _StudentSys_H #define MAX 25 /* lenth of name string */
typedef struct _Grade Grade;;
typedef struct StdNode Std;;
typedef struct ListNode *List;
全局结构体定义
/* 6 courses */
struct _Grade{
int Chinese;
int Math;
int English;
int Programming;
int Physic;
int Geology;
}; /* student info */
struct StdNode {
int Id; /* student id */
char name[MAX];/* student name */
Grade grades; /* student grades */
}; struct ListNode {
Std info;
List next;
};
函数声明
/* 1->Add 2->Find 3->Del 4->Brows 5->Store
6->Read 7->DelAll 8->Cls 9->Quit */ 功能选择键
int AddStd( List L, int Id, char *name, Grade grades );
/* flag:0 by id, 1 by name */
int FindStd(List L, int flag, int Id ,char *name);
int DeleteStd( List L, int Id );
void PrintInfo( List L );
void PrintAll( List L );
int StoreInfo( List L );
List ReadInfo( );
void DestoryInfo( List L );
int IsRepeat( List L, int Id );
void selectInfo();
二 源文件studentsys.c
主体部分,由while循环下的switch分支进行功能选择
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "studentsys.h" int main(void)
{
List L; /* Head Node */
L = (List)malloc(sizeof( struct ListNode ));
L->next = NULL; int i, flag; /* flag做为查找方式标志, 0由Id, 1由姓名进行搜索 */
int option, Id = ; /* option选择功能, init info */
char name[MAX]= " ";
Grade grades; printf(" Starting \n");
printf(" Student Management system, ver:0.101 \n");
printf("******************************************************\n");
printf(" 学生管理系统\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
selectInfo();
while ( ) {
scanf("%d", &option);
switch ( option ) {
case : printf("Please in put id, name, six grades:\n");
scanf("%d %s", &Id, name);
scanf("%d %d %d %d %d %d", &grades.Chinese, &grades.Math,
&grades.English, &grades.Programming,&grades.Physic,
&grades.Geology );
if ( AddStd( L, Id, name, grades ) == ) {
printf("Added student.\n");
} else {
printf("Sorry, can't add student\n");
}
break; case : printf("select method: 0 by Id, 1 by name\n");
scanf("%d", &flag);
printf("Please in put id, name\n");
scanf("%d %s", &Id, name); /* notice & */
if ( FindStd( L, flag, Id, name ) == ) {
printf("found student\n");
} else {
printf("sorry, can't found student\n");
}
break; case : printf("Which id you want to del: ");
scanf("%d", &Id);
if ( DeleteStd( L, Id ) ) {
printf("Successfully Delete!\n");
} else {
printf(" Not found!\n");
}
break; case : PrintAll( L );
break; case : if ( StoreInfo( L ) ) {
printf("Write successfulluy!\n");
} else {
printf("Failed to read!\n");
}
break; case : L = ReadInfo( );
break;
case : DestoryInfo( L );
break;
case : system("cls");
selectInfo();
break;
case : exit();
break;
default: printf("error!请重新输入!\n");
}
}
return ;
}
函数主体,由简单的链表的插入、删除和遍历
int AddStd( List L, int Id, char *name, Grade grades )
{
List Head = L;
List Cur;
if( IsRepeat( L, Id) == ) {
printf(" Id repeat!!!\n");
return ;
}
/* 链表的插入 */
Cur = (List)malloc(sizeof( struct ListNode ));
if ( Cur != NULL ) {
Cur->info.Id = Id;
strcpy( Cur->info.name, name);
Cur->info.grades.Chinese = grades.Chinese;
Cur->info.grades.Math = grades.Math;
Cur->info.grades.English = grades.English;
Cur->info.grades.Programming = grades.Programming;
Cur->info.grades.Physic = grades.Physic;
Cur->info.grades.Geology = grades.Geology; Cur->next = Head->next;
Head->next = Cur; return ;
} else {
printf("Failed to malloc!\n");
return ;
}
} int FindStd( List L, int flag, int Id , char *name )
{
List Cur = L->next;
while ( Cur != NULL ) {
if( flag == ) {
if ( strcmp( name, Cur->info.name ) == ) {
PrintInfo(Cur);
break;
}
} else if ( flag == ) {
if ( Cur->info.Id == Id ) {
PrintInfo(Cur);
break;
}
}
Cur = Cur->next;
}
if ( Cur == NULL ){
return ;
} else {
return ;
}
} int DeleteStd( List L, int Id )
{
List Pre = L;
List Cur = Pre->next; if( L->next == NULL ) {
printf("Empty Node!\n");
return ;
} else {
while ( Cur != NULL ) {
if ( Cur->info.Id == Id ) {
/* 找到对应编号 */
Pre->next = Cur->next;
free(Cur);
break;
}
Pre = Cur;
Cur = Cur->next;
}
if ( Cur == NULL ) {
return ;
} else {
return ;
}
} /* 1 else */
} void PrintInfo( List L )
{
List Cur = L;
if ( Cur != NULL ) {
printf("ID: %d ", Cur->info.Id);
printf("Name: %s\n", Cur->info.name);
printf("Chinese :%d ", Cur->info.grades.Chinese);
printf("Math :%d ", Cur->info.grades.Math);
printf("English :%d\n", Cur->info.grades.English);
printf("Programming:%d ", Cur->info.grades.Programming);
printf("Physic :%d ", Cur->info.grades.Physic);
printf("Geology :%d\n", Cur->info.grades.Geology);
}
} void PrintAll( List L )
{
List Cur = L->next;
int i = ;
while ( Cur != NULL ) {
i++;
printf("%d-->Student ", i);
PrintInfo( Cur );
Cur = Cur->next;
}
}
void DestoryInfo( List L )
{
List Cur, Tmp;
Cur = L->next;
while ( Cur != NULL ) {
Tmp = Cur->next;
free( Cur );
Cur = Tmp;
}
L->next = NULL;
printf("删除所有学生信息成功!\n");
} int IsRepeat( List L, int Id )
{
List Cur = L->next;
int flag = ;
while ( Cur != NULL ) {
if ( Cur->info.Id == Id ) {
flag = ;
break;
}
Cur = Cur->next;
}
return flag;
} void selectInfo()
{
printf("Stumansys 请选择:\n");
printf("(1)---增加学生 (2)---查询学生 (3)---删除学生 \n");
printf("(4)---查看全部 (5)---记录存盘 (6)---读取信息\n");
printf("(7)---删除所有 (8)---清除屏幕 (9)---退出系统\n");
}
文件读写操作
1. 链表写入文件,每次写一个结构体,直到链表尾。
2. 文件读取,使用feof(fp)函数判断是否达到文件流尾,否则读取一个结构体,并尾插入链表。
int StoreInfo( List L )
{
FILE *fp = fopen("student.data", "w");
List H = L->next;
const int size = ;
int ret = -; /* default */ if ( fp == NULL ) {
printf("Failed to open file!\n");
} else if( H == NULL ) {
printf("Empty student info!\n");
} else {
/* write list into fp */
while ( H != NULL ) {
ret = fwrite( H, sizeof(H->info), size, fp );
H = H->next;
}
ret = ;
}
fclose( fp );
return ret;
} List ReadInfo( )
{
int i = ; /* count */
List L, P, tmp;
P = L = (List)malloc( sizeof(struct ListNode) );
FILE *fp = fopen("student.data", "r"); if ( fp == NULL ) {
printf("Failed to read file!\n");
return NULL;
}
/* 假如文件为空,检查文件结束符 feof在到达文件流尾返回非零值 */
if ( feof(fp) != ) {
tmp = (List)malloc( sizeof(struct ListNode) );
fread( tmp, sizeof(tmp->info), , fp);
if( feof(fp) ) {
printf("读取失败!文件为空!\n");
free(tmp);
}
return(NULL);
} while ( feof(fp) == ) {
tmp = (List)malloc( sizeof(struct ListNode) );
fread( tmp, sizeof(tmp->info), , fp);
printf("正在读取第%d个数据\n", ++i);
if ( feof(fp) != ) {
/* reached end */
free(tmp); break;
}
/* List tail insert */
P->next = tmp;
P = tmp;
P->next = NULL;
}
fclose(fp);
printf("Read successfulluy!\n");
return L;
}

C语言小程序-基于链表的学生信息管理的更多相关文章
- 通过反汇编C语言小程序学习Liunx汇编语言
大家好! 我是来自山东师范大学的吴乐. 今天在<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- 小程序基于疼讯qcloud的nodejs开发服务器部署
腾讯,疼讯,很疼. 请慎重看腾讯给出的文档,最好做一个笔记. 我只能说我能力有限,在腾讯云小程序的文档中跳了n天. 最后还是觉得记录下来,以防止我的cpu过载给烧了. 此文档是对<小程序 ...
- c语言小程序以及java生成注释文档方法
c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...
- C语言小程序——推箱子(窄字符和宽字符)
C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...
- 微信小程序-基于canvas画画涂鸦
代码地址如下:http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 微信小程序基于swiper组件的tab切换
代码地址如下:http://www.demodashi.com/demo/14010.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 微信小程序基于scroll-view实现锚点定位
代码地址如下:http://www.demodashi.com/demo/14009.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- Linux C语言小程序
Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...
随机推荐
- 快速替换dll命名空间 z
Step1:使用ildasm将代码反编译成il中间语言. 名字存贮为你想要的名字. Step2:用记事本打开il文件全局替换命名空间. Step3:使用ilasm将il文件编译成dll 按下回车即可生 ...
- ARC中用代码检测一个对象有没有释放掉
ARC中用代码检测一个对象有没有释放掉 你试过在ARC中用代码检测对象有没有释放掉这种事情呢?即使你想过肯定也不知道怎么去实现,因为,这里会用到一个你基本上没怎么接触过的类:NSHashTable. ...
- 【转】Java中的String,StringBuilder,StringBuffer三者的区别
https://www.cnblogs.com/su-feng/p/6659064.html 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及String ...
- 工作好搭档(一):松林 SL-B3 人体工学椅
本人从事码农这行职业,已经整整十年零九天,十年一觉如旧梦,仿佛昨天还在SARS. 2008年,我累到腰痛,脖子痛,怎么休息也不见好,去中医院检查,医生诊断,坐的太久,坐姿不对,运动少,轻度颈椎,腰肌劳 ...
- python UI自动化实战记录六:页面1用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...
- JavaScript的DOM_操作表格
一.使用HTML标签创建表格 thead.tfoot.caption标签在一个表格中只能有一个 tbody.tr.td.th标签在一个表格中可以有N个 <table border=&quo ...
- SpringBoot实战(十二)之集成kisso
关于kisso介绍,大家可以参考官方文档或者是我的博客:https://www.cnblogs.com/youcong/p/9794735.html 一.导入maven依赖 <project x ...
- Axure RP 8 学习记录
一.Axure RP 简介 Axure是一个专业的快速原型设计工具.能够快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档. 二.Axure RP下载 1.下载安装包 https://w ...
- python Web开发之 WSGI & uwsgi & uWSGI
首先弄清下面几个概念: WSGI 全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server ...
- HDBS之应用代码优化
一.目录结构树 总体概述 代码检测工具sonar HDBS代码优化 总结开发注意点 二.总体概述 进入现在这家公司我的第一个任务就是对HDBS进行代码质量优化.HDBS可能大家不是很了解,现在给大家简 ...