⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 实现学生信息管理
💻
字号:
#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 + -