1.头文件:linklist.h
/*************************************************
*版权所有 (C)2017.Li Yingrong
*
*文件名称:linklist.cpp
*文件标识:无
*内容摘要:头文件,包含编写的功能函数声明
*其他说明:无
*当前版本:V1.2
*作 者:李英荣
*完成时间:20171121
*
*修改记录1:
*修改时间:20171119
*版本号:V1.0
*修改人:Li Yingrong
*修改内容:创建此文件,确定信息保存形式,添加创建、显示、查询、删除功能
*
*修改记录2:
*修改时间:20171120
*版本号:V1.1
*修改人:Li Yingrong
*修改内容:完善了插入、修改、统计功能,精简了查询、删除功能
*
*修改记录3:
*修改时间:20171121
*版本号:V1.2
*修改人:Li Yingrong
*修改内容:添加了菜单功能
**************************************************/
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
#define S sizeof(LNode)
typedef struct LNode
{
//用于存放学生信息节点
int stuNumber;
char telenum[50];
int age;
char chass[50];
char adress[50];
char name[20];
struct LNode *next;
}LNode,*Link;
int mainMenu(); //主菜单程序
Link createLink(Link L); //创建链表
void inserStu(Link L,Link Elem); //插入学生信息
void deteStu(Link L); //删除学生信息
int deleNum(Link L,int n); //按学号删除学生信息
Link nsearch(Link L,Link p); //找到当前地址元素的前一元素的地址
void searchStu(Link L); //查询学生信息
int searchNum(Link L,int n); //按学号查找学生信息
void alterStu(Link L); //按学号修改学生信息
void printList(Link L); //显示学生信息
void saveStuDentFile(Link L); //保存信息到文件
int count(Link L); //统计结点个数模块
#endif // LINKLIST_H_INCLUDED
2.源文件:linklist.cpp
/*************************************************
*版权所有 (C)2017.Li Yingrong
*
*文件名称:linklist.cpp
*文件标识:无
*内容摘要:源文件
*其他说明:无
*当前版本:V1.2
*作 者:李英荣
*完成时间:20171121
*
*修改记录1:
*修改时间:20171119
*版本号:V1.0
*修改人:Li Yingrong
*修改内容:创建此文件,添加创建、显示、查询、删除功能
*
*修改记录2:
*修改时间:20171120
*版本号:V1.1
*修改人:Li Yingrong
*修改内容:完善了插入、修改、统计功能,精简了查询、删除功能
*
*修改记录3:
*修改时间:20171121
*版本号:V1.2
*修改人:Li Yingrong
*修改内容:添加了菜单功能和保存功能
**************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"linklist.h"
/*********************************************************
* 功能描述: 菜单
* 输入描述: 输入menu,进行功能选择
* 输出描述: menu
* 返回值 : menu
* 其它说明: 无
************************************************************/
int mainMenu()//主菜单程序
{
printf("欢迎使用学生管理信息系统\n");
printf("1 输入学生信息 \n");
printf("2 添加学生信息 \n");
printf("3 删除学生信息 \n");
printf("4 查询学生信息 \n");
printf("5 修改学生信息 \n");
printf("6 显示学生信息 \n");
printf("7 保存学生信息 \n");
int menu=0;
printf("请选择功能: ");
scanf("%d",&menu);
if(menu<1 || menu>7)
{
printf("输入错误,重新输入;");
scanf("%d",&menu);
}
return menu;
}
/*********************************************************
* 功能描述: 创建链表,获取信息
* 输入描述: L,输入学生信息
* 输出描述: 无
* 返回值 : 已建立的链表 L
* 其它说明: 尾插法
************************************************************/
Link createLink(Link L) //创建链表结点
{ //初始化定义函数,声明变量
int temp;
int n;
temp=count(L); //利用temp所求的结点个数进行插入
printf("当前学生数:%d\n",temp);
Link p; //创建新链表
int num=1;
int stuNumber;
char telenum[50];
char name[20];
int age;
char chass[50];
printf("添加学生数;\n");
scanf("%5d",&n);
while(n>0) //开始输出学生信息
{
p=(Link)malloc(S); //新建节点
printf("请输入学号%d: ",num);
scanf("%d",&p->stuNumber);
printf("请输入姓名%d: ",num);
scanf("%s",&p->name);
printf("请输入年龄%d: ",num);
scanf("%d",&p->age);
printf("请输入班级%d: ",num);
scanf("%s",&p->chass);
printf("请输入电话号码: ",num);
scanf("%s",&p->telenum);
inserStu(L,p); //插入新结点(通过inserstu函数进行插入)
num++;
n--;//判断
}
return (L);
}
/*********************************************************
* 功能描述: 插入节点
* 输入描述: 建立的链表L和存储信息的节点p
* 输出描述: 无
* 返回值 : 无
* 其它说明: 通过nsearch函数寻址,防止覆盖
************************************************************/
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;
}
}
/*********************************************************
* 功能描述: 寻址
* 输入描述: 已建的链表L和准备输入的节点p
* 输出描述: 无
* 返回值 : 找到当前地址元素的前一元素的地址nsearch1
* 其它说明: 防止插入信息时发生覆盖
************************************************************/
Link nsearch(Link L,Link p) //找到当前地址元素的前一元素的地址
{
if(L->next==NULL) //如果为空表则返回直接进行插入
return(L);
Link nsearch1=L;
while(nsearch1->next!=p)
{
nsearch1=nsearch1->next;
}
return (nsearch1);
}
/*********************************************************
* 功能描述: 引导删除学生信息
* 输入描述: 已建的链表L和准备删除的学生学号
* 输出描述: 删除是否成功
* 返回值 : 无
* 其它说明: 仅作为一个引导,并不真正对信息进行改动
************************************************************/
void deteStu(Link L) //删除学生
{
int flag=0,n;
printf("请输入要删除的学生学号:");
scanf("%d",&n);
flag= deleNum(L,n);
if(flag)
{
printf("删除成功!\n");
}
}
/*********************************************************
* 功能描述: 删除学生信息
* 输入描述: 已建的链表L和准备删除学生的学号
* 输出描述: 是否成功删除信息
* 返回值 : 判断是否成功的值flag
* 其它说明: 无
************************************************************/
int deleNum(Link L,int n) //按学号删除学生信息
{
int flag=0;
Link p=L->next ;
int seat=1;
if(L->next==NULL)
{
printf("\n删除提示:系统中没有元素,删除失败!\n");
}
else
{
while(p!=NULL)
{
if(p->stuNumber==n) //调用deleteElem
{
flag=1;
printf("%d",p->stuNumber);
p=p->next;
int i,j=0;
while(L->next && j<i-1)
{
L=L->next;
j++;
}
Link q;
q=L->next; //释放q节点
L->next=q->next;
free(q);
break;
}
p=p->next ;
seat++;
}
if(flag) //判断
{
printf("被删除了\n");}
else{
printf("没有找到学生信息\n");
}
}
return flag;
}
/*********************************************************
* 功能描述: 引导查询学生信息
* 输入描述: 已建的链表L和准备查询学生的学号
* 输出描述: 是否查询失败
* 返回值 : 无
* 其它说明: 仅用来引导查询,保存学号
************************************************************/
void searchStu(Link L) //按查询的学生的学号寻找
{
int flag;
printf("请输入要查询的学生的学号:\n");
int n;
scanf("%d",&n);
flag=searchNum(L, n);
if(flag=0)
{
printf("查询失败\n");
}
}
/*********************************************************
* 功能描述: 查询并输出学生信息
* 输入描述: 已建的链表L和准备查询学生的学号
* 输出描述: 查到的学生信息
* 返回值 : 判断是否成功的值flag
* 其它说明: 无
************************************************************/
int searchNum(Link L,int n) //按学号查找学生信息
{
int flag=0;//标志要查找的学生和管理信息系统中的学号是否匹配
Link p=L->next; //新建节点
if(L->next==NULL)
printf("没有学生信息\n");
else
{
while(p!=NULL)
{
if(p->stuNumber==n)//比较要查找的学号是否和当前学生信息所指的学号匹配
{
flag=1; //输入学号匹配
printf("学号:%d 名字:%s 年龄:%d 班级:%s 手机号:%s\n",p->stuNumber,p->name,p->age,p->chass,p->telenum);
}
p=p->next ;
}
}
return flag;
}
/*********************************************************
* 功能描述: 修改学生信息
* 输入描述: 已建的链表L和准备修改学生的学号
* 输出描述: 有无此学生
* 返回值 : 无
* 其它说明: 无
************************************************************/
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)
{
printf("***********************更改学生信息*****************************************\n");
printf("请输入学号%d: ");
scanf("%d",&p->stuNumber);
printf("请输入姓名%d: ");
scanf("%s",&p->name);
printf("请输入年龄%d: ");
scanf("%d",&p->age);
printf("请输入班级%d: ");
scanf("%s",&p->chass);
printf("请输入电话号码: ");
scanf("%s",&p->telenum);
printf("更改成功!!!\n");
}
p=p->next;
}
}
/*********************************************************
* 功能描述: 显示学生信息
* 输入描述: 已建的链表L
* 输出描述: 所有节点信息
* 返回值 : 无
* 其它说明: 无
************************************************************/
void printList(Link L) //显示L的学生信息
{
printf("\n*********************学号,姓名,年龄,班级,电话号码**************************\n");
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("%2d %-9d",n,p->next->stuNumber);
printf("%-8s %-5d %-12s %s \n",p->next->name,p->next->age,p->next->chass,p->next->telenum);
p=p->next;
n++;
}
return;
}
/*********************************************************
* 功能描述: 保存学生信息到文件
* 输入描述: 已建的链表L
* 输出描述: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
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 %s\n",p->stuNumber,p->name,p->age,p->chass,p->telenum);
p=p->next;
printf("保存成功\n");
}
fclose(fp);
}
/*********************************************************
* 功能描述: 统计节点个数
* 输入描述: 已建的链表L
* 输出描述: 是否有节点
* 返回值 : 节点个数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;
}
3.主函数:main.cpp
/*************************************************
*版权所有 (C)2017.Li Yingrong
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:主函数,根据所需功能选择函数
*其他说明:无
*当前版本:V1.1
*作 者:李英荣
*完成时间:20171121
*
*修改记录1:
*修改时间:20171119
*版本号:V1.0
*修改人:Li Yingrong
*修改内容:初步创建,仅用来调试程序
*
*修改记录2:
*修改时间:20171121
*版本号:V1.1
*修改人:Li Yingrong
*修改内容:排序整理
**************************************************/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include"linklist.h"
int main()
{
Link L;
L=(Link)malloc(S);//初始化;
L->next=NULL;
int flag=0;//学生信息是否建立
int menu=0;//菜单选项
do{
menu=mainMenu();
switch(menu)//用于调用子菜单
{
case 1:
{
L=createLink(L);
};
break;//创建
case 2:createLink(L);break;//添加
case 3:deteStu(L); break;//删除
case 4:searchStu(L); break;//查询
case 5:alterStu(L) ;break;//修改
case 6:printList(L); break;//输出
case 7:saveStuDentFile(L); break;//保存
}
}while(1);
}
运行结果:
输入信息:
添加信息:
显示信息:
删除信息:
查询信息
修改信息
保存信息