数据结构课程设计【考试报名管理系统】

/**************************************************
*Copyright(c)2017,烟台大学计算机与控制工程学院                                          
*All rights reservrd.
*文件名称:1.cpp                                             
*作者:刘文平                                          
*完成时间:2017年12月20日
*                                          
*版本号:v1.0                                          
*问题描述:考试报名管理系统 
*问题输入:无        
*程序输出:测试结果
*/


ks.h

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include<fstream>
using namespace std;
typedef struct student
{
    int   num;
    char  sex[20];
    char  name[20];
    int   age;
    char  address[20];
    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 InsertList(LinkList *L);   //插入信息
void Display(LinkList *L);//输出信息
void import(LinkList*&L);//读文件
void save(LinkList*&L);//存文件
void DispListKH(LinkList *L);//输出信息
void ListInsert(LinkList *&L,LinkList *p);//插入新的节点


ks.cpp

#include"ks"
/***************************************************************
*功能描述:初始化线性表,建立一个空的单链表,创建一个头结点
*输入参数:L 
*输出参数:无
*返回值:无
*其它说明:无
***************************************************************/
void InitList(LinkList *&L) //初始化线性表  建立一个空的单链表,创建一个头结点
{
    L=(LinkList *)malloc(sizeof(LinkList)); //向系统请求分配内存空间来装LinkList这种类型的指针数据的内存大小
    L->next=NULL;  //创建头结点,其next域置为NULL
}


/****************************************************************
*功能描述:销毁线性表,释放单链表L占用的内存空间,即逐一释放全部结点
*输入参数:L
*输出参数:空链表
*返回值:无
*其它说明:无
******************************************************************/
void DestroyList(LinkList *&L) //释放单链表L占用的内存空间,即逐一释放全部节点的空间  //释放空间
{
    LinkList *p=L,*q=p->next;
    while (q!=NULL)
    {
        free(p);  //释放内存,p指向的地址不变
        p=q;
        q=p->next;
    }
    free(p);
    //L=NULL;
    printf("此报名系统的考生信息已经全部清除!\n\n\n");


}


/*********************************************************************
*功能描述:采用尾插法创建链表
*输入参数:L
*输出参数:无
*返回值:无
*其它说明:无
**********************************************************************/
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");
        printf("考试的类别:1.四级笔试 2.四级口语 3.六级笔试 4.六级口语 \n");
        for (i=0;i<n;i++)//使用for循环将新结点逐次插入链表之后(条件是int i<n)
        {
              s=(LinkList *)malloc(sizeof(LinkList));
              scanf("%d %s %s %s %d %d",&s->data.num,&s->data.name,&s->data.sex,&s->data.address,&s->data.age,&s->data.type);
              r->next=s;
              r=s;
        }
        r->next=NULL;            //将尾结点指向null

}


/******************************************************************
*功能描述:输出信息
*输入参数:L
*输出参数:考生的相关信息
*返回值:无
*其它说明:无
*******************************************************************/
void DispList(LinkList *L)  //输出信息
{
    LinkList *p=L->next;   //定义LinkList *p 指向第一个元素结点
    if(p==NULL)
    printf("该考试报名系统信息为空,请添加!\n");
    while(p!=NULL) //用while循环逐次输出链表元素(条件是p!=null)
    {
        printf("考号 姓名  性别  籍贯  年龄  考试类别\n");
        printf("%d %s %s %s %d %d\n",p->data.num,p->data.name,p->data.sex,p->data.address,p->data.age,p->data.type);
        p=p->next;
    }
    printf("  \n");

}


/********************************************************************
*功能描述:查找信息
*输入参数:L
*输出参数:该考号所对应的学生的信息
*返回值:1
*其它说明:无
*********************************************************************/
int LocateElem(LinkList *L)   //查找信息
{
    ElemType e;
    int n;
    int count=0;
    int i;
    printf("请选择1.按考生号进行查询2.按姓名进行查询 \n");
    scanf("%d",&n);
    switch(n)
    {
    case 1:
        {
            printf("请输入要查找的考生的考号:\n");
            scanf("%d",&e.num);
            LinkList *p=L->next;         // 定义LinkList *p指向第一个元素结点
            while (p!=NULL && p->data.num!=e.num)//用while循环查找要查找的结点
            {
               p=p->next;
            }
            if (p==NULL)
            {
            printf("您要查找的考生不存在,请重新输入!\n");
            return(0);
            }
    else
    {
     printf("考号:");
     printf("%d\n",p->data.num);
	 printf("姓名:");
     printf("%s\n",p->data.name);
     printf("性别:");
     printf("%s\n",p->data.sex);
     printf("籍贯:");
     printf("%s\n",p->data.address);
     printf("年龄:");
     printf("%d\n",p->data.age);
     printf("考试类别:");
     printf("%d\n",p->data.type);
     return 1;
    }
    break;
        }
    case 2:
        {
           printf("请输入要查找的考生的姓名:\n");
           scanf("%s",&e.name);
           LinkList *p=L->next;         // 定义LinkList *p指向第一个元素结点
           if (p==NULL)
            {
                printf("您查找的该姓名的考生不存在!\n");
            }
            do
            {
                if(strcmp(e.name,p->data.name)==0)
                {
                    printf("考号:");
                    printf("%d\n",p->data.num);
	                printf("姓名:");
                    printf("%s\n",p->data.name);
                    printf("性别:");
                    printf("%s\n",p->data.sex);
                    printf("籍贯:");
                    printf("%s\n",p->data.address);
                    printf("年龄:");
                    printf("%d\n",p->data.age);
                    printf("考试类别:");
                    printf("%d\n",p->data.type);
                }
                p=p->next;
            }while(p!=NULL);
          break;
        }

    }
}


/******************************************************************
*功能描述:删除信息
*输入参数:L
*输出参数:输出删除后的全部信息
*返回值:1
*其它说明:无
********************************************************************/
int ListDelete(LinkList *&L)    //删除信息
{
    ElemType e;
    printf("请输入要删除考生的考号:");
    scanf("%d",&e.num);
    LinkList *p=L,*q;        //定义LinkList *p  指向头结点        定义LinkList *q 作为存储删除结点的变量
	q=p->next;
    while (e.num!=q->data.num &&q->next!=NULL)    //用while循环查找该结点,并且用free(q)清空该结点
    {
        q=q->next;
		p=p->next;
    }
	if(e.num!=q->data.num)
	{
		printf("抱歉,没有找到该考号!\n");
        return 0;
	}
    else
    {
        q=p->next;
        if (q==NULL)
           return 0;
        p->next=q->next;
        free(q);
        printf("输出删除以后的全部信息:\n\n");
        DispList(L);
        return 1;
    }
}


/********************************************************************
*功能描述:修改信息
*输入参数:L
*输出参数:输出修改后的全部信息
*返回值:1
其它说明:无
*********************************************************************/
int create(LinkList *&L)      //修改信息
{
    ElemType e;
    printf("请输入要修改的考生的考号:\n");
    scanf("%d",&e.num);
    LinkList *p=L->next;         //定义LinkList *p指向第一个元素
	while (e.num!=p->data.num&&p->next!=NULL)     //用while循环查找该结点
    {
        p=p->next;
	}


		if(p->data.num==e.num)
		{
			printf("允许修改!\n");
			printf("请输入:姓名  性别  籍贯  年龄  考试类别\n");
			scanf("%s %s %s %d %d",&p->data.name,&p->data.sex,&p->data.address,&p->data.age,&p->data.type);
			printf("输出修改以后的全部信息:\n\n");
			DispList(L);
			return 0;

		}
			printf("没有此考号,不能修改,重新执行修改信息!\n");
			return 0;
}


/******************************************************************
*功能描述:排序信息
*输入参数:L
*输出参数:无
*返回值:无
*其它说明:无
*******************************************************************/
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.num<p->data.num)
    q=q->next;
    p->next=q->next;
    q->next=p;
    p=r;
   }
  }
  DispList(L);
}


/************************************************************
*功能描述:统计信息
*输入参数:L
*输出参数:统计的各类信息
*返回值:无
*其它说明:无
*************************************************************/
void sumList(LinkList *&L)    //统计信息
{
  LinkList *p=L;            //定义LinkList *p指向头结点        定义多个变量统计报考各科的人数
  int n=0,m=0,h=0,i=0,j=0;
  while(p->next!=NULL)             //用while循环和if语句统计人数
  {
      n++;
   if(p->next->data.type==1)
       m++;
   if(p->next->data.type==2)
       i++;
   if(p->next->data.type==3)
       h++;
   if(p->next->data.type==4)
       j++;
   p=p->next;
   }
  printf("报考英语四六级的总人数为: ");
  printf("%d\n",n);
  printf("报考英语四级笔试的人数为:");
  printf("%d\n",m);
  printf("报考英语四级口语的人数为:");
  printf("%d\n",h);
  printf("报考英语六级笔试的人数为:");
  printf("%d\n",i);
  printf("报考英语六级口语的人数为:");
  printf("%d\n",j);
}


/*********************************************************
*功能描述:保存考生信息到GS.txt文件中
*输入参数:L
*输出参数:无
*返回值:无
*其它说明:把学生信息保存到此文件夹中
**********************************************************/
void save(LinkList * &L)//保存学生信息到文件
{
	FILE *fp;
    //WORK*p;
	//p = worker;
	LinkList *p=L->next;
	if((fp=fopen("GS.txt","w"))==NULL)// 以可写的方式打开当前目录下的.txt
	{
		printf("Can not open the file,press any key exit!");
		exit(1);
	}
	while(p)
	{
		//printf("*******\n");
		//display(p);
		fprintf(fp,"%d %s %s %s %d %d \n",p->data.num,&p->data.name,&p->data.sex,&p->data.address,p->data.age,p->data.type);
		p=p->next;
    }
	fclose(fp);
	printf("您已经将考生信息成功保存到了 GS.txt文件中!\n ");
}


/***********************************************************
*功能描述:读文件
*输入参数:L
*输出参数:无
*返回值:无
*其它说明:运行前把学生信息读到电脑内存中
************************************************************/
void import(LinkList *&L)
//运行前把文件内容读取到电脑内存
{
	FILE *fp;
	ElemType e;
    fp=fopen("GS.txt","rb"); //以只读方式打开当前目录下的.txt
    if(fp==NULL)
    {
        printf("无法打开文件\n");
        exit(0);                   //-------- 终止程序 ---------
    }
       int i=0;
    //LinkList *p=(LinkList *)malloc(sizeof(LinkList));

  	while(!feof(fp))
	{

       fscanf(fp,"%d %s %s %s %d %d",&e.num,&e.name,&e.sex,&e.address,&e.age,&e.type);
       i++;//记录考生的人数
	}
	fclose(fp);


	FILE *FP;
    FP=fopen("GS.txt","rb"); //以只读方式再次打开当前目录下的.txt
    if(FP==NULL)
    {
        printf("无法打开文件\n");
        exit(0);                   //-------- 终止程序 ---------
    }
    int b=i-1;//数组从开始,注意下标
	int j=1;
		while(!feof(FP))
		{

            fscanf(FP,"%d %s %s %s %d %d",&e.num,&e.name,&e.sex,&e.address,&e.age,&e.type);
	   	    LinkList *n=(LinkList *)malloc(sizeof(LinkList));
	   	    n->data.num=e.num;//把后者的内容拷贝到前者中
            strcpy(n->data.name,e.name);//把后者的内容拷贝到前者中
	   		strcpy(n->data.sex,e.sex);
	   		n->data.age=e.age;
	   		strcpy(n->data.address,e.address);//把后者的内容拷贝到前者中
	   		n->data.type=e.type;
			ListInsert(L,n);//插入新的节点
			n=n->next;
		    if(j==b)
			   break;
		    j++;
		}
    fclose(FP);    //----关闭文件----
}


/**********************************************************
*功能描述:增加新考生的信息
*输入参数:L
*输出参数:可能会输出“该考生已存在请重新输入!”
*返回值:无
*其它说明:无
************************************************************/
void InsertList(LinkList *L)   //插入信息
{
       ElemType e;
       printf("请输入考生的信息:\n");
       printf("考生号:");
       scanf("%d",&e.num);
       LinkList *q=L->next;
       while(q!=NULL)
       {
           if(q->data.num==e.num)
           {
               printf("该考生已存在请重新输入!\n");
               break;
           }
           q=q->next;
       }
       if(q==NULL)
       {
        LinkList *p;
        InitList(p);

        p->data.num=e.num;//把后者的内容拷贝到前者中

        printf("姓名:") ;
        scanf("%s",&e.name) ;
       // printf("%s\n",nam);
        strcpy(p->data.name,e.name);//把后者的内容拷贝到前者中

        printf("性别:(w为男 m为女)");
        scanf(" %s",&e.sex);
        //printf("%c\n",s);
        strcpy( p->data.sex,e.sex);

        printf("年龄:");
        scanf("%d",&e.age);
       // printf("%d\n",ag);
        p->data.age=e.age;

        printf("地址:");
        scanf("%s",&e.address);
       // printf("%d\n",sc);
        strcpy(p->data.address,e.address);

        printf("类型:");
        scanf("%d",&e.type);
       // printf("%d\n",wf);
        p->data.type=e.type;

        ListInsert(L,p);
    }
}

/*************************************************************
*功能描述:创建新结点
*输入参数:L,P
*输出参数:无
*返回值:无
*其它说明:无
**************************************************************/
void ListInsert(LinkList *&L,LinkList *p)//插入新的节点
{
    LinkList *q=NULL;
    q=L;
    if(q->next==NULL)
    {
        q->next=p;
        p->next=NULL;
    }
    else
    {
        p->next=q->next;
        q->next=p;
    }
}

