📄
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[9];
float score[5];
student *next;
};
student *InsertStudent(student *h);
student *DeleteStudent(student *h);
student *SortClass(student *h);
student *EditMarks(student *h);
void ShowClass(student *h);
void drawline();
//student *head;
/*mian*/
//---------------------------------------------------
int main()
{
//===========
int i;
student *head,*p1; //建立链表
head=new student;
printf("请先输入第一个学生的姓名以创建一个class:\n");
scanf("%s",head->name);
for(i=0;i<5;i++)
head->score[i]=0;
p1=head;
p1->next=NULL;
//=============
char line[100];
int menu;
while(1) {
drawline();
printf("\n");
printf("Enter (1) to Add a Student to Class List\n"
" (2) to Delete a Student from Class List\n"
" (3) to show Class List\n"
" (4) to Edit marks of a Student\n"
" (5)to SortClass\n"
" (6) to Quit\n");
drawline();
fflush(stdout);
gets(line);
if (sscanf(line,"%d",&menu) != 1)
{
printf("incorrect entry");
continue;
}
if (menu < 1 || menu >7)
{
printf("incorrect selection");
continue;
}
else if (menu == 1)
head=InsertStudent(head);
else if (menu == 2)
head=DeleteStudent(head);
else if (menu == 3)
ShowClass(head);
else if (menu == 4)
head=EditMarks(head);
else if (menu == 5)
head=SortClass(head);
else if (menu == 6)
exit(0);
else
break;
}/*endwhile*/
return 0;
}/*end main*/
/*InsertClass*/
//-----------------------------------------------------
student *InsertStudent(student *h)
{
drawline();
student *p1,*p2;
p2=new student; //定义插入的学生指针
int i,k=0;
p1=h;
printf("请输入学生姓名: \n");
scanf("%s",p2->name);
for(i=0;i<5;i++)
p2->score[i]=0;
while(p1!=NULL){
if((strcmp(p2->name,p1->name))==0){ //判断是否已存在,若存在则k=1;
k=1;
printf("该学生信息已经存在,请确认。\n");
break;
}
else p1=p1->next;
}
if(k==0){ //k=0,可以插入新学生信息
p1=h;
while(1){
if(p1->next==NULL)break; //找到连表末
else p1=p1->next;
}
p1->next=p2;p2->next=NULL; //在末端插入新学生信息
}
return h;
drawline();
}
/*end insertstudent*/
/*deletestudent*/
//-------------------------------------------
student *DeleteStudent(student *h)
{
drawline();
int k=0;
char q;
student *p1,*p2,*px;
if(h->next==NULL)printf("还没有学生信息,请确认。\n");
else{
p1=h;
px=new student;
printf("请输入要删除的学生姓名:\n");
scanf("%s",px->name); //输入要删除的学生姓名
while(1){
if((strcmp(px->name,p1->name))==0) {
k=0;
break;
} //判断是否存在该学生信息
p1=p1->next;
if(p1==NULL) {
k=1 ;
printf("你要删除的学生信息不存在。\n");
break;
}
}
if(k==0){ //存在则执行下去
while(1){
printf("是否要删除?若是请输入y,取消输入n。\n") ;//确认是否要删除
scanf("%s",&q);
if(q=='y'||q=='n')break;
else printf("你的输入不正确,请确认:\n");
}
if(q=='y') //若是则执行删除
{
p1=h;
if((strcmp(px->name,h->name))==0){
h=h->next;delete p1; //是否为头结点 ,是则删除,头指针后移
}
else
while(p1->next!=NULL)
{ p2=p1->next;
if((strcmp(px->name,p2->name))==0){
p1->next=p2->next; //跳过p2结点,连接下一结点
delete p2;break;
}
else p1=p2; //继续传递链结
}
printf("已经删除该学生信息,请确认。\n");
}
}
}
return h;
drawline();
}/* end deletestudent*/
/*editmarks*/
//---------------------------------------
student *EditMarks(student *h)
{
int i,k=1;
drawline();
student *p1,*p2,*px;
px=new student;
p1=h;
printf("若对整个class进行成绩编辑,请输入1,对单个成绩进行编辑请输入2:\n");
scanf("%d",&k);
if(k==1)
do{
printf("请输入学生 %s 的成绩:\n",p1->name);
for(i=0;i<5;i++)
scanf("%f",&p1->score[i]);
p1=p1->next;
}while(p1!=NULL);
if(k==2){
printf("请输入要编辑的学生姓名:\n");
scanf("%s",px->name);
//-----
while(1){
if((strcmp(px->name,p1->name))==0) {
k=0;
p2=p1;
break;
} //判断是否存在该学生信息
p1=p1->next;
if(p1==NULL) {
k=1 ;
printf("你要修改的学生信息不存在。\n");
break;
}
}
//-----
if(k==0){
printf("请输入学生 %s 的成绩:\n",px->name);
for(i=0;i<5;i++)
scanf("%f",&p2->score[i]);
}
}
else printf("你的输入不正确,请确认。");
return h;
//-----------------
drawline();
}/*end editmarks*/
/*sortClass*/
//-------------------------------
student *SortClass(student *h)
{
drawline();
int n=0,i;
student *p1,*p2,*p3;
p1=h;
while(p1!=NULL){ //循环比较
p2=p1->next; p3=h;
while(p2!=NULL){
if((strcmp(p2->name,p1->name))<0){
if(p1==h){
p1->next=p2->next;p2->next=p1;h=p2; //当p1为头指针时,交换接点的情况
}
else{
p3->next=p1->next;p1->next=p2->next;p2->next=p1; //当p1不为头指针时的情况
}
}
p2=p2->next;
}
++n;
for(i=0;i<n-1;i++)p3=p3->next; //记录P1接点前的接点
p1=p1->next;
}
return h;
drawline();
}/*end sortclass*/
/*showClass*/
//--------------------------------------
void ShowClass(student *h)
{
int i;
drawline();
student *p1;
p1=h;
printf("学生姓名 科1 科2 科3 科4 科5 \n");
do{
printf("%s \n",p1->name);
for(i=0;i<5;i++)
printf(" %.1f",p1->score[i]);
printf("\n");
p1=p1->next;
}while(p1!=NULL);
drawline();
}
/*end ShowClass*/
void drawline()
{
int i;
//----------------
for(i=0;i<50;i++)
{
printf("-");
}
printf("\n");
//--------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -