/*
* Copyright (c) 2017,烟台大学计算机学院
* All right reserved.
* 文件名称:DS+
* 作者:尹娜
* 完成日期:2017年12月21日
* 版本号:v1.0
* 问题描述:CET-6考试报名管理系统
* 输入描述:考生信息输入
* 程序输出:测试结果输出
*/
1.头文件:DS+.h
typedef struct student
{
char name[20];考生姓名
char num[20];/考生准考证号
char id[20];/考生身份证号
int score;/四级成绩
}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);/显示考生信息(输出线性表)
void SortList(LinkList *&L);//排序考生信息(按准考证号/四级成绩排序)
void LocateElem(LinkList *L);/查询考生信息(按元素值查找,(准考证号))
void change(LinkList *&L);修改考生信息
void Delete(LinkList *&L);/删除考生信息
void menu();///创建菜单
void display(LinkList *&L);显示菜单
void writedata(LinkList *&L);
2.主函数:main.cpp
#include<iostream>
using namespace std;
#include<windows.h>
#include"DS+.h"
/***********************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:系统首页
* 返回值 :无
* 其他说明:无
************************************************************/
int main()
{
system("color 1B");
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
cout<<"\t\t\t\t☆ ☆"<<endl;
cout<<"\t\t\t\t★ ***********************★"<<endl;
cout<<"\t\t\t\t☆ *欢迎进入 CET-6考试报名管理系统!*☆"<<endl;
cout<<"\t\t\t\t★ ***********************★"<<endl;
cout<<"\t\t\t\t☆ ☆"<<endl;
cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
system("pause");
system("cls");
LinkList *L;
InitList(L);//初始化线性表
display(L);///显示菜单
DestroyList(L);/销毁线性表
return 0;
}
3.外部函数:DS+.cpp
#include<iostream>
#include<string.h>
#include<malloc.h>
#include<cstring>
#include <conio.h>//用getch();
#include<fstream>//文件
#include<windows.h>//颜色
#include"DS+.h"
using namespace std;
ElemType e;
/***********************************************************
* 功能描述:初始化线性表
* 输入参数:链表L
* 输出参数:无
* 返回值 :无
* 其他说明:无
************************************************************/
void InitList(LinkList*&L)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;//创建头结点,其next域置为NULL
}
/***********************************************************
* 功能描述:销毁线性表
* 输入参数:链表L
* 输出参数:空链表
* 返回值 :无
* 其他说明:无
************************************************************/
void DestroyList(LinkList*&L)
{
LinkList*p=L,*q=p->next;//p指向q的前驱节点
while(q!=NULL)//扫描单链表
{
free(p);//释放p节点
p=q;//p, q同步后移一个节点
q=p->next;
}
free(p);//循环结束时,q为NULL,p指向尾节点,释放p
cout<<"\t\t\t此链表为空,请重新选择,创建链表"<<endl;
}
/***********************************************************
* 功能描述:采用尾插法增加考生信息
* 输入参数:该链表的总人数n
* 输出参数:无
* 返回值 :无
* 其它说明:无
************************************************************/
void CreateListR(LinkList*&L)
{
int i,n;//n为报考人数
ofstream file("考生信息.txt",ios::app);
if(!file)
{
cerr<<"文件打开失败。出现未知错误。"<<endl;
exit(1);
}
LinkList *p=L,*s;//p始终是尾节点,s为要插入节点
L=(LinkList*)malloc(sizeof(LinkList));
p=L;
cout<<"\t\t\t请输入报考人数:";
cin>>n;
for(i=0; i<n; i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
cout<<"\t\t\t请输入四级成绩:";
cin>>s->data.score;
if(s->data.score<425)
{
cout<<"\t\t\t对不起,您暂时不能报考六级考试:"<<endl;
}
else
{
{
cout<<"\t\t\t请输入姓名:";
cin>>s->data.name;
cout<<"\t\t\t请输入准考证号:";
cin>>s->data.num;
cout<<"\t\t\t请输入身份证号:";
cin>>s->data.id;
file<<"姓名"<<"\t"<<"准考证号"<<"\t\t"<<"身份证号"<<"\t\t"<<"四级成绩"<<"\n";
file<<s->data.name<<"\t"<<s->data.num<<"\t\t"<<s->data.id<<"\t\t"<<s->data.score<<"\n";
p->next=s;//将节点s插入到p后边
p=s;
}
p->next=NULL;//尾节点的next置为NULL
cout<<"\t\t\t报名成功"<<endl;
}
}
file.close();
}
/***********************************************************
* 功能描述:显示考生信息
* 输入参数:无
* 输出参数:考生信息
* 返回值 :无
* 其它说明:无
************************************************************/
void displist(LinkList*L)
{
int i=0;
LinkList *p=L->next;//p指向首节点
if(p==NULL)
{
cout<<"\t\t\t无考生信息"<<endl;
}
while(p!=NULL)//循环链表
{
cout<<"\t\t\t姓名:"<<p->data.name<<endl;
cout<<"\t\t\t准考证号:"<<p->data.num<<endl;
cout<<"\t\t\t身份证号:"<<p->data.id<<endl;
cout<<"\t\t\t四级成绩:"<<p->data.score<<endl;
p=p->next;//p后移
i++;//人数加一
}
cout<<"\t\t\t六级报考总人数:"<<i<<"人"<<endl;
cout<<endl;
}
/***********************************************************
* 功能描述:排序考生信息(根据准考证号或者四级成绩排序)
* 输入参数:排序后的考生信息
* 输出参数:无
* 返回值 :无
* 其他说明:无
************************************************************/
void SortList(LinkList*&L)
{
LinkList *p=L->next,*q,*r;
if(p==NULL)
{
cout<<"\t\t\t无考生信息"<<endl;
}
else
{
for(p=L->next; p!=NULL; p=p->next)//遍历链表
{
r=p;//记录最小值
q=p->next;
for(q=p->next; q!=NULL; q=q->next)//在无序区找小于r的元素
{
int x;
cout<<"\t\t\t请选择排序类型:"<<endl;
cout<<"\t\t\t1.按准考证号排序 2.按四级成绩排序 请选择:";
cin>>x;
switch(x)
{
case 1:
if(strcmp(q->data.num,r->data.num)<0);//按考生准考证号比较
break;
case 2:
if(q->data.score<r->data.score);//按四级成绩排序
break;
}
r=q;//记录无序区中最小值
}
if(r!=p)//r ,p 两元素交换
{
ElemType tmp;
tmp=p->data;
p->data=r->data;
r->data=tmp;
}
}
displist(L);
}
writedata(L);//写入文件
}
/***********************************************************
* 功能描述:查询考生信息
* 输入参数:要查找的准考证号e.num
* 输出参数:考生信息
* 返回值 :无
* 其他说明:无
************************************************************/
void LocateElem(LinkList*L)
{
LinkList*p=L->next;
if(p==NULL)
cout<<"\t\t\t无考生信息"<<endl;
else
{
cout<<"\t\t\t请输入准考证号:";
cin>>e.num;
while(p!=NULL&&(strcmp(p->data.num,e.num)>0||strcmp(p->data.num,e.num)<0))//遍历链表,比较
{
p=p->next;
}
if(p==NULL)
{
cout<<"\t\t\t未找到该考生准考证号";
}
else
{
cout<<"\t\t\t姓名:"<<p->data.name<<endl;
cout<<"\t\t\t准考证号:"<<p->data.num<<endl;
cout<<"\t\t\t身份证号:"<<p->data.id<<endl;
cout<<"\t\t\t四级成绩:"<<p->data.score<<endl;
}
}
}
/***********************************************************
* 功能描述:修改考生信息
* 输入参数:要修改的考生的姓名,身份证号
* 输出参数:修改成功
* 返回值 :无
* 其他说明:无
************************************************************/
void change(LinkList*&L)
{
LinkList*p=L;//p指向头节点
if(p->next==NULL)
{
cout<<"\t\t\t无考生信息"<<endl;
}
else
{
cout<<"\t\t\t请输入要修改人的准考证号:";
cin>>e.num;//输入准考证号
while(p!=NULL&&(strcmp(p->data.num,e.num)>0||strcmp(p->data.num,e.num)<0))//遍历链表,比较
{
p=p->next;
}
if(p==NULL)
{
cout<<"\t\t\t未找到该考生准考证号"<<endl;
}
else
{
cout<<"\t\t\t输出修改前的考生信息"<<endl;
LocateElem(L);
cout<<"\t\t\t请再次输入要修改人的准考证号:";
cin>>e.num;
if((strcmp(p->data.num,e.num)==0))
{
cout<<"\t\t\t请输入要修改的姓名:";
cin>>p->data.name;
cout<<"\t\t\t请输入要修改的身份证号:";
cin>>p->data.id;
cout<<"\t\t\t修改成功"<<endl;
cout<<"\t\t\t输出修改后的学生信息:"<<endl;
LocateElem(L);
}
else
{
cout<<"\t\t\t输入考号不同,不能修改,请重新输入"<<endl;
change(L);//递归修改
}
}
}
writedata(L);
}
/***********************************************************
* 功能描述:删除考生信息
* 输入参数:要删除的考生的准考证号e.num
* 输出参数:删除成功
* 返回值 :无
* 其他说明:无
************************************************************/
void Delete(LinkList*&L)
{
LinkList*p=L,*q;
if(p->next==NULL)
{
cout<<"\t\t\t无考生信息"<<endl;
}
else
{
cout<<"\t\t\t请输入要删除的考生准考证号:";
cin>>e.num;
while(p->next!=NULL&&(strcmp(p->next->data.num,e.num)>0||strcmp(p->next->data.num,e.num)<0))//找与此准考证号相等的前一个节点
{
p=p->next;
}
if(p->next==NULL)
{
cout<<"\t\t\t未找到该考生准考证号";
}
else
{
q=p->next;//q指向存要删除考生信息的节点
if(q==NULL)
{
cout<<"\t\t\t未找到该考生准考证号";
}
e=q->data;
p->next=q->next;//从链表中删除q
free(q);//释放节点q
cout<<"\t\t\t删除成功"<<endl;
}
}
writedata(L);
}
/***********************************************************
* 功能描述:菜单函数
* 输入参数:无
* 输出参数:无
* 返回值 :无
* 其他说明:无
************************************************************/
void menu()
{
system("color 1B");
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"\t\t\t\t◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆"<<endl;
cout<<"\t\t\t\t║ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳ ★CET-6考试报名管理系统★ ╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 1.增加考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 2.显示考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 3.排序考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 4.查询考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 5.修改考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 6.删除考生信息 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ╳╳╳╳╳╳╳╳╳╳╳╳╳╳ 0.安全退出系统 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ ║"<<endl;
cout<<"\t\t\t\t║ ║"<<endl;
cout<<"\t\t\t\t◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆"<<endl;
cout<<"\n\t\t\n\t\t\t请选择:";
}
/***********************************************************
* 功能描述:功能选择函数
* 输入参数:功能序号
* 输出参数:无
* 返回值 :无
* 其他说明:无
************************************************************/
void display(LinkList*&L)
{
while(true)
{
menu();
int x;
cin>>x;
switch(x)
{
case 1:
CreateListR(L);//增加考生信息
break;
case 2:
displist(L);//显示考生信息
break;
case 3:
SortList(L);//排序考生信息
break;
case 4:
LocateElem(L);//查询考生信息
break;
case 5:
change(L);//修改考生信息
break;
case 6:
Delete(L);//删除考生信息
break;
case 0:
{
system("cls");
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
cout<<"\t\t\t\t☆ ☆"<<endl;
cout<<"\t\t\t\t★ ***********************★"<<endl;
cout<<"\t\t\t\t☆ *欢迎再次进入考试报名管理系统!*☆"<<endl;
cout<<"\t\t\t\t★ ***********************★"<<endl;
cout<<"\t\t\t\t☆ ☆"<<endl;
cout<<"\t\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
exit(0);
break;
}
}
}
}
/***********************************************************
* 功能描述:文件函数(将考生信息录入文件)
* 输入参数:无
* 输出参数:无
* 返回值 :无
* 其他说明:无
************************************************************/
void writedata(LinkList*&L)
{
LinkList*p=L->next;
ofstream file("考生信息.txt",ios::out|ios::ate);
if(!file)
{
cerr<<"文件打开失败。"<<endl;
exit(0);
}
while(p!=NULL)
{
file<<"姓名"<<"\t"<<"准考证号"<<"\t"<<"身份证号"<<"\t"<<"四级成绩"<<endl;
file <<p->data.name<<"\t"<<p->data.num<<"\t"<<p->data.id<<"\t"<<p->data.score<<endl;//将输入的考生信息存入文件中
p=p->next;
}
file.close();
}
运行结果:
开始界面:
(1)增加考生信息
文件:
(2)显示考生信息
(4)查询考生信息
(5)修改考生信息
文件:
(3)排序考生信息
a.根据考生准考证号排序:
文件:
b.根据四级成绩排序:
文件:
(6)删除考生信息:
(0)结束界面: