/***********************************************************
* 版权所有 (C)2017,考试报名管理系统
*
* 文件名称: main.cpp
* 文件标识:main
* 内容摘要:函数文件
* 其它说明:主函数
* 当前版本: V3.0
* 作 者:宋昊
* 完成日期: 2017.12.21
*
* 修改记录1:
* 修改日期 :2017.12.20
* 版本号: V1.0
* 修改人: 宋昊
* 修改内容:修复统计信息Bug
*
* 修改记录2:
* 修改日期 :2017.12.21
* 版本号: V2.0
* 修改人:
* 修改内容:修复修改信息Bug
*
**********************************************************/
#ifndef ST_H_INCLUDED
#define ST_H_INCLUDED
typedef struct student
{
int num;
char sex[10];
char name[10];
char address[10];
int type;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L); //初始化线性表
void DestroyList(LinkList *&L); //销毁线性表
void CreateListR(LinkList *&L); //采用尾插法创建链表
void DispList(LinkList *L); //输出链表
int LocateElem(LinkList *L); //查找信息
int ListDelete(LinkList *&L); //删除信息
int create(LinkList *&L); //修改信息
void sort(LinkList *&L); //排序信息
void sumList(LinkList *&L); //统计信息
void Insterlist(LinkList *L); //插入信息
void display(); //菜单名
void Display(LinkList *L); //菜单对应的操作
#endif // ST_H_INCLUDED
#include
#include
#include
#include
#include
#include "st.h"
using namespace std;
ElemType e;
/***********************************************************
* 功能描述:初始化线性表 建立一个空的单链表,创建一个头结点
* 输入参数:L
* 输出参数:无
* 返回值 :无
* 其它说明:无
************************************************************/
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
/***********************************************************
* 功能描述:销毁线性表,释放单链表L占用的内存空间,即逐一释放全部节点的空间
* 输入参数:L
* 输出参数:空链表
* 返回值 :无
* 其它说明:无
************************************************************/
void DestroyList(LinkList *&L)
{
LinkList *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
L->next=NULL;
printf("释放空间成功!\n");
}
/***********************************************************
* 功能描述:采用尾差法创建链表
* 输入参数:该链表的总人数n
* 输出参数:无
* 返回值 :无
* 其它说明:无
************************************************************/
void CreateListR(LinkList *&L) //采用尾差法创建链表>
{ int n; //该链表的总人数
printf("请输入要增加的人数n=");
scanf("%d",&n);
LinkList *s,*r;int i; //定义LinkList *s 做作为插入的新结点 定义LinkList *r 始终指向尾结点
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
printf("输入考号(不能相同) 姓名 性别 院系 年龄 科目\n");
for (i=0;i
{ s=(LinkList *)malloc(sizeof(LinkList));
scanf("%d %s %s %s %d",&s->data.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.type);
r->next=s;
r=s;
}
r->next=NULL; //将尾结点指向null
}
/***********************************************************
* 功能描述:输出信息
* 输入参数:考号
* 输出参数:考生信息
* 返回值 :无
* 其它说明:无
************************************************************/
void DispList(LinkList *L)
{
LinkList *p=L->next; //定义LinkList *p 指向第一个元素结点
while (p!=NULL) //用while循环逐次输出链表元素(条件是p!=null)
{ printf("考号(不能相同) 姓名 性别 院系 科目\n");
printf("%d %s %s %s %d\n",p->data.num,p->data.name,p->data.sex,p->data.address,p->data.type);
p=p->next;
}
printf("\n");
}
/***********************************************************
* 功能描述:查找信息
* 输入参数:要查找的考号i
* 输出参数:信息
* 返回值 :1
* 其它说明:无
************************************************************/
int LocateElem(LinkList *L) //定义ElemType e 作为查找考号的对象
{ printf("请输入要查找的考号i=");
scanf("%d",&e.num);
LinkList *p=L->next; //定义LinkList *p 指向第一个元素结点
while (p!=NULL && p->data.num!=e.num ) //用while循环查找要查找的结点(条件是p!=NULL && p->data.num!=e.num)
{
p=p->next;
}
if (p==NULL)
return(0);
else
{printf("考号:");
printf("%d\n",p->data.num);
printf("性别:");
printf("%s\n",p->data.sex);
printf("姓名:");
printf("%s\n",p->data.name);
printf("院系:");
printf("%s\n",p->data.address);
printf("科目:");
printf("%d\n",p->data.type);
return 1;}
}
/***********************************************************
* 功能描述:删除信息
* 输入参数:要删除的考号i
* 输出参数:输出删除以后的全部信息
* 返回值 :1
* 其它说明:无
************************************************************/
int ListDelete(LinkList *&L) //定义ElemType e 作为删除考号的对象
{
printf("请输入要删除的考号i=");
scanf("%d",&e.num);
LinkList *p=L,*q; //定义LinkList *p 指向头结点 定义LinkList *q 作为存储删除结点的变量
while (e.num!=p->next->data.num &&p!=NULL) // 用while循环查找该结点,并且用free(q)清空该结点
{
p=p->next;
}
if (p==NULL)
return 0;
else
{
q=p->next;
if (q==NULL)
return 0;
p->next=q->next;
free(q);
printf("输出删除以后的全部信息:\n\n");
DispList(L);
return 1;
}
}
/***********************************************************
* 功能描述:修改信息
* 输入参数:要修改的考号i
* 输出参数:输出修改以后的全部信息
* 返回值 :1
* 其它说明:无
************************************************************/
int create(LinkList *&L) //定义ElemType i 作为修改考号的对象
{
printf("请输入要修改人的考号i=");
scanf("%d",&e.num);
LinkList *p=L; //定义LinkList *p 指向头结点
while (e.num!=p->data.num&&p->next!=NULL) //用while循环查找该结点
{
p=p->next;
}
if (e.num!=p->data.num)
{
printf("不存在此考号\n\n");
DispList(L);
}
else
{
printf("请输入考号\n");
scanf("%d",&e.num);
if(p->data.num==e.num)
{
printf("允许修改,请输入:姓名 性别 院系 科目\n");
scanf("%s %s %s %d",&p->data.name,&p->data.sex,&p->data.address,&p->data.type);
printf("输出修改以后的全部信息:\n\n");
DispList(L);
return (1);
}
else
{
printf("考号不同,不能修改,重新执行修改信息\n");
return (1);
}
}
}
/***********************************************************
* 功能描述:排序信息
* 输入参数:无
* 输出参数:输出排好序的链表
* 返回值 :无
* 其它说明:无
************************************************************/
void sort(LinkList *&L)
{ LinkList *p=L->next,*q,*r; //定义LinkList *p 指向未排序的第一个结点 定义LinkList *q 指向头结点
if(p!=NULL)
{r=p->next;
p->next=NULL;
p=r;
while(p!=NULL) //用while循环寻找p指向的元素比排好序中的元素大,则将其插入其后
{r=p->next;
q=L;
while(q->next!=NULL&&q->next->data.numdata.num)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
DispList(L);
}
/***********************************************************
* 功能描述:统计信息
* 输入参数:无
* 输出参数:统计的信息
* 返回值 :无
* 其它说明:无
************************************************************/
void sumList(LinkList *&L)
{LinkList *p=L; //定义LinkList *p 指向头结点 定义多个变量 统计报考各科的人数
int n=0;
while(p->next!=NULL) //用while循环和if语句统计人数
{ n++;
p=p->next;
}
printf("报考的总人数是n=");
printf("%d\n",n);
}
/***********************************************************
* 功能描述:插入信息
* 输入参数:要插入的人数n
* 输出参数:无
* 返回值 :无
* 其它说明:无
************************************************************/
void Insterlist(LinkList *L)
{ int n;
printf("请输入要插入的人数n="); //定义变量int n 作为插入的人数
scanf("%d",&n);
LinkList *s,*r,*p=L;int i; //定义变量LinkList *s 作为新插入结点变量 定义变量LinkList *r 指向尾指针 定义变量LinkList *p 作为循环条件变量 //r=s;
printf("输入考号(不能相同) 姓名 性别 院系 科目 \n");
while(p->next!=NULL) //用while循环找到尾结点,插入新元素
p=p->next;
for (i=0;idata.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.type);
p->next=s;
p=s;
r=s;
}
r->next=NULL;
}
/***********************************************************
* 功能描述:菜单栏
* 输入参数:无
* 输出参数:无
* 返回值 :无
* 其它说明:无
************************************************************/
void display()
{ printf("........考试报名菜单选择.........\n");
printf("***********1.排序信息.***********\n");
printf("***********2.查找信息.***********\n");
printf("***********3.删除信息.***********\n");
printf("***********4.输出信息.***********\n");
printf("***********5.输入信息.***********\n");
printf("***********6.释放空间.***********\n");
printf("***********7.统计信息.***********\n");
printf("***********8.修改信息.***********\n");
printf("***********9.插入信息.***********\n");
printf("**********10.结束程序.***********\n");
}
/***********************************************************
* 功能描述:进行操作
* 输入参数:要进行的项目
* 输出参数:对应的操作
* 返回值 :对应各个函数
* 其它说明:无
************************************************************/
void Display(LinkList *L) //定义变量a 作为选择变量
{while(true)
{display();
int a;
printf("请输入要操作的序号a=");
scanf("%d",&a);
switch(a) //用switch语句,编写选择项目
{case 1:
{sort(L);break;}
case 2:
{LocateElem(L);break;}
case 3:
{ListDelete(L);break;}
case 4:
{DispList(L); break;}
case 5:
{ CreateListR(L);break;}
case 6:
{DestroyList(L);break;}
case 7:
{sumList(L);break;}
case 8:
{create(L);break;}
case 9:
{Insterlist(L);break;}
case 10:
{
cout<<"**************************************"<
#include
#include "st.h"
int main()
{LinkList *L; //定义LinkList *L
InitList(L); //调用初始化线性表函数
Display(L); //调用显示菜单函数
return 0;
}
输入信息
排序信息
修改信息
统计信息
查找信息
删除信息
插入信息
释放空间
退出程序