/*
* 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)結束界面: