数据结构课程设计——CET-6报名管理系统

本系统通过尾插法创建单链表管理CET-6考生信息,支持增删查改及排序等功能,并能将信息保存至文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


### 关于内核模式堆损坏的原因 内核模式堆损坏是一种严重的操作系统问题,通常发生在驱动程序或其他运行在内核空间的应用中。当内存管理不当或存在恶意行为时,可能导致此类问题的发生。 常见的原因包括但不限于: - 驱动程序编写缺陷,如缓冲区溢出、未初始化指针访问等[^1]。 - 使用已释放的内存对象,这可能由于缺乏适当同步机制引起。 - 越界读取/写入操作破坏了相邻分配单元的数据结构完整性。 - 多线程环境下竞争条件引发的一致性问题。 对于特定情况下的间接分支跟踪 (IBT),如果将这些字节用于跳转指令以外的目的,则重写对 IBT 进行编码的程序中的字节可能会导致程序出错。为了防止在分析错误时不必要地中止程序执行流程,有时会选择保持原有代码不变;然而这样做也有风险——即不改变那些被编译器优化过的间接调用目标位置的话,攻击者可以利用这一点绕过某些安全措施[^2]。 ### 解决方案概述 针对上述提到的各种成因,有多种策略可用于预防和修复内核模式堆损坏的问题: #### 提高开发质量控制标准 确保遵循最佳实践来减少潜在漏洞的存在几率,比如采用静态分析工具提前发现隐患所在之处,并通过严格的测试计划验证最终产品的稳定性与安全性。 #### 实施保护机制 启用并配置好各种硬件辅助的安全特性,例如 DEP(数据执行防护)、ASLR(地址空间布局随机化),以及更先进的 CET(基于 Intel 控制流强制技术)功能以增强系统的抗篡改能力。 ```cpp // 启用CET兼容性的示例设置 #include <windows.h> #pragma comment(linker, "/INTEGRITYCHECK") void EnableCet() { PPROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY pPolicy; SIZE_T returnedLength; HANDLE hProcess = GetCurrentProcess(); BOOL result = GetProcessMitigationPolicy( hProcess, ProcessControlFlowGuardPolicy, pPolicy, sizeof(*pPolicy), &returnedLength); if (!result || *pPolicy->EnableControlFlowGuard != TRUE) { // 如果当前进程尚未开启CFG则尝试激活它 *pPolicy->EnableControlFlowGuard = TRUE; SetProcessMitigationPolicy(ProcessControlFlowGuardPolicy, pPolicy, sizeof(*pPolicy)); } } ``` #### 安全更新补丁发布 及时安装来自供应商发布的官方固件升级包和服务累积更新(CU),它们往往包含了针对最新威胁情报而设计的新对策。 #### 日志记录与监控审计 部署全面的日志管理系统收集异常事件报告以便事后追踪根源所在;同时借助第三方入侵检测软件实时感知可疑活动迹象从而采取相应行动阻止事态恶化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

promise~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值