数据结构(c语言)之学生信息管理系统
程序思维导图
代码表示(代码参考:长春大学-牛言涛老师)
如有错误请指出欢迎交流
#include<stdio.h>
#include<malloc.h>//动态存储分配函数头文件
#include<math.h>//包含数学函数的文件
#include<string.h>//一个和字符串处理相关的头文件
#include<process.h>//包含用于和宏指令的作用声明与螺纹和过程一起使用的C标头文件
#define ERROR 0 //宏定义
#define OK 1
#define over -2
#define ListInitSize 20
#define ListIncrement 5
#define Namelen 8
#define Majorlen 20
#define INIT_N 3
typedef int Status; //自定义类型语句 Status i 等价于 int i
typedef char StatusC; typedef struct{
StatusC number[]; //学号:081330385
StatusC name[Namelen+]; //姓名:郭靖
StatusC gender; //性别:男
StatusC telephone[]; //电话:15890377853
StatusC qqNumber[]; //QQ:485284320
StatusC major[Majorlen+];//专业:计算机科学与技术 }Student;//类型为学生 typedef struct{ Student *elem; //存储空间的基址
Status length; //当前长度
Status listsize; //当前分配的存储容量(以sizeof(Studnet)为单位)
}Sqlist; //信息初始化,构造一个空的线性表
Status InitList(Sqlist &l){ l.elem=(Student *)malloc(ListInitSize*sizeof(Student));
//申请LIST_INIT_SIZE个大小为整型(Student)字节的空间,
//把空间指针给L.elem
if(!l.elem)exit(over);
//判断l中的数据成员elem是否为0,为0即执行if下面语句
l.length=;
//赋值
l.listsize=ListInitSize;
return OK;
} //插入记录
Status ListInsert(Sqlist &l,Status i,Student s){ Student *newbase;
if(i<||i>l.length+)
return ERROR;//i值不合法
if(l.length>=l.listsize)//当前存储空间已经满了,增加分配空间
{
newbase=(Student*)realloc(l.elem,(
ListInitSize+ListIncrement)*(sizeof(Student)));
/*
先释放原来L.elem所指内存区域,并按照
(LIST_INIT_SIZE+ListIncrement)*sizeof(Student)
的大小重新分配空间其中ListIncrement为20,
同时将原有数据从头到尾拷贝到新分配的内存区域,
并返回该内存区域的首地址。即重新分配存储器块。
*/
if(!newbase)exit(over);
// 判断newbase是否为0,为0即执行if下面语句
l.elem=newbase;
//赋值
l.listsize+=ListIncrement;
}
for(Status j=l.length;j>=i;j--)
l.elem[j]=l.elem[j-];
//赋值
l.elem[i-]=s;
l.length++;
return OK;
} //打印输出线性表中的信息
void print(Sqlist &l){ if(l.length==)
printf("空表,无任何记录!\n\n");
printf("学号 姓名 性别 手机号 QQ 专业\n");
printf("******************************\n"); for(Status i=;i<l.length;i++){ printf("%-10s %-8s",l.elem[i].number,l.elem[i].name);
//输出学好 姓名
if(l.elem[i].gender=='m')printf("男");
//判断语句
else printf("女");
printf("%14s %9s %10s",l.elem[i].telephone,l.elem[i].qqNumber,l.elem[i].major);
//输出电话号码 qq号码 专业
printf("\n");
}
printf("------------------------------\n");
} //打印输出线性表中指定学生的信息
void print_single(Student s){ printf("学号 姓名 性别 手机号 QQ 专业\n");
printf("******************************\n");
printf("%-10s %-8s",s.number,s.name);
//输出学好 姓名
if(s.gender=='m')printf("男");
else printf("女");
printf("%14s %9s %10s",s.telephone,s.qqNumber,s.major);
//输出电话号码 qq号码 专业
printf("\n");
printf("------------------------------\n");
} //接受键盘输入信息
void ScanIn(Sqlist &l){ StatusC a[];
Status i;
printf("\t 您选择插入一条学生记录\n");
do{
Student s;
printf("\t 请输入学号:");
scanf("%s",s.number);
printf("\t 请输入姓名(<=%d个字符):",Namelen);
scanf("%s",s.name); printf("\t 请输入电话号码:");
scanf("%s",s.telephone);
printf("\t 请输入QQ号:");
scanf("%s",s.qqNumber);
printf("\t 请输入专业:");
scanf("%s",s.major);
printf("\t 请输入性别:(m:男,f:女)");
scanf("%*c%c",&s.gender);
printf("\t 请输入你要插入的位置(1<=i<=%d):",l.length+);
scanf("%d",&i);
ListInsert(l,i,s);
printf("\t 您想继续插入记录吗?(y/n)\t");
scanf("%s",a); }while(strcmp(a,"y")==||strcmp(a,"Y")==);
//调用strcmp函数
} //删除通讯中第i条记录
Status ListDelete(Sqlist &l,int i,Student s){ Status j;
if(i<||i>l.length)return ERROR;
//判断
else{ s=l.elem[i-];
for(j=i;j<=l.length;j++)l.elem[j-]=l.elem[j];
l.length--;
return OK;
}
} //按照升序排列
void SortorderAscend(Sqlist &l){ system("cls");//清空前面的信息之输出下面信息
Student s;
for(Status i=;i<l.length-;i++)
for(Status j=;j<l.length-i-;j++){
//循环比较大小 ,排列顺序
if(strcmp(l.elem[j].number,l.elem[j+].number)>){
//strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;
//用来比较字符串(区分大小写)
s=l.elem[j];
l.elem[j]=l.elem[j+];
l.elem[j+]=s;
}
}
printf("*****按照升序排序成功!******\n\n");
} //判断姓名是否相同
Status EqualName(Student s1,Student s2){ if(strcmp(s1.name,s2.name))return ERROR;
//比较两个字符串是否相同
else return OK;
} //定位某个元素
int LocateElem(Sqlist l,Student s,Status(*compare)(Student,Student)) { Status i=;
Student *p=l.elem;
while(i<=l.length&&!compare(*p++,s))i++;
if(i<=l.length)
return i;
//定位元素的位置
else
return ;
} //按照姓名查找
void searchName(Sqlist l,Status(*equal)(Student,Student)){ system("cls");//清空前面的信息之输出下面信息
Student s;
Status j;
StatusC a[];
do{
printf("\t 请输入你要查找的学生的姓名:");
scanf("%s",s.name);
j=LocateElem(l,s,equal);
if(!j)printf("没有查找到你所要查找的学生记录!\n");
else print_single(l.elem[j-]);
printf("\t 您想继续查找吗?(y/n)\t");
scanf("%s",a); }while(strcmp(a,"y")==||strcmp(a,"Y")==);
} //修改姓名
void ModifyName(Sqlist &l,Status(*equal)(Student,Student)){ system("cls");//清空前面的信息之输出下面信息
Student s;
Status j;
StatusC number_new[],name_new[Namelen+],gender_new,
telephone_new[],qqNumber_new[],major_new[Majorlen+];
StatusC a[];
do{
printf("\t 请输入你要更改的学生的姓名:");
scanf("%s",s.name);
j=LocateElem(l,s,equal);
if(!j)printf("没有查找到你所要查找的学生记录!\n");
else { print_single(l.elem[j-]);
Status isOrNo=;
printf("\n修改通讯录:1 学号,2 姓名,3 性别,4 电话,5 QQ号,6 专业, 0 取消\n") ;
while(isOrNo){ printf("--------------------------\n");
printf("请选择需要修改的属性序号:");
scanf("%d",&isOrNo);
switch(isOrNo){ case :
printf("请输入更改后的学号:");
scanf("%s",number_new);
strcpy(l.elem[j-].number,number_new);
break;
case :
printf("请输入更改后的姓名:");
scanf("%s",name_new);
strcpy(l.elem[j-].name,name_new);
break;
case :
printf("请输入更改后的性别:");
scanf("%*c%c",&l.elem[j-].gender);
break;
case :
printf("请输入更改后的电话:");
scanf("%s",telephone_new);
strcpy(l.elem[j-].telephone,telephone_new);
break;
case :
printf("请输入更改后的QQ号:");
scanf("%s",qqNumber_new);
strcpy(l.elem[j-].qqNumber,qqNumber_new);
break;
case :
printf("请输入更改后的专业:");
scanf("%s",major_new);
strcpy(l.elem[j-].major,major_new);
break; }
}
printf("\n****更改后该条记录变为****\n\n");
print_single(l.elem[j-]);
}
printf("您想继续修改吗?(y/n)\t");
scanf("%s",a);
}while(strcmp(a,"y")==||strcmp(a,"Y")==);
} //主菜单
void menu(){ system("cls");//清空前面的信息之输出下面信息
printf("\t*********************\n");
printf("\t**欢迎使用学生通讯录管理系统**\n");
printf("\t*********************\n");
printf("\t**请选择如下操作,输入序号**\n");
printf("\t 0:退出系统\n");
printf("\t 1:将初始学生记录插入线性表\n");
printf("\t 2:显示线性表中所有内容\n");
printf("\t 3:向线性表中增加一条记录\n");
printf("\t 4:从线性表中删除一条记录\n");
printf("\t 5:按照姓名修改一条记录\n");
printf("\t 6:按照姓名查找一条记录\n");
printf("\t 7:按照学号升序排列通讯录\n");
printf("\t*********************\n");
printf("\t 您想进行什么操作,请选择\n"); } //主函数
int main(){ Sqlist l;
Status i,select; //select 变量标记用户的选择
if(InitList(l)!=OK)printf("\n\t线性表初始化失败!\n");
Student s[INIT_N]={{"","马东",'m',"","" ,"机械工程"},
{"","李东",'m',"","" ,"软件工程"},
{"","马西",'f',"","" ,"通讯工程"}};
menu();
scanf("%d",&select);
while(select){
switch(select){
case : //初始化数据
system("cls");//清空前面的信息之输出下面信息
for(i=;i<INIT_N;i++){ if(ListInsert(l,i+,s[i])!=OK)
printf("\t初始化数据失败!\n"); }
if(i==INIT_N)printf("\t初始化数据成功\n\n");
print(l);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://显示线性表中的记录
system("cls");//清空前面的信息之输出下面信息
print(l);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://接受键盘输入,并把记录插入到线性表中
system("cls");//清空前面的信息之输出下面信息
ScanIn(l);
system("cls");//清空前面的信息之输出下面信息
print(l);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://删除通讯录中某条信息
system("cls");//清空前面的信息之输出下面信息
Student *s2=l.elem;
print(l);
printf("您想删除第几条通讯录1~%d:\n",l.length);
int k;
scanf("%d",&k);
Student de_s;
system("cls");//清空前面的信息之输出下面信息
if(ListDelete(l,k,de_s)==OK){
print(l);
printf("\t%-6s 已经删除成功!\n",de_s.name);
}
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://按照姓名修改一条记录
ModifyName(l,EqualName);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://按照姓名查找记录
searchName(l,EqualName);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://按照学好升序排列
system("cls");//清空前面的信息之输出下面信息
SortorderAscend(l);
print(l);
printf("\n输入0:退出,输入11:返回主菜单\t");
break;
case ://返回主菜单
menu();
break;
}
scanf("%d",&select);
}
return ; }
结果显示
主菜单
将初始学生信息插入线性表中
读取线性表中信息
插入一条学生信息
删除一条学生信息
更改学生信息
查找学生信息
将学生信息排序
数据结构(c语言)之学生信息管理系统的更多相关文章
- C语言练习-学生信息管理系统
题目要求: 学生信息管理系统struct studentInfo{ int id; char name[128]; int age; char sex; int c_score; int cpp_sc ...
- C语言版本学生信息管理系统
仍然有一些小bug,后续会发布OC完善版的图书馆管理系统,欢迎批评指正. #include <stdio.h> void menu_choose(); typedef struct { i ...
- 【转载】C语言综合实验1—学生信息管理系统
http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html 实验题目:学生信息管理系统 实验要求:用户可以选择1-7可以分别进行学生信息的 ...
- C语言小练习之学生信息管理系统
C语言小练习之学生信息管理系统 main.c文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- 大一C语言结课设计之《学生信息管理系统》
第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h ...
- 学生信息管理系统(c语言)
①注意: 程序中使用了sleep()函数.system()函数 关于 sleep() 函数 sleep() 函数的头文件和用法会因环境的不同而有所不同. 具体见-sleep()函数功能及用法 关于sy ...
- 学生信息管理系统(C语言)
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student ...
- 基于数组或链表的学生信息管理系统(小学期C语言程序实训)
1.基于数组的学生信息管理系统 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理.定义学生信息的结构体类型,包括:学号.姓名.专业.班级.3门成绩. 实验要求: (1) main函数:以菜 ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)
上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...
- C语言实现---学生成绩管理系统
C语言实现了学生成绩管理系统,可以进行学生成绩的增加,删除,更新,查询,计算和展示. 完整代码如下: #include<stdio.h> #include<stdlib.h> ...
随机推荐
- Linux命令:ps,netstat,top
ps ps用于查看当前运行的进程.如果想查看动态的进程信息,可以使用top命令.查看详细命令帮助使用man ps. ps最常用的选项组合就是ps aux: # ps aux USER PID %CPU ...
- .Net 面试题 3C(CTS,CLS,CLR)
1.CTS(Common Type System)通用类型系统 CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展.任何以.NET平台作为目标的语言必须建立它的数 ...
- MySQL基础笔记
一.登录参数 -D 打开指定数据库 -h 服务器名称 -p 密码 -P 端口 -u 用户名 -V 输出版本信息并退出 --prompt 提示符 mysql> ,或者登陆后 用prompt命令 提 ...
- python处理命令行参数
直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...
- MySQL触发器-条件触发器语法
文章为作者原创,未经许可,禁止转载. -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单
系列目录 不知不觉到20讲,真是漫长的日子,可惜最近工作挺忙,要不可以有更多的时间来更新,多谢大家的一路支持.如果你觉得好,记得帮我点击推荐^-^ 我们在之前已经插入一些真实数据,其中包含了一个用户和 ...
- .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统
一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文 ...
- 计算机程序的思维逻辑 (30) - 剖析StringBuilder
上节介绍了String,提到如果字符串修改操作比较频繁,应该采用StringBuilder和StringBuffer类,这两个类的方法基本是完全一样的,它们的实现代码也几乎一样,唯一的不同就在于,St ...
- Sublime Text 3 全程详细图文原创教程(持续更新中。。。)
一. 前言 使用Sublime Text 也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知.最初也是不知道从何下手,满世界地查找资料,但能查阅到的资料,苦于它们的零碎.片面,不够系统 ...