/************************************************************
*功能描述:功能界面
*输入参数:无
*输出参数:该功能界面
*返回值:无
*其它说明:无
*************************************************************/
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");
  printf("        11.从文件中导入考生信息到电脑内存          \n");
  printf("             0.退出考试报名系统              \n");
  printf("**************************************************\n");
  system("color 0D");
}


/******************************************************************
*功能描述:输入0—11的数字选择功能
*输入参数:0—11中的任意个数字
*输出参数:各功能相应的输出
*返回值:无
*其它说明:无
*******************************************************************/
void Display(LinkList *L)
{
    while(1)
{
    display();
    int a;//定义变量a作为选择变量
    printf("请输入要操作的项目的编号:\n");
    scanf("%d",&a);
    //if(a<=0||a>12)
    //printf("您选择的功能不存在,请重新输入已存在的功能。\n");
    //printf("请重新输入要操作的项目的编号:\n");
    //scanf("%d",&a);
   switch(a)       //用switch语句,编写选择项目
 {
     case 1:
      {
          CreateListR(L);
          break;
      }
     case 2:
      {
          DispList(L);
          break;
      }
     case 3:
      {
          LocateElem(L);
          break;
      }
     case 4:
      {
          ListDelete(L);
           break;
    }
     case 5:
      {
          create(L);
          break;
     }
     case 6:
      {
          sort(L);
          break;
      }
     case 7:
      {
          sumList(L);
          break;
      }
     case 8:
      {
          InsertList(L);
          break;}
     case 9:
      {
          DestroyList(L);
          break;
      }
     case 10:
        {
            //ifstream infile;
            //char filename[20];

            //printf("请输入文件名:\n");
            //scanf("%s",filename);
            save(L);//,filename
            break;
        }
     case 11:
        {
            //ifstream infile;
            //char filename[20];
            //printf("请输入文件名:\n");
            //scanf("%s",filename);
            import(L);//filename,
            break;
        }
     case 0:
      {
		  printf("您已经成功退出四六级英语考试报名系统。\n");
		  exit(0);
	  }
  }
 }
}



main.cpp

#include"ks.h"
#include <malloc.h>
#include <stdlib.h>

int main()
{
 LinkList *L;  //定义LinkList *L
 InitList(L); //调用初始化线性表函数
 Display(L); //调用显示菜单函数
 return 0;
}


  • 37
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
C语言版课程设计 #include #include 产生随机数 #include 调用计算时间的函数 #include using namespace std; 产生随机数,输入产生随机数的个数,范围,即可产生待排数据 void Random(long p[],long n,long a,long b) { long max,min; if(a>b) { max=a-b+1; min=b; } else { max=b-a+1; min=a; } srand((unsigned)time(NULL)); for(long i=1;i<=n;i++) p[i]=rand()%max+min; } 输出排序后的结果;用已检测排序的正确,是否能正确排序 void Print(long p[],long n) { cout<<"\n排序后的结果:"; for(long i=1;i<=n;i++) cout<<p[i]<<' '; } void Initiate(long p[],long q[],long n) { for(long i=1;i<=n;i++) q[i]=p[i]; } 直接插入排序:排序并测试排序过程中的时间消耗 void StraightInsertionSort(long p[],long n) { long *q=new long[n+1]; Initiate(p,q,n); LARGE_INTEGER m_liPerfFreq={0}; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart={0}; QueryPerformanceCounter(&m_liPerfStart); for(long i=2;i<=n;++i) if(q[i]<q[i-1]) { q[0]=q[i]; q[i]=q[i-1]; for(long j=i-2;q[0]<q[j];--j) q[j+1]=q[j]; q[j+1]=q[0]; } LARGE_INTEGER liPerfNow={0}; QueryPerformanceCounter(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; // Print(q,n); cout<<"\n直接插入排序时间消耗:"<<time<<" MS"; delete []q; } 折半插入排序:排序并测试排序过程中的时间消耗 void BinaryInsertionSort(long p[],long n) { long *q=new long[n+1]; Initiate(p,q,n); LARGE_INTEGER m_liPerfFreq={0}; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart={0}; QueryPerformanceCounter(&m_liPerfStart); for(long i=2;i<n;i++) { q[0]=q[i]; long low=1; long high=i-1; while(low<=high) { long m=(low+high)/2; if(q[0]=high+1;--j) q[j+1]=q[j]; q[high+1]=q[0]; } LARGE_INTEGER liPerfNow={0}; QueryPerformanceCounter(&liPerfNow); double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; // Print(q,n); cout<<"\n折半插入排序时间消耗:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值