算是简单的学生教务管理系统-C语言指针

这份代码,仅仅必须在VC 6.0上运行,如果用Dev C++的小伙伴,需要吧除main函数之外的函数名,进行在库函数一下进行定义即可,本人(太懒了)就不在此进行修改了,结构有点乱,是之前老师给的样板,同时希望大家学到一些东西!

#include<stdio.h>
#include<string.h>

//结构体类型定义
struct student      
{ long num;             //学号
  int score[3];         //三门课成绩
  float aver;           //平均分
  char name[20];        //姓名
  struct student *next; //指针域,指向链表的下一个结点
};
typedef struct student STU;    //为struct student结构体类型定义别名STU

/*输入学生学号和各课成绩,并计算平均分*/
STU *insert(STU *head)
{STU *new,*p,*q;
 int j;
 /*输入数据生成一个新结点*/
 new=(STU *)malloc(sizeof(STU));
 printf("\n姓名:"); scanf("%s",new->name);
 printf("\n学号:"); scanf("%ld",&new->num);
 printf("\n英语 高数 计算机:\n");
 new->aver=0;
 for(j=0;j<3;j++)
	{scanf("%d",&new->score[j]);
	 new->aver+=new->score[j];
	}
  new->aver/=3;
  /*新结点按照学号从小到大插入链表*/
  p=head;
  if(head==NULL) /*链表是空链表*/
	  {head=new;
	   new->next=NULL;
	  }
  else
	  {/*寻找插入位置*/
	   while((p->next!=NULL)&&(p->num<new->num))
			{q=p; p=p->next;}
	   if(p->num>=new->num) 
			{if(head==p) /*链表非空,插入到第一个结点前*/
				{new->next=head; head=new;}
			 else /*链表非空,插入到链表中间*/
				{q->next=new; new->next=p;}
			}
	   else /*链表非空,插入到链表末尾*/
			{p->next=new; new->next=NULL;}
	  }
  return(head);
}

/*按照输入学生的学号查找各科成绩和平均分*/
void search_num(STU *head) 
{STU *p;
 long in_num;
 printf("\n请输入要查询的学生学号:");
 scanf("%ld",&in_num);
 p=head;
 if(head==NULL) /*链表是空链表*/
	 printf("无学生数据!\n");
 while((p->next!=NULL)&&(p->num!=in_num)) /*寻找结点位置*/
	 p=p->next;
 if(in_num==p->num)
	 printf("\n姓名:%s,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
	 p->name,p->score[0],p->score[1],p->score[2],p->aver);
 else
	 printf("查无此学号\n");
} 

/*按照输入学生的姓名查找各科成绩和平均分*/
void search_name(STU *head)  
{STU *p;
 char in_name[20];
 printf("\n请输入要查询的学生姓名:");
 scanf("%s",in_name);
 p=head;
 if(head==NULL) /*链表是空链表*/
	 printf("无学生数据!\n");
 while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找结点位置*/
	 p=p->next;
 if((strcmp(p->name,in_name)==0))
	 printf("\n学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
	 p->num,p->score[0],p->score[1],p->score[2],p->aver);
 else
	 printf("查无此姓名%s!\n",in_name);
} 

/*查找平均分最高的学生姓名、学号、平均分*/
void search_max(STU *head) 
{STU *p=head;
 long high_num;
 float max=0;
 while(p!=NULL) /*寻找平均分最高的学生学号*/
	 {if(p->aver>max)
		{max=p->aver; high_num=p->num;}
	  p=p->next;
	 }
  /*寻找平均分最高的学生位置*/
  p=head;
  while((p->next!=NULL)&&(p->num!=high_num))
	  p=p->next;
  printf("\n姓名:%s,学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
	  p->name,p->num,p->score[0],p->score[1],p->score[2],p->aver);
}

/*查找平均分不及格的学生姓名、学号、平均分*/
void search_fail(STU *head) 
{STU *p=head;
 while(p!=NULL)
 {if(p->aver<60)
	printf("\n姓名:%s,学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
	  p->name,p->num,p->score[0],p->score[1],p->score[2],p->aver);
  p=p->next;
 }
}

//主菜单的查找功能
void search(STU *head) 
{int x; /*x为菜单的选择*/
 while(1)
 {printf("\n\n\t\t  查询子菜单\n");
  printf("\t\t============\n");
  printf("\t\t1.按学生学号查询成绩\n");
  printf("\t\t2.按学生姓名查询成绩\n");
  printf("\t\t3.查询平均分最高的学生姓名\n");
  printf("\t\t4.查询平均分不及格的学生姓名\n");
  printf("\t\t0.返回主菜单\n");
  printf("\t\t============\n");
  printf("\t请选择(0~4):\n"); scanf("%d",&x);
  switch(x)
  {case 1:search_num(head); break;
   case 2:search_name(head); break;
   case 3:search_max(head); break;
   case 4:search_fail(head); break;
   case 0:break;
   default:printf("\n输入错误,请重新输入!");
  }
  if(x==0) break;
 }
}

/*按照输入学生的学号删除记录*/
void *dele_num(STU *head) 
{STU *p,*q;
 long in_num;
 printf("\n请输入要删除的学生学号:");
 scanf("%ld",&in_num);
 p=head;
 if(head==NULL)  /*链表是空链表*/
	 {printf("无学生数据!\n");
	  return(head);  }
 while((p->next!=NULL)&&(p->num!=in_num)) /*寻找删除结点位置*/
	{q=p; p=p->next;}
 if(p->num==in_num)
	{if(head==p) head=p->next; /*删除链表第一个结点*/ 
	 else q->next=p->next;/*删除链表结点*/
	 free(p);
	 printf("已删除\n");
	}
 else
	 printf("数据库中无此学生学号!\n");
 return(head);
} 

/*按照输入学生的姓名删除记录*/
STU *dele_name(STU *head) 
{STU *p,*q;
 char in_name[20];
 printf("\n请输入要删除的学生姓名:");
 scanf("%s",in_name);
 p=head;
 if(head==NULL)  /*链表是空链表*/
	 {printf("无学生数据!\n");
	  return(head);  }
 while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找删除结点位置*/
	{q=p; p=p->next;}
 if(strcmp(p->name,in_name)==0)
	{if(head==p) head=p->next; /*删除链表第一个结点*/ 
	 else q->next=p->next;/*删除链表结点*/
	 free(p);
	 printf("已删除\n");
	}
 else
	 printf("数据库中无此学生姓名!\n");
 return(head);
}  

//主菜单的删除功能
STU *dele(STU *head) 
{int x; /*x为菜单的选择*/
 while(1)
 {printf("\n\n\t\t  删除子菜单\n");
  printf("\t\t============\n");
  printf("\t\t1.按学生学号删除记录\n");
  printf("\t\t2.按学生姓名删除记录\n");
  printf("\t\t0.返回主菜单\n");
  printf("\t\t============\n");
  printf("\t请选择(0~2):\n"); scanf("%d",&x);
  switch(x)
  {case 1:head=dele_num(head); break;
   case 2:head=dele_name(head); break;
   default:printf("\n输入错误,请重新输入!");
  }
  if(x==0) break;
 }
 return(head);
}

/*按照输入学生的学号修改记录*/
STU *modi_num(STU *head)  
{STU *p;
 long in_num; int j;
 printf("\n请输入要修改的学生学号:");
 scanf("%ld",&in_num);
 p=head;
 if(head==NULL) /*链表是空链表*/
	 {printf("无学生数据!\n");
	  return(head);	 }
 while((p->next!=NULL)&&(p->num!=in_num)) /*寻找要修改结点的位置*/
	p=p->next;
 if(p->num==in_num)
	{printf("\n姓名:"); scanf("%s",p->name);
	 printf("\n英语 高数 计算机:\n");
	 p->aver=0;
	 for(j=0;j<3;j++)
		 {scanf("%d",&p->score[j]);
		  p->aver+=p->score[j]; }
	 p->aver/=3;
	}
 else
	 printf("数据库中无此学生学号!\n");
 return(head);
}

/*按照输入学生的姓名修改记录*/
STU *modi_name(STU *head)  
{STU *p;
 char in_name[20]; int j;
 printf("\n请输入要修改的学生姓名:");
 scanf("%s",in_name);
 p=head;
 if(head==NULL) /*链表是空链表*/
	 {printf("无学生数据!\n");
	  return(head);	 }
 while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找要修改结点的位置*/
	p=p->next;
 if((strcmp(p->name,in_name)==0))
	{printf("\n姓名:"); scanf("%s",p->name);
	 printf("\n英语 高数 计算机:\n");
	 p->aver=0;
	 for(j=0;j<3;j++)
		 {scanf("%d",&p->score[j]);
		  p->aver+=p->score[j]; }
	 p->aver/=3;
	}
 else
	 printf("数据库中无此学生学号!\n");
 return(head);
}

//主菜单的修改功能
STU *modi(STU *head) 
{int x; /*x为菜单的选择*/
 while(1)
 {printf("\n\n\t\t  修改成绩子菜单\n");
  printf("\t\t============\n");
  printf("\t\t1.按学生学号修改记录\n");
  printf("\t\t2.按学生姓名修改记录\n");
  printf("\t\t0.返回主菜单\n");
  printf("\t\t============\n");
  printf("说明:若修改学号,请选择删除该学号,再输入\n");
  printf("\t请选择(0~2):\n"); scanf("%d",&x);
  switch(x)
  {case 1:head=modi_num(head); break;
   case 2:head=modi_name(head); break;
   default:printf("\n输入错误,请重新输入!");
  }
  if(x==0) break;
 }
 return(head);
}

/*按照学号从小到大顺序显示输出*/
void output(STU *head)  
{STU *p=head;
 if(head==NULL) /*链表是空链表*/
	 printf("无学生数据!\n");
 else
	 {printf("\n   学号\t\t姓名\t英语\t高数\t计算机\t平均分\n");
	  while(p!=NULL)
		  {printf("%8ld%12s%8d%8d%8d%8.1f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
		   p=p->next; }
	 }
}

//主函数
void main()
{int x;             /*x为菜单的选择*/
 STU *head=NULL;
 while(1)
 {printf("\n\t\t\t主菜单\n");
  printf("\t==================================\n");
  printf("\t\t1. 输入学生成绩\n");
  printf("\t\t2. 查询学生成绩\n");
  printf("\t\t3. 删除学生成绩\n");
  printf("\t\t4. 修改学生成绩\n");
  printf("\t\t5. 打印输出成绩\n");
  printf("\t\t0. 退出系统\n");
  printf("\t==================================\n");
  printf("\t请选择(0~5):"); 
  scanf("%d",&x);
  switch(x)
  {case 1:head=insert(head); break;
   case 2:search(head); break;
   case 3:head=dele(head); break;
   case 4:head=modi(head); break;
   case 5:output(head); break;
   case 0:printf("谢谢使用!");break;
   default:printf("\n输入错误,请重新输入!"); break;
  }
  if(x==0) break;
 }
}

  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值