1、头文件:sjjg.h
- /*************************************************
- *版权所有 (C)2017.Hujunchao
- *
- *文件名称:sjjg.h
- *文件标识:无
- *内容摘要:头文件,包含所用函数的定义等
- *其他说明:无
- *当前版本:V1.0
- *作 者:胡俊超
- *完成时间:20171121
- *
- *修改记录1:
- *修改时间:20171119
- *版本号:V1.0
- *修改人:Hujunchao
- *修改内容:创建
- *
- *修改记录3:
- *修改时间:20171120
- *版本号:V1.0
- *修改人:Hujunchao
- *修改内容:完善各个功能
- *
- *修改记录2:
- *修改时间:20171121
- *版本号:V1.0
- *修改人:Hujunchao
- *修改内容:增加文件功能,并完善之前功能
- **************************************************/
#ifndef SJJG_H_INCLUDED
#define SJJG_H_INCLUDED
#define SJJ sizeof(LNode)
typedef struct LNode
{
//用于存放学生信息节点
int stuNumber;
int age;
char chass[50];
char name[20];
struct LNode *next;
}LNode,*Link;
Link createLink(Link L); //创建链表
void printList(Link L); //显示学生信息
void inserStu(Link L,Link NEW); //插入学生信息
Link nsearch(Link L,Link p); //找到当前地址元素的前一元素的地址
//***删除
void deletecjj(Link L,int i); //从学生信息中删除第i个学生的信息
int deleName(Link L, char n[]); //按姓名删除学生信息
int deleNum(Link L,int n); //按学号删除学生信息
void deteStu(Link L); //删除学生菜单
//***查询
void searchMenu(Link L); //查询菜单
void searchWay1(Link L); //按查询的学生的学号寻找
void searchWay2(Link L); //按查询的学生姓名寻找
int searchName(Link L,char n[]);//按学号查询学生信息
int searchNum(Link L,int n); //按姓名查找学生信息
void alterStu(Link L); //按学号更新学生信息
int count(Link L); //统计结点个数
int mainMenu(); //主菜单程序
void AddStu(Link L); //添加学生信息
void saveStuDentFile(Link L);//保存文件
#endif
2、源文件txjg.cpp
- /*************************************************
- *版权所有 (C)2017.Hujunchao
- *
- *文件名称:txjg.cpp
- *文件标识:无
- *内容摘要:源文件,包含各个功能的详细代码
- *其他说明:无
- *当前版本:V1.0
- *作 者:胡俊超
- *完成时间:20171121
- **************************************************/
-
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include"sjjg.h" //************************************************************************************************** ********************************* Link createLink(Link L) //创建链表结点 { //初始化定义函数,声明变量 int temp; int n; temp=count(L); //利用temp所求的结点个数进行插入 printf("录入学生个数为:%d\n",temp); Link p; //创建新链表(节点) int num=1; int stuNumber; char name[20]; int age; char chass[50]; printf("请输入想要录入(添加)学生的个数\n"); scanf("%5d",&n); while(n>0) //开始输出学生信息 { printf("请输入学生的信息:学号,姓名,年龄,班级\n"); //************************************************************************************************** ********************** printf("学号输入负数结束!\n"); //用于结束系统 printf("请输入学号%d: ",num); scanf("%11d",&stuNumber); if(stuNumber<0) //判断学号输入是否正确 { break; } printf("请输入姓名%d: ",num); getchar(); gets(name); printf("请输入年龄%d: ",num); scanf("%d",&age); printf("请输入班级%d: ",num); getchar(); gets(chass); if(stuNumber>=0) //插入 { p=(Link)malloc(SJJ); //新建节点 p->stuNumber=stuNumber; strcpy(p->chass,chass); p->age=age; strcpy(p->name,name); inserStu(L,p); //插入新结点(通过inserstu函数进行插入) num++; } n--; //判断 } return (L); } /********************************************************* * 功能描述: 创建学生信息 * 输入描述: L * 输出描述: 输入n表示要输入的学生个数,在输出学生信息,若出现学号为负则要求再次重新输入。 * 返回值 : 以建立的头链表 * 其它说明: 存在对学号正负的判断,于更新插入函数相关联。 ************************************************************/ //************************************************************************************************** *********************************** void printList(Link L) //显示L的学生信息 { printf("\n*********************学号,姓名,年龄,班级**************************\n"); int n=1; Link p=L; //建立新节点 int temp; temp=count(L); //结点个数: if(temp==0) //判断学生管理系统中有无信息 printf("系统中没有元素\n"); else while(p->next!=NULL) { printf(" 学生个数 :%d 学号 :%d",n,p->next->stuNumber); printf(" 姓名 : %s 年龄 :%d 班级 : %s \n",p->next->name,p->next->age,p->next->chass); p=p->next; n++; } printf("\n***********************************************************************************\n"); return; } /********************************************************* * 功能描述: 显示的学生信息 * 输入描述: L * 输出描述: 无 * 返回值 : 无 * 其它说明: 利用count函数进行判断 ************************************************************/ //************************************************************************************************** ******************************** void inserStu(Link L,Link NEW) //插入学生信息 { Link p=L->next; // 建立新节点 while(p!=NULL && NEW->stuNumber>=p->stuNumber) { if(p->stuNumber==NEW->stuNumber) { printf("重复输入学号,输入失败!");return ; } p=p->next; } //确定NEW的插入位置 if(p==NULL) { p=nsearch(L,p); //寻找当前地址,防止覆盖 NEW->next=NULL; p->next=NEW; //若为空节点,直接插入 } else { p=nsearch(L,p); //寻找当前地址,防止覆盖 NEW->next=p->next; p->next=NEW; } } Link nsearch(Link L,Link p) //找到当前地址元素的前一元素的地址 { if(L->next==NULL) //如果为空节点则返回直接进行插入 return(L); Link nsearch1=L; while(nsearch1->next!=p) { nsearch1=nsearch1->next; } return (nsearch1); } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: NEW由search函数返回值得出 * 输出描述: 通过传递参数NEW进行查找 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //********************************************************************************************************************** void deletecjj(Link L,int i) //从学生信息中删除第i个学生的信息 { Link p=L; int j=0; while(p->next && j<i-1) { p=p->next; j++; } if(!(p->next)) //判断是否为空 { printf("第%d个学生删除失败\n",i); return; } Link q; q=p->next; //释放q节点 p->next=q->next; free(q); } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: 用i进行判断循环,L到要删除的节点 * 输出描述: 无 * 返回值 : 无 * 其它说明: 无 ************************************************************/ int deleName(Link L, char n[]) //按姓名删除学生信息 { int flag=0; Link p; p=L->next; int seat =1; if(L->next==NULL) //判断是否为空 { printf("\n删除提示:系统中没有元素,删除失败!\n"); deteStu(L); //返回选项菜单重新选择 } else { while(p!=NULL) { if(!strcmp(p->name,n))//比较名字是否匹配 { flag=1; printf("%s",p->name); p=p->next; deletecjj(L,seat);//删除第i个学生的信息 } else { p=p->next ; seat++; } if(flag) //判断 printf("被删除了\n"); } } return flag; } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: n 为要查找的人名 * 输出描述: 通过deteStu(删除菜单)判断通过用姓名来删除对应节点,利用deletecjj函数删除信息。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ int deleNum(Link L,int n) //按学号删除学生信息 { int flag=0; Link p=L->next ; int seat=1; if(L->next==NULL) { printf("\n删除提示:系统中没有元素,删除失败!\n");deteStu( L); } else { while(p!=NULL) { if(p->stuNumber==n) //调用deleteElem { flag=1; printf("%d",p->stuNumber); p=p->next; deletecjj(L,seat); break; } p=p->next ; seat++; } if(flag) //判断 { printf("被删除了\n");} else{ printf("没有找到学生信息\n"); } } return flag; } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: n 为要查找的学号 * 输出描述: 通过deteStu(删除菜单)判断通过用学号来删除对应节点,利用deletecjj函数删除信息。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ void deteStu(Link L) //删除学生菜单 { int flag=0,way,n; printf("\n************************ 删除菜单 ********************\n"); printf("\n选择操作方式************* 1:按学号 ********************\n"); printf(" ************* 2:按姓名 ********************\n"); printf(" ************* 3: 返回主菜单 *********************\n"); printf("\n请输入删除方式:"); scanf("%d",&way); if(way<1||way>3){deteStu(L);} switch (way) { case 1: { printf("请输入要删除的学生学号:"); scanf("%d",&n); flag= deleNum(L,n); break; } case 2: { char n[20]; printf("请输入要删除的学生姓名:"); char temp1=getchar(); gets(n); flag=deleName(L,n); break; } case 3:break; } if(flag) { printf("删除成功!\n"); deteStu(L); //循环 } } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: L * 输出描述: 通过way来判断所选择的删除方式。 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //************************************************************************************************** int searchName(Link L,char n[]) //按学号查询学生信息 { Link p=L->next; int flag=0; //要查找的学生和学生信息中的姓名是否匹配 (1为匹配) int seat=1; //查找的是学生数,同时判断 if(L->next==NULL||L==NULL) //判断是否为空表 printf("没有学生信息\n"); else { while(p!=NULL) { if(!strcmp(p->name,n))//比较要查找的姓名是否和当前学生信息所指的姓名匹配 { flag=1; //输入姓名匹配 printf("要查找的是第%d位学生\n",seat); printf("学号是:%d 名字:%s 年龄:%d 班级:%s\n",p->stuNumber,p->name,p->age,p->chass); } p=p->next ; seat++; } } return flag; } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: n 为要查找的姓名 * 输出描述: 通过searchMenu(查找菜单)判断通过用姓名来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ int searchNum(Link L,int n) //按学号查找学生信息 { int flag=0;//标志要查找的学生和管理信息系统中的学号是否匹配 Link p=L->next; //新建节点 int seat=1; //判断学生的个数 if(L->next==NULL) printf("没有学生信息\n"); else { while(p!=NULL) { if(n<1) { printf("学号输入负数,请重新输入!\n"); searchWay1(L); } if(p->stuNumber==n)//比较要查找的学号是否和当前学生信息所指的学号匹配 { flag=1; //输入学号匹配 printf("要查找的是第%d位学生\n",seat); printf("学号是:%d 名字:%s 年龄:%d 班级:%s \n",p->stuNumber,p->name,p->age,p->chass); } p=p->next ; seat++; } } return flag; } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: n 为要查找的学号 * 输出描述: 通过searchMenu(查找菜单)判断通过用学号来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ void searchWay1(Link L) //按查询的学生的学号寻找 { int searchWay=0;//控制跳出循环,再次选择查询方式 if(searchWay==0) { printf("请输入要查询的学生的学号:\n"); int n; int flag; scanf("%d",&n); flag=searchNum(L, n); if(flag==0) printf("查找失败!\n"); searchWay=1; } if(searchWay==1) { searchMenu(L); } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L; * 输出描述: 通过searchMenu(查找菜单)判断通过用姓名(searchName函数)来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: searchWay控制跳出循环,再次选择查询方式。 ************************************************************/ void searchWay2(Link L) //按查询的学生姓名寻找 { int searchWay=0;//控制跳出循环,再次选择查询方式(继续循环) if(searchWay==0) { char n[20]; int flag; printf("请输入要查询的学生姓名\n"); char temp2; temp2=getchar(); gets(n); flag=searchName(L,n); if(flag==0) printf("查找失败!\n"); searchWay=1; } if(searchWay==1) { searchMenu(L); } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L; * 输出描述: 通过searchMenu(查找菜单)判断通过用学号(searchNum函数)来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: searchWay控制跳出循环,再次选择查询方式。 利用flag表示是否查找失败。 ************************************************************/ void searchMenu(Link L) //查询菜单 { printf(" ********************** 查询菜单 ************************************** \n"); printf(" *** 1 输入学生学号查询学生信息 \n"); printf(" *** 2 输入学生姓名查询学生信息 \n"); printf(" *** 3 返回上级菜单 \n"); printf(" ********************** 查询菜单 ************************************** \n"); printf("请选择1-3: "); int menu; scanf("%d",&menu); switch(menu) { case 1:searchWay1(L);break; case 2:searchWay2(L);break; case 3:break;//跳回主菜单程序 } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L * 输出描述: 通过menu来判断所选择的删除方式。 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //************************************************************************************************** void alterStu(Link L)//按学号更新学生信息 { int n; printf("请输入要修改的学生学号:"); scanf("%d",&n); Link p; p=L->next; if(p==NULL) { printf("学生管理系统没有学生信息!"); } while(p!=NULL) //循环查找学生信息,如果找到该学号则进入循环体更改学生信息 { if(p->stuNumber==n) { int num=1, stuNumber,age; char telenum[50]; char name[20]; char chass[50]; printf("***********************更改学生信息*****************************************\n"); printf("请输入学号%d: ",num); printf("请输入学生的姓名,年龄和班级\n"); scanf("%d",&stuNumber); printf("请输入姓名%d: ",num); getchar(); gets(name); printf("请输入年龄%d: ",num); scanf("%d",&age); printf("请输入班级%d: ",num); getchar(); gets(chass); p->age=age; //赋值 p->stuNumber=stuNumber; strcpy(p->name,name); strcpy(p->chass,chass); printf("***********************更改学生信息完毕*****************************************\n"); } p=p->next; } } /********************************************************* * 功能描述: 更新学生信息 * 输入描述: n(学号) 通过输入学号进行判断学生对应信息系的节点。 * 输出描述: 无 * 返回值 : 无 * 其它说明: 无 ************************************************************/ int count(Link L) //统计结点个数 { int n=0; Link p=L->next; if(p==NULL) { printf("未存入学生信息\n"); } while(p!=NULL) { p=p->next; n++; } return n; } /********************************************************* * 功能描述: 统计结点个数 * 输入描述: 无 * 输出描述: 计算出链表中节点的个数。 * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ void AddStu(Link L) //添加学生信息 { int temp; temp=count(L); printf("学生信息个数为%d:\n",temp); //如果没有学生信息则调用初始化函数 createLink(L); } /********************************************************* * 功能描述: 添加学生信息 * 输入描述: L * 输出描述: 利用createLink(L) * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ int mainMenu()//主菜单程序 { printf("\n****************************欢迎使用学生管理信息系统*********************************\n"); printf("* ************* 1 输入学生信息 ****** * \n"); printf("* ************ 2 显示学生信息 ******* * \n"); printf("* *********** 3 查询学生信息 ******** * \n"); printf("* ********** 4 更新(改)学生信息 ********** * \n"); printf("* ********* 5 添加学生信息 *********** * \n"); printf("* ******** 6 删除学生信息 ************ * \n"); printf("* ******** 7 保存学生信息 ************ * \n"); printf("* ******* 0 退出管理信息系统 ************* * \n"); printf("****************************欢迎使用学生管理信息系统**********************************\n"); int menu=0; printf("请选择0-7: "); scanf("%d",&menu); if(menu<0 || menu>7) { printf("输入无效,请正确输入有效序号0-7:"); scanf("%d",&menu); } return menu; } /********************************************************* * 功能描述: 主菜单程序 ,根据客户选择进行工作。 * 输入描述: menu(选择的功能),输入menu,利用switch进行判断功能的选择。 * 输出描述: 输入0-7;进行选择功能。 * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ void saveStuDentFile(Link L)//保存学生信息到文件 { FILE *fp; Link p=L->next; if((fp=fopen("student.txt","w"))==NULL)// 存储于当前目录下的.txt { printf("不能打开此文件,请按任意键退出\n"); exit(1); } fprintf(fp,"学号 姓名 年龄 班级 \n"); while(p) { fprintf(fp,"%d %s %d %s \n",p->stuNumber,p->name,p->age,p->chass); p=p->next; printf("保存成功\n"); } fclose(fp); } /********************************************************* * 功能描述: 保存学生信息到文件,防止文件信息丢失。 * 输入描述: L; * 输出描述: 若成功保存则显示“保存成功”,否则则显示“不能打开此文件,请按任意键退出” * 返回值 : n(节点个数) * 其它说明: 把学生信息保存到student.txt中。 ************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include"sjjg.h" //************************************************************************************************** ********************************* Link createLink(Link L) //创建链表结点 { //初始化定义函数,声明变量 int temp; int n; temp=count(L); //利用temp所求的结点个数进行插入 printf("录入学生个数为:%d\n",temp); Link p; //创建新链表(节点) int num=1; int stuNumber; char name[20]; int age; char chass[50]; printf("请输入想要录入(添加)学生的个数\n"); scanf("%5d",&n); while(n>0) //开始输出学生信息 { printf("请输入学生的信息:学号,姓名,年龄,班级\n"); //************************************************************************************************** ********************** printf("学号输入负数结束!\n"); //用于结束系统 printf("请输入学号%d: ",num); scanf("%11d",&stuNumber); if(stuNumber<0) //判断学号输入是否正确 { break; } printf("请输入姓名%d: ",num); getchar(); gets(name); printf("请输入年龄%d: ",num); scanf("%d",&age); printf("请输入班级%d: ",num); getchar(); gets(chass); if(stuNumber>=0) //插入 { p=(Link)malloc(SJJ); //新建节点 p->stuNumber=stuNumber; strcpy(p->chass,chass); p->age=age; strcpy(p->name,name); inserStu(L,p); //插入新结点(通过inserstu函数进行插入) num++; } n--; //判断 } return (L); } /********************************************************* * 功能描述: 创建学生信息 * 输入描述: L * 输出描述: 输入n表示要输入的学生个数,在输出学生信息,若出现学号为负则要求再次重新输入。 * 返回值 : 以建立的头链表 * 其它说明: 存在对学号正负的判断,于更新插入函数相关联。 ************************************************************/ //************************************************************************************************** *********************************** void printList(Link L) //显示L的学生信息 { printf("\n*********************学号,姓名,年龄,班级**************************\n"); int n=1; Link p=L; //建立新节点 int temp; temp=count(L); //结点个数: if(temp==0) //判断学生管理系统中有无信息 printf("系统中没有元素\n"); else while(p->next!=NULL) { printf(" 学生个数 :%d 学号 :%d",n,p->next->stuNumber); printf(" 姓名 : %s 年龄 :%d 班级 : %s \n",p->next->name,p->next->age,p->next->chass); p=p->next; n++; } printf("\n***********************************************************************************\n"); return; } /********************************************************* * 功能描述: 显示的学生信息 * 输入描述: L * 输出描述: 无 * 返回值 : 无 * 其它说明: 利用count函数进行判断 ************************************************************/ //************************************************************************************************** ******************************** void inserStu(Link L,Link NEW) //插入学生信息 { Link p=L->next; // 建立新节点 while(p!=NULL && NEW->stuNumber>=p->stuNumber) { if(p->stuNumber==NEW->stuNumber) { printf("重复输入学号,输入失败!");return ; } p=p->next; } //确定NEW的插入位置 if(p==NULL) { p=nsearch(L,p); //寻找当前地址,防止覆盖 NEW->next=NULL; p->next=NEW; //若为空节点,直接插入 } else { p=nsearch(L,p); //寻找当前地址,防止覆盖 NEW->next=p->next; p->next=NEW; } } Link nsearch(Link L,Link p) //找到当前地址元素的前一元素的地址 { if(L->next==NULL) //如果为空节点则返回直接进行插入 return(L); Link nsearch1=L; while(nsearch1->next!=p) { nsearch1=nsearch1->next; } return (nsearch1); } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: NEW由search函数返回值得出 * 输出描述: 通过传递参数NEW进行查找 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //********************************************************************************************************************** void deletecjj(Link L,int i) //从学生信息中删除第i个学生的信息 { Link p=L; int j=0; while(p->next && j<i-1) { p=p->next; j++; } if(!(p->next)) //判断是否为空 { printf("第%d个学生删除失败\n",i); return; } Link q; q=p->next; //释放q节点 p->next=q->next; free(q); } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: 用i进行判断循环,L到要删除的节点 * 输出描述: 无 * 返回值 : 无 * 其它说明: 无 ************************************************************/ int deleName(Link L, char n[]) //按姓名删除学生信息 { int flag=0; Link p; p=L->next; int seat =1; if(L->next==NULL) //判断是否为空 { printf("\n删除提示:系统中没有元素,删除失败!\n"); deteStu(L); //返回选项菜单重新选择 } else { while(p!=NULL) { if(!strcmp(p->name,n))//比较名字是否匹配 { flag=1; printf("%s",p->name); p=p->next; deletecjj(L,seat);//删除第i个学生的信息 } else { p=p->next ; seat++; } if(flag) //判断 printf("被删除了\n"); } } return flag; } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: n 为要查找的人名 * 输出描述: 通过deteStu(删除菜单)判断通过用姓名来删除对应节点,利用deletecjj函数删除信息。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ int deleNum(Link L,int n) //按学号删除学生信息 { int flag=0; Link p=L->next ; int seat=1; if(L->next==NULL) { printf("\n删除提示:系统中没有元素,删除失败!\n");deteStu( L); } else { while(p!=NULL) { if(p->stuNumber==n) //调用deleteElem { flag=1; printf("%d",p->stuNumber); p=p->next; deletecjj(L,seat); break; } p=p->next ; seat++; } if(flag) //判断 { printf("被删除了\n");} else{ printf("没有找到学生信息\n"); } } return flag; } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: n 为要查找的学号 * 输出描述: 通过deteStu(删除菜单)判断通过用学号来删除对应节点,利用deletecjj函数删除信息。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ void deteStu(Link L) //删除学生菜单 { int flag=0,way,n; printf("\n************************ 删除菜单 ********************\n"); printf("\n选择操作方式************* 1:按学号 ********************\n"); printf(" ************* 2:按姓名 ********************\n"); printf(" ************* 3: 返回主菜单 *********************\n"); printf("\n请输入删除方式:"); scanf("%d",&way); if(way<1||way>3){deteStu(L);} switch (way) { case 1: { printf("请输入要删除的学生学号:"); scanf("%d",&n); flag= deleNum(L,n); break; } case 2: { char n[20]; printf("请输入要删除的学生姓名:"); char temp1=getchar(); gets(n); flag=deleName(L,n); break; } case 3:break; } if(flag) { printf("删除成功!\n"); deteStu(L); //循环 } } /********************************************************* * 功能描述: 插入学生信息 * 输入描述: L * 输出描述: 通过way来判断所选择的删除方式。 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //************************************************************************************************** int searchName(Link L,char n[]) //按学号查询学生信息 { Link p=L->next; int flag=0; //要查找的学生和学生信息中的姓名是否匹配 (1为匹配) int seat=1; //查找的是学生数,同时判断 if(L->next==NULL||L==NULL) //判断是否为空表 printf("没有学生信息\n"); else { while(p!=NULL) { if(!strcmp(p->name,n))//比较要查找的姓名是否和当前学生信息所指的姓名匹配 { flag=1; //输入姓名匹配 printf("要查找的是第%d位学生\n",seat); printf("学号是:%d 名字:%s 年龄:%d 班级:%s\n",p->stuNumber,p->name,p->age,p->chass); } p=p->next ; seat++; } } return flag; } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: n 为要查找的姓名 * 输出描述: 通过searchMenu(查找菜单)判断通过用姓名来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ int searchNum(Link L,int n) //按学号查找学生信息 { int flag=0;//标志要查找的学生和管理信息系统中的学号是否匹配 Link p=L->next; //新建节点 int seat=1; //判断学生的个数 if(L->next==NULL) printf("没有学生信息\n"); else { while(p!=NULL) { if(n<1) { printf("学号输入负数,请重新输入!\n"); searchWay1(L); } if(p->stuNumber==n)//比较要查找的学号是否和当前学生信息所指的学号匹配 { flag=1; //输入学号匹配 printf("要查找的是第%d位学生\n",seat); printf("学号是:%d 名字:%s 年龄:%d 班级:%s \n",p->stuNumber,p->name,p->age,p->chass); } p=p->next ; seat++; } } return flag; } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: n 为要查找的学号 * 输出描述: 通过searchMenu(查找菜单)判断通过用学号来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: 无 ************************************************************/ void searchWay1(Link L) //按查询的学生的学号寻找 { int searchWay=0;//控制跳出循环,再次选择查询方式 if(searchWay==0) { printf("请输入要查询的学生的学号:\n"); int n; int flag; scanf("%d",&n); flag=searchNum(L, n); if(flag==0) printf("查找失败!\n"); searchWay=1; } if(searchWay==1) { searchMenu(L); } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L; * 输出描述: 通过searchMenu(查找菜单)判断通过用姓名(searchName函数)来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: searchWay控制跳出循环,再次选择查询方式。 ************************************************************/ void searchWay2(Link L) //按查询的学生姓名寻找 { int searchWay=0;//控制跳出循环,再次选择查询方式(继续循环) if(searchWay==0) { char n[20]; int flag; printf("请输入要查询的学生姓名\n"); char temp2; temp2=getchar(); gets(n); flag=searchName(L,n); if(flag==0) printf("查找失败!\n"); searchWay=1; } if(searchWay==1) { searchMenu(L); } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L; * 输出描述: 通过searchMenu(查找菜单)判断通过用学号(searchNum函数)来查找对应节点。 * 返回值 : flag 用于判断 * 其它说明: searchWay控制跳出循环,再次选择查询方式。 利用flag表示是否查找失败。 ************************************************************/ void searchMenu(Link L) //查询菜单 { printf(" ********************** 查询菜单 ************************************** \n"); printf(" *** 1 输入学生学号查询学生信息 \n"); printf(" *** 2 输入学生姓名查询学生信息 \n"); printf(" *** 3 返回上级菜单 \n"); printf(" ********************** 查询菜单 ************************************** \n"); printf("请选择1-3: "); int menu; scanf("%d",&menu); switch(menu) { case 1:searchWay1(L);break; case 2:searchWay2(L);break; case 3:break;//跳回主菜单程序 } } /********************************************************* * 功能描述: 寻找学生信息 * 输入描述: L * 输出描述: 通过menu来判断所选择的删除方式。 * 返回值 : 无 * 其它说明: 无 ************************************************************/ //************************************************************************************************** void alterStu(Link L)//按学号更新学生信息 { int n; printf("请输入要修改的学生学号:"); scanf("%d",&n); Link p; p=L->next; if(p==NULL) { printf("学生管理系统没有学生信息!"); } while(p!=NULL) //循环查找学生信息,如果找到该学号则进入循环体更改学生信息 { if(p->stuNumber==n) { int num=1, stuNumber,age; char telenum[50]; char name[20]; char chass[50]; printf("***********************更改学生信息*****************************************\n"); printf("请输入学号%d: ",num); printf("请输入学生的姓名,年龄和班级\n"); scanf("%d",&stuNumber); printf("请输入姓名%d: ",num); getchar(); gets(name); printf("请输入年龄%d: ",num); scanf("%d",&age); printf("请输入班级%d: ",num); getchar(); gets(chass); p->age=age; //赋值 p->stuNumber=stuNumber; strcpy(p->name,name); strcpy(p->chass,chass); printf("***********************更改学生信息完毕*****************************************\n"); } p=p->next; } } /********************************************************* * 功能描述: 更新学生信息 * 输入描述: n(学号) 通过输入学号进行判断学生对应信息系的节点。 * 输出描述: 无 * 返回值 : 无 * 其它说明: 无 ************************************************************/ int count(Link L) //统计结点个数 { int n=0; Link p=L->next; if(p==NULL) { printf("未存入学生信息\n"); } while(p!=NULL) { p=p->next; n++; } return n; } /********************************************************* * 功能描述: 统计结点个数 * 输入描述: 无 * 输出描述: 计算出链表中节点的个数。 * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ void AddStu(Link L) //添加学生信息 { int temp; temp=count(L); printf("学生信息个数为%d:\n",temp); //如果没有学生信息则调用初始化函数 createLink(L); } /********************************************************* * 功能描述: 添加学生信息 * 输入描述: L * 输出描述: 利用createLink(L) * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ int mainMenu()//主菜单程序 { printf("\n****************************欢迎使用学生管理信息系统*********************************\n"); printf("* ************* 1 输入学生信息 ****** * \n"); printf("* ************ 2 显示学生信息 ******* * \n"); printf("* *********** 3 查询学生信息 ******** * \n"); printf("* ********** 4 更新(改)学生信息 ********** * \n"); printf("* ********* 5 添加学生信息 *********** * \n"); printf("* ******** 6 删除学生信息 ************ * \n"); printf("* ******** 7 保存学生信息 ************ * \n"); printf("* ******* 0 退出管理信息系统 ************* * \n"); printf("****************************欢迎使用学生管理信息系统**********************************\n"); int menu=0; printf("请选择0-7: "); scanf("%d",&menu); if(menu<0 || menu>7) { printf("输入无效,请正确输入有效序号0-7:"); scanf("%d",&menu); } return menu; } /********************************************************* * 功能描述: 主菜单程序 ,根据客户选择进行工作。 * 输入描述: menu(选择的功能),输入menu,利用switch进行判断功能的选择。 * 输出描述: 输入0-7;进行选择功能。 * 返回值 : n(节点个数) * 其它说明: 无 ************************************************************/ void saveStuDentFile(Link L)//保存学生信息到文件 { FILE *fp; Link p=L->next; if((fp=fopen("student.txt","w"))==NULL)// 存储于当前目录下的.txt { printf("不能打开此文件,请按任意键退出\n"); exit(1); } fprintf(fp,"学号 姓名 年龄 班级 \n"); while(p) { fprintf(fp,"%d %s %d %s \n",p->stuNumber,p->name,p->age,p->chass); p=p->next; printf("保存成功\n"); } fclose(fp); } /********************************************************* * 功能描述: 保存学生信息到文件,防止文件信息丢失。 * 输入描述: L; * 输出描述: 若成功保存则显示“保存成功”,否则则显示“不能打开此文件,请按任意键退出” * 返回值 : n(节点个数) * 其它说明: 把学生信息保存到student.txt中。 ************************************************************/
-
- /*************************************************
- *版权所有 (C)2017.Hujunchao
- *
- *文件名称:main.cpp
- *文件标识:无
- *内容摘要:主函数,指出要执行的功能
- *其他说明:无
- *当前版本:V1.0
- *作 者:胡俊超
- *完成时间:20171121
- **************************************************/
#include"sjjg.h"
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
Link L;
L=(Link)malloc(SJJ);//初始化;
L->next=NULL;
int flag=0;//学生信息是否建立
int menu=0;//菜单选项
do{
menu=mainMenu();
switch(menu)//用于调用子菜单
{
case 1:{L=createLink(L);break;
case 2:printList(L); break;
case 3:searchMenu(L); break;
case 4:alterStu(L) ;break;}
case 5:createLink(L);break;
case 6:deteStu(L); break;
case 7:saveStuDentFile(L); break;
case 0:return;
}
}while(1);
}
1.登陆界面
2.创建学生信息
3.如果学号为负数则退出
4.显示学生信息
.5查询学生信息
6.更新学生信息
7.添加学生信息
8.删除学生信息
9.保存信息到文件中
10.退出系统