问题及代码:
/*
* 烟台大学计算机与控制工程学院
* 作者:孙启先
* 完成日期:2016年12月23日
* 问题描述: 实现对考生报考相应类别考试的管理和相关操作。
*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct student
{
int num;
char sex[10];
char name[10];
int age;
char address[10];
int type;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
ElemType e;
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void DestroyList(LinkList *&L)
{
LinkList *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
printf("此链表为空,请重新选择,创建链表\n\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("输入考号(不能相同) 姓名 性别 籍贯 年龄 考试类别(1.英语2.电脑3.数学4.语文5.其它)\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
}
void DispList(LinkList *L)
{
LinkList *p=L->next; //定义LinkList *p 指向第一个元素结点
while (p!=NULL) //用while循环逐次输出链表元素(条件是p!=null)
{ printf("考号(不能相同) 姓名 性别 籍贯 年龄 考试类别(1.英语2.电脑3.数学4.语文5.其它)\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");
}
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.age);
printf("考试类别(1.英语2.电脑3.数学4.语文5.其它):");
printf("%d\n",p->data.type);
return 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;
}
}
int create(LinkList *&L) //定义ElemType i 作为修改考号的对象
{
printf("请输入要修改人的考号i=");
scanf("%d",&e.num);
LinkList *p=L; // 定义LinkList *p 指向头结点
while (e.num!=p->data.num&&p!=NULL) // 用while循环查找该结点
{
p=p->next;
}
if (p==NULL)
return 0;
else
{
printf("请输入考号\n");
scanf("%d",&e.num);
if(p->data.num==e.num)
{
printf("允许修改,请输入:姓名 性别 籍贯 年龄 考试类别(1.英语2.电脑3.数学4.语文5.其它)\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 (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.num<p->data.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,m=0,h=0,i=0,j=0,k=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++;
if(p->next->data.type==5)
k++;
p=p->next;}
printf("报考的总人数是n=");
printf("%d\n",n);
printf("报考英语的人数是e=");
printf("%d\n",m);
printf("报考数学的人数是m=");
printf("%d\n",h);
printf("报考电脑的人数是c=");
printf("%d\n",i);
printf("报考语文的人数是k=");
printf("%d\n",j);
printf("报考其它的人数是q=");
printf("%d\n",k);
}
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("输入考号(不能相同) 姓名 性别 籍贯 年龄 考试类别(1.英语2.电脑3.数学4.语文5.其它)\n");
while(p->next!=NULL) ///用while循环找到尾结点,插入新元素
p=p->next;
for (i=0;i<n;i++)
{ 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);
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语句,编写选择项目</span>
{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<<"**************************************"<<endl;
cout<<"**************************************"<<endl;
cout<<" 欢迎再次使用 "<<endl;
cout<<"**************************************"<<endl;
cout<<"**************************************"<<endl;
exit(0);
}
}
}
}
int main()
{
LinkList *L; //定义LinkList *L</span>
InitList(L); //调用初始化线性表函数</span>
Display(L); //调用显示菜单函数</span>
return 0;
}
运行结果: