用C语言编写学生信息管理程序(给出五个主要函数就OK啦!)

如题所述

第1个回答  2020-03-23
/*接上一楼*/
struct
Student
*create()
/*create函数定义,此函数实现创建单向动态链表*/
{
struct
Student
*head=NULL,*p1,*p2;
/*head,链表的头指针;*p1,*p2,中间指针变量*/
puts("\n现在请输入学院名:");
scanf("%s",college);
puts("\n年级:");
scanf("%s",grade);
puts("\n专业和班级:");
scanf("%s",classname);
puts("\n下面请按提示依次输入数据:\n(如果要结束输入,请输入学号0)");
p1=p2=(struct
Student
*)malloc(LEN);
puts("输入第一个学生的学号:");
scanf("%ld",&p1->num);
puts("输入此学生成绩:\n英语:");
scanf("%f",&p1->score.english);
puts("数学:");
scanf("%f",&p1->score.math);
puts("计算机:");
scanf("%f",&p1->score.computer);
total_and_aver(p1);/*计算总分和平均分*/
p1->grade=mark_grade(p1);
for(;p1->num!=0;)
{
len++;
if(len==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct
Student
*)malloc(LEN);
puts("输入下一个学生的学号:");
scanf("%ld",&p1->num);
puts("输入此学生成绩:\n英语:");
scanf("%f",&p1->score.english);
puts("数学:");
scanf("%f",&p1->score.math);
puts("计算机:");
scanf("%f",&p1->score.computer);
total_and_aver(p1);/*计算总分和平均分*/
p1->grade=mark_grade(p1);
}
p2->next=NULL;
return
(head);
}
struct
Student
*del(struct
Student
*head,long
del_num)
/*del函数定义,此函数实现从现有链表中删除一个结点*/
{
struct
Student
*p1,*p2;
if(head==NULL)
puts("空表,没有任何数据记录。\n");
else
{
for(p1=head;!(del_num==p1->num||p1->next==NULL);p2=p1,p1=p1->next);
if(del_num==p1->num)
{
if(p1==head)head=p1->next;
else
p2->next=p1->next;
printf("学号为%ld学生的数据删除成功。\n",del_num);
--len;
}
else
printf("未找到学号为%ld学生的记录。\n",del_num);
}
return
(head);
}
struct
Student
*insert(struct
Student
*head,struct
Student
*new_student)
/*insert函数定义,此函数实现向现有链表中插入一个结点或覆盖相同学号的数据*/
{
struct
Student
*p0=new_student,*p1=head,*p2;
char
control;
if(head==NULL)
{
head=p0;
p0->next=NULL;
puts("数据插入成功。\n");
}
else
{
for(;((*p0).num>(*p1).num)&&(p1->next!=NULL);p2=p1,p1=p1->next);
if((*p0).num==(*p1).num)
{
printf("已经存在一个学号为%ld的学生的数据,要覆盖原有数据吗?\n输入
Y
=覆盖原有数据\n输入其它=保留原有数据\n",p0->num);
FFLUSH;
scanf("%c",&control);
FFLUSH;
switch
(control)
{
case
'Y':
case
'y':if(p1==head){head=p0;p0->next=p1->next;}
else
{p2->next=p0;p0->next=p1->next;}
puts("数据已经更新\n");break;
default:break;
}
len--;
}
else
if((*p0).num<(*p1).num)
{
if(p1==head)head=p0;
else
p2->next=p0;
p0->next=p1;
puts("数据插入成功。\n");
}
else
{
p1->next=p0;
p0->next=NULL;
puts("数据插入成功。\n");
}
}
++len;
return
(head);
}
struct
Student
*sort(struct
Student
*head)
/*sort函数定义,此函数实现对链表中的数据按照平均分高低排序*/
{
struct
Student
*p1,*p2;
for(p1=head;p1->next!=NULL;p1=p1->next)
for(p2=p1->next;p2!=NULL;p2=p2->next)
{
if(p1->score.average<p2->score.average)
{
SWAP(p1->num,p2->num);
SWAP(p1->grade,p2->grade);
SWAP(p1->score.english,p2->score.english);
SWAP(p1->score.math,p2->score.math);
SWAP(p1->score.computer,p2->score.computer);
SWAP(p1->score.total,p2->score.total);
SWAP(p1->score.average,p2->score.average);
}
}
return
head;
}
/*接下一楼*/
相似回答