1052400101 周谒真 C语言实训报告 电子信息科学与技术一班
void Exit(); //主函数 void main() {
CreateHeadLink();//调用建立表头函数 DesplayMenu();//调用菜单显示函数 }
/************************************* 函数功能:显示菜单,根据用户的输入信息 来完成对应的功能
*************************************/ void DesplayMenu() {
STUDENT *p;
printf(\***********************\
printf(\欢 迎 使 用 学 生 成 绩 管 理 系 统\\n\
printf(\.排序 (按学号)\\n\ printf(\.插入 (录入)\\n\
printf(\.查找 (输入一个学生学号,输出其各科成绩)\\n\
printf(\.删除 (从数组中按输入的学号删除该学生)\\n\
printf(\.统计\\n\ printf(\.退出\\n\
printf(\***********************\
printf(\请输入序号进行操作: \ scanf(\从终端读入一个值进行菜单选择 getch();
system(\ switch(choose) {
case 1:CompositorBystudentNumber();break; case 2:
p=MallocNode();//让p指向新节点的首地址 GetInformation(p);//获取学生信息
InsertOneNode(p);break;//插入学生信息 case 3:DesplayInfoBystudentNumber();
break;
case 4:DeleteNodeBystudentNumber();break; case 5:CompositorMenu();break;
6
1052400101 周谒真 C语言实训报告 电子信息科学与技术一班
case 6:Exit();break; }
getch();
system(\
DesplayMenu();//递归调用菜单显示函数 }
/************************************* 函数功能:建立链表表头
*************************************/ void CreateHeadLink() {
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));//在内存中开辟一个大小为sizeof(STUDENT)的空间并使p指向它的首地址 headLink=p;//令链表head指针指向p指针 p->next=NULL;//初始化链表 }
/************************************* 函数功能:申请一个新结点,并将其初始化 *************************************/ STUDENT *MallocNode() {
STUDENT * p;//定义一个STUDENT变量 int i;
p=(STUDENT*)malloc(sizeof(STUDENT));//在内存中开辟一个大小为sizeof(STUDENT)的空间并使p指向它的首地址
if(p==NULL)//如果p指向的是空地址,那么返回一个空值 {
return NULL; }
for(i=0;i<10;i++)//下面全是初始化 {
p->studentNumber[i]='\\0'; }
for(i=0;i<10;i++) {
p->studentName[i]='\\0'; }
for(i=0;i<10;i++) {
p->studentNumber[i]='\\0'; }
p->mark1=0.0; p->mark2=0.0;
7
1052400101 周谒真 C语言实训报告 电子信息科学与技术一班
p->mark3=0.0; p->next=NULL; return p; }
/************************************* 函数功能:取得用户输入的学生信息
*************************************/ void GetInformation(STUDENT *t) {
printf(\***********************\\n\
printf(\请输入学生学号: \ scanf(\
printf(\请输入学生姓名: \ scanf(\
printf(\请输入学生英语成绩: \ scanf(\
printf(\请输入学生数学成绩: \ scanf(\
printf(\请输入学生计算机成绩: \ scanf(\
printf(\录入成功!按任意键返回上级。。。\}
/************************************* 函数功能:在链表的结尾处增加一个节点 *************************************/ void InsertOneNode(STUDENT *t) {
STUDENT *p; p=headLink;
while(p->next)//当p不指向空地址时,就指向下一个地址 {
p=p->next; }
p->next=t;//在最后一个空地址中插入学生的信息 }
/************************************* 函数功能:根据用户输入的学生学号显示该 学生信息
*************************************/ void DesplayInfoBystudentNumber() {
STUDENT *p;
8
1052400101 周谒真 C语言实训报告 电子信息科学与技术一班
char studentNumber[10];
char flag=0;//这里作为一个判断变量,意在判断是否存在学号为用户输入值的学生
p=headLink->next;//初始化head指针 printf(\请输入学生学号\
scanf(\输入学生学号字符串 while(p) {
if(strcmp(p->studentNumber,studentNumber)==0)//在链表中查找相同学号的学生,如果找到了则输出他们的信息 {
printf(\学号\\t姓名\\t英语\\t数学\\t计算机\\t总成绩\\t平均成绩\\n\\n\
DesplayOneNode(p); flag=1; break; }
p=p->next; }
if(!flag) {
printf(\对不起,不存在学号为%s的学生\\n\ } }
/************************************* 函数功能:输出一个节点的信息
*************************************/ void DesplayOneNode(STUDENT *t) {
printf(\输出该结构体对象的信息 printf(\ printf(\ printf(\ printf(\
printf(\
printf(\}
/************************************* 函数功能:根据用户输入的学号删除该学生 *************************************/ void DeleteNodeBystudentNumber() {
char studentNumber[10]; STUDENT *p,*q;
9
1052400101 周谒真 C语言实训报告 电子信息科学与技术一班
char flag=0;
printf(\请输入要删除的学生学号: \
scanf(\输入学生学号字符串 p=headLink;
q=headLink->next;
while(q)//当q不指向空地址的时候,查找与用户输入的学号相一致的学生,并删除 {
if(strcmp(q->studentNumber,studentNumber)==0)//strcmp函数比较两个字符串是否相同 {
p->next=q->next;
free(q);//释放q指向地址的空间 flag=1; break; }
p=p->next;//把下一个人的地址补空,下同 q=q->next; }
if(!flag) {
printf(\不存在该学号的学生\\n\ return; }
printf(\成功删除\\n\}
/************************************* 函数功能:根据用户输入的学号排序
*************************************/ void CompositorBystudentNumber() {
STUDENT exchange,*r,*p,*q; r=headLink->next;
if(r==NULL)//当指针指向空地址时则认为没有学生信息 {
printf(\现在还没有学生信息,请先输入学生信息\\n\ return; }
while(r)//用r,q构成循环,使用冒泡法进行排序, {
p=r;
q=r->next; while(q) {
10