C语言——学生信息管理系统(链表&菜单&最强版)

 有主菜单,和四个功能子菜单!功能强大!!!

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#define SIZE 40/*符号常量:班级人数*/

//学生结构 
struct student
{
	int sno;
	char sname[20];
	char sex[10];
	char Dept[100];
	int age;

};
//学生自然信息结构 
struct Node_s
{
	student data;
	Node_s *next; 
};
//课程结构 
struct course
{
	int cno;
	char cname[30];
	int credit;
};
//学生课程信息结构 
struct Node_c
{
	course data;
	Node_c *next; 	
};
//学生选课成绩结构
struct sc
{
	int sno;
	int cno;
	float grade;
};
struct Node_sc
{
	sc data;
	Node_sc *next;
};

Node_s *create_s();//建立学生自然信息链表1 
Node_c *create_c();//建链课程链表2
Node_sc *create_sc();//建立学生选课成绩链表3
void traversal(Node_s *phead_s);//遍历1 
void traversal(Node_c *phead_c);//遍历2 
void traversal(Node_sc *phead_sc);//遍历3
void fileOutput_new(Node_s *phead_s);//存盘 4
void fileOutput_new(Node_c *phead_c);//存盘 5
void fileOutput_new(Node_sc *phead_sc);//存盘 6
void fileOutput(Node_s *phead_s);//存盘 1
void fileOutput(Node_c *phead_c);//存盘 2
void fileOutput(Node_sc *phead_sc);//存盘 3
Node_s *fileInput_s();//读盘 1
Node_c *fileInput_c();//读盘 2
Node_sc *fileInput_sc();//读盘 3 
void query(Node_s *phead);//4按学号查询学生自然信息 
void query(Node_sc *phead);//5按学号和课程号查询学生成绩
void query_all(Node_sc *phead);//6按学号查询学生的成绩明细 
void faildata(Node_s*phead_s,Node_sc*phead_sc);//不及格学生数据统计 
void findage(Node_s *phead);//统计年龄 
Node_s *deletion(Node_s* phead);//删除学生数据 
Node_c *deletion(Node_c* phead);//删除课程数据 
Node_sc *deletion(Node_sc* phead);//删除学生单科成绩数据 
Node_sc *deletion_all(Node_sc* phead);//删除学生所有成绩 
Node_s *alter(Node_s* phead);// 修改学生数据 
Node_c *alter(Node_c* phead);//修改课程数据 
Node_sc *alter(Node_sc* phead);//修改成绩数据 
void findgrade(Node_sc *phead);
void querySexnumber(Node_s* phead);//查询男女学生人数
void querySurname(Node_s *phead);//查询姓氏学生人数  
void queryDept(Node_s *phead);//查询专业学生人数 
void queryAge(Node_s *phead);//查询年龄学生人数 
int count(Node_s *phead);//学生人数统计 

int main()
{	int a,b,c,d,e; 
	Node_s *phead_s = NULL;
	Node_c *phead_c = NULL;
	Node_sc *phead_sc = NULL; 
	for(;;)
	{
		system("cls");
		//system("color 5F");
		printf("                                      		        \n");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*                  学生信息管理系统                *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*                      主菜单                      *\n");
		printf("*                                                  *\n");
		printf("*                  1.录入数据功能菜单              *\n");
		printf("*                  2.数据查询功能菜单              *\n");
		printf("*                  3.数据修改功能菜单              *\n");
		printf("*                  4.数据删除功能菜单              *\n");
		printf("*                  0.  退出                        *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*                                   制作人:  飞宇 *\n");
		printf("****************************************************\n");
		printf("----------------------\n选择数字(0-4):\n"); 
		printf("选择学生信息管理功能:");
		scanf("%d",&a);//程序选项 
		system("cls");
		switch(a)
		{
			case 1 :
			{
				while(1)
				{
		system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*                 录入数据功能菜单                 *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*               1.输入学生自然数据                 *\n");
		printf("*               2.输入课程数据                     *\n");
		printf("*               3.输入学生选课成绩数据             *\n");
		printf("*               0.  返回上一菜单                   *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("------------------------------\n选择数字(0-3):\n"); 
		printf("选择软件功能菜单功能:");
					scanf("%d",&b);//程序选项 
					system("cls");
					if(b == 1)
					{
						printf("功能 1.  学生自然数据输入开始...\n");
						phead_s = create_s();
						fileOutput(phead_s);
						system("pause");
					}
					if(b == 2)
					{
						printf("功能 2.  课程数据输入开始...\n");
						phead_c = create_c();
						fileOutput(phead_c);
						system("pause");
					}
					if(b == 3)
					{
						printf("功能 3.  学生选课成绩数据输入开始...\n");
						phead_sc = create_sc();
						fileOutput(phead_sc);
						system("pause");
					}
					if(b == 0)
					{
						break;
					}
					
				}
			}
				break;
				
			case 2 :
			{
				while(1)
				{
					system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*                 数据查询功能菜单                 *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*               1.查询所有学生数据                 *\n");
		printf("*               2.查询所有课程数据                 *\n");
		printf("*               3.查询所有学生选课及成绩数据       *\n");
		printf("*               4.按学号查询某学生自然信息         *\n");
		printf("*               5.按学号和课程号查询学生成绩       *\n");
		printf("*               6.按学号查询学生的成绩明细         *\n");
		printf("*               7.统计平均分不及格学生数据         *\n");
		printf("*               8.查询不同年龄对应学生人数         *\n");
		printf("*               9.输出成绩明细 平均成绩及名次      *\n");
		printf("*               10.查询男女学生人数                *\n");
		printf("*               11.按姓氏查询学生信息              *\n");
		printf("*               12.查询专业学生人数                *\n");
		printf("*               13.统计学生人数总和                *\n");
		printf("*               0.    返回上一菜单                 *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("-----------------------------------\n选择数字(0-13):\n"); 
		printf("选择数据查询功能:");
					scanf("%d",&c);//程序选项 
					system("cls");
					if(c == 1)
					{
						printf("功能 1.  查询所有学生数据开始...\n");
						phead_s = fileInput_s();
						traversal(phead_s);
						system("pause");
					}
					if(c == 2)
					{
						printf("功能 2.  查询所有课程数据开始...\n");
						phead_c = fileInput_c();
						traversal(phead_c);
						system("pause");
					}
					if(c == 3)
					{
						printf("功能 3.  查询所有学生选课及成绩数据开始...\n");
						phead_sc = fileInput_sc();						
						traversal(phead_sc);
						system("pause");
					}
					if(c == 4)
					{
						printf("功能 4.  按学号查询学生数据开始...\n");
						phead_s = fileInput_s();						
						query(phead_s);
						system("pause");
					} 
					if(c == 5)
					{
						printf("功能 5.  按学号和课程号查询学生成绩开始...\n");
						phead_sc = fileInput_sc();								
						query(phead_sc);
						system("pause");
					}
					if(c == 6) 
					{
						printf("功能 6.  按学号查询学生成绩明细开始...\n");
						phead_sc = fileInput_sc();								
						query_all(phead_sc);
						system("pause");
					}
					if(c == 7) 
					{
						printf("功能 7.  统计平均分不及格学生数据开始...\n");
						phead_s = fileInput_s();
						phead_sc = fileInput_sc();	
						faildata(phead_s,phead_sc);
						system("pause");
					}
					if(c == 8) 
					{
						phead_s = fileInput_s();
						printf("功能 8.  统计不同年龄对应人数开始...\n");
						findage(phead_s);
						system("pause"); 
					}
					if(c == 9)
					{
						printf("功能 9.  输出成绩明细 平均成绩及名次开始...\n");
						phead_sc = fileInput_sc();
						findgrade(phead_sc);
						system("pause");
					}
					if(c == 10)
					{
						printf("功能 10.  查询男女学生人数开始... \n");
						phead_s = fileInput_s();
						querySexnumber(phead_s);//查询性别人数 
						system("pause");
					 } 
					if(c == 11)
					{
						printf("功能 11.  查询姓氏学生人数开始... \n");
						phead_s = fileInput_s();
						querySurname(phead_s);//查询姓氏人数 
						system("pause");
					 } 
					 if(c == 12)
					 {
					 	printf("功能 12.  查询学生专业人数开始...\n");
					 	phead_s = fileInput_s();
					 	queryDept(phead_s);//查询学生专业人数
						system("pause") ;
					 }
					 if(c == 13)
					 {
					 	printf("功能 14.  统计学生人数\n");
						
						int People_num = count(phead_s);
	
						printf("学生人数:%d\n",People_num);
					
						system("pause");
					  } 
					if(c == 0)
					{
						break;
					} 
					
				}
			}
				break; 
			case 3 :
			{
				while(1)
				{
		system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*                 数据修改功能菜单                 *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*              1.按学号修改学生自然数据            *\n");
		printf("*              2.按课程号修改课程数据              *\n");
		printf("*              3.按学号和课程号修改学生成绩        *\n");
		printf("*              0.  返回上一菜单                    *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("-----------------------------\n选择数字(0-3):\n"); 
		printf("选择数据修改功能:");
					scanf("%d",&e);//程序选项 
					system("cls");
					if(e == 1)
					{
						printf("功能 1.  修改学生自然数据开始...\n"); 
						phead_s = fileInput_s();
						phead_s = alter(phead_s);
						fileOutput_new(phead_s);
						system("pause"); 
					}
					if(e == 2)
					{
						printf("功能 2.  修改课程数据开始...\n"); 
						phead_c = fileInput_c();
						phead_c = alter(phead_c);
						fileOutput_new(phead_c);
						system("pause"); 
					}
					if(e == 3)
					{
						printf("功能 3.  修改学生成绩数据开始...\n"); 
						phead_sc = fileInput_sc();
						phead_sc = alter(phead_sc);
						fileOutput_new(phead_sc);
						system("pause"); 
					}
					if(e == 0)
					{
						break;
					}
				}
			}	
				break; 
			case 4 :
			{
				while(1)
				{
		system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*                 数据删除功能菜单                 *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*              1.按学号删除学生数据                *\n");
		printf("*              2.按课程号删除课程数据              *\n");
		printf("*              3.按学号删除成绩数据                *\n");
		printf("*              4.按学号删除学生对应的所有成绩数据  *\n");
		printf("*              0.  返回上一菜单                    *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("----------------------\n选择数字(0-4):\n"); 
		printf("选择数据删除功能:");
					scanf("%d",&d);//程序选项 
					system("cls");
					if(d == 1)
					{	
						printf("功能 1.  删除学生数据开始...\n"); 
						phead_s = fileInput_s();
						phead_s = deletion(phead_s);
						fileOutput_new(phead_s);
						system("pause"); 
					}
					if(d == 2)
					{
						traversal(phead_c);
						printf("功能 2.  删除课程数据开始...\n");
						phead_c = fileInput_c(); 
						traversal(phead_c);
						phead_c = deletion(phead_c);
					//	fileOutput_new(phead_c);
						traversal(phead_c);
						system("pause"); 
					}
					if(d == 3)
					{
						printf("功能 3.  删除学生单科成绩数据开始...\n");
						phead_sc = fileInput_sc(); 
						phead_sc = deletion(phead_sc);
						fileOutput_new(phead_sc);
						system("pause");
					}
					if(d == 4)
					{					
						printf("功能 4.  删除学生成绩数据开始...\n");
						phead_sc = fileInput_sc(); 
						phead_sc = deletion_all(phead_sc);
						fileOutput_new(phead_sc);
						system("pause"); 
					}
					if(d == 0)
					{		
						break;
					}
				}
			}
				break;
			case 0 :
			{
				printf("     系统运行结束...\n");
				return 0;
			}
				
		}//switch
	}//for	
	return 0;
} 
//修改数据 
Node_s *alter(Node_s* phead)
{
	int varsno;
	printf("     选择所要修改学生学号:");scanf("%d",&varsno);
	Node_s *p = phead;
	while(1)
	{
		if(p->data.sno == varsno)
		{
			while(1)
			{
				int a;
				system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*               修改学生自然数据开始               *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*              1.修改姓名                          *\n");
		printf("*              2.修改性别                          *\n");
		printf("*              3.修改年龄                          *\n");
		printf("*              4.修改专业                          *\n");
		printf("*              0.  返回上一菜单                    *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("----------------\n选择修改程序(0-3)\n"); 
				scanf("%d",&a);
				system("cls");
				if(a == 1)
				{	
					printf("  修改姓名\n");
					char name[20]; 
					printf("     原姓名:%s\n",p->data.sname);
					fflush(stdin);
					printf("     更改为:");gets(name);
					strcpy(p->data.sname,name);
					system("pause");
				}
				if(a == 2)
				{
					printf("  修改性别\n");
					char sex[10]; 
					printf("     原性别:%s\n",p->data.sex);
					fflush(stdin);
					printf("     更改为:");gets(sex);
					strcpy(p->data.sex,sex);
					system("pause");
				}
				if(a == 3)
				{
					printf("  修改年龄\n");
					int age; 
					printf("     原年龄:%d\n",p->data.age );
					printf("     更改为:");scanf("%d",&age);
					p->data.age  = age;
					system("pause");
				}
				if(a == 4)
				{
					printf("  修改专业");
					char dept[21];
					printf("    原专业: %s\n",p->data.Dept);
					fflush(stdin);
					printf("    更改为:");
					gets(dept);
					strcpy(p->data.Dept,dept);
					system("pause");	 
				} 
				if(a == 0)
				{
					break;
				}
			}
			break;
		}
		p = p->next ;
	} 
	return phead;
}

Node_c *alter(Node_c* phead)
{
	int varsno;
	printf("选择所要修改课程号:");scanf("%d",&varsno);
	Node_c *p = phead;
	while(1)
	{
		if(p->data.cno  == varsno)
		{
			while(1)
			{
				int a;
		system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*               修改课程数据开始                   *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*              1.修改课程名                        *\n");
		printf("*              2.修改学分                          *\n");
		printf("*              0.  返回上一菜单                    *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("----------------\n选择修改课程数据功能(0-2)\n"); 
				scanf("%d",&a);
				system("cls");
				if(a == 1)
				{	
					printf("  修改课程名\n");
					char cname[20]; 
					printf("原姓名:%s\n",p->data.cname);
					fflush(stdin);
					printf("更改为:");gets(cname);
					strcpy(p->data.cname,cname);
					system("pause");
				}
				if(a == 2)
				{
					printf("  修改学分\n");
					int credit;
					printf("原学分: %d\n",p->data.credit );
					fflush(stdin);
					printf("更改为:");scanf("%d",&credit);
					p->data.credit = credit;
					system("pause");
				}
				if(a == 0)
				{
					break;
				}			
			}
			break;
		}
		p = p->next ;			
	} 
	return phead;		
} 
Node_sc *alter(Node_sc* phead)
{
	int varsno;
	printf("选择成绩数据修改学号:");scanf("%d",&varsno);
	Node_sc *p = phead;
	while(1)
	{	
		if(p->data.sno == varsno)
		{
			while(1)
			{
				int a;
		system("cls");
		printf("****************************************************\n");
		printf("*                                                  *\n");
		printf("*               修改成绩数据开始                   *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("*              1.修改课程号                        *\n");
		printf("*              2.修改成绩                          *\n");
		printf("*              0.  返回上一菜单                    *\n");
		printf("*                                                  *\n");
		printf("*                                                  *\n");
		printf("****************************************************\n");
		printf("----------------\n选择修改成绩数据功能(0-2)\n"); 
				scanf("%d",&a);
				system("cls");
				if(a == 1)
				{	
					printf("     修改课程号\n");
					int cno;
					printf("     原课程号:%d\n",p->data.cno);
					fflush(stdin);
					printf("     更改为:");scanf("%d",&cno);
					p->data.cno = cno;			
					system("pause");
				}
				if(a == 2)
				{
					printf("  修改成绩\n");
					float  grade;
					printf("     原成绩: %f\n",p->data.grade );
					fflush(stdin);
					printf("     更改为:");scanf("%f",&grade);
					p->data.grade = grade;
					system("pause");
				}
				if(a == 0)
				{
					break;
				}		
			}
			break;
		}
		p = p->next ;		
	} 	
	return phead;	
}
//修改后的存盘 
void fileOutput_new(Node_s *phead_s)//存盘4 
{
	if(phead_s != NULL)
	{
		FILE *fp1;							
		fp1=fopen("student.dat","wb");
		Node_s* p = phead_s;
		if(p == NULL)
		{
			fwrite(p,sizeof(student),1,fp1);
		}
		else
		{
			while(p != NULL)
			{
				fwrite(p,sizeof(student),1,fp1);
				p = p->next;
			}
		}
		fclose(fp1);//student
	}	
}
void fileOutput_new(Node_c *phead_c)//存盘5
{	if(phead_c != NULL)
	{
		FILE *fp2;							
		fp2=fopen("course.dat","wb");
		if(phead_c == NULL)
		{
			fwrite(phead_c,sizeof(student),1,fp2);
		}
		for(Node_c *p=phead_c;p!=NULL;p=p->next)
		{
			fwrite(p,sizeof(course),1,fp2);
		}
	fclose(fp2);//course
	}
	
}
void fileOutput_new(Node_sc *phead_sc)//存盘 6
{
	if(phead_sc != NULL)
	{
		FILE *fp3;							
		fp3=fopen("sc.dat","wb");
		if(phead_sc == NULL)
		{
			fwrite(phead_sc,sizeof(student),1,fp3);
		}
		for(Node_sc *p=phead_sc;p!=NULL;p=p->next)
		{
		fwrite(p,sizeof(sc),1,fp3);
		}
			fclose(fp3);
	}	
}
//数据的删除 
Node_c *deletion(Node_c* phead)//课程数据删除 
{
	int varcno;
	printf("     选择删除课程号:"); scanf("%d",&varcno);
	Node_c *p = NULL;
	Node_c *q = NULL;
	p = phead;
	q = phead;                                                                                             
	while(p != NULL)
	{
		if(phead->data.cno == varcno )
		{	
			phead = phead->next ;
			free(q);
			break;
		}//头
		
		if(p->next->data.cno  == varcno)
		{
			q = p->next;
			p->next = p->next->next ;
			free (q);
			break;
		}
		p = p->next ;
	}
	return phead; 
}
Node_sc *deletion_all(Node_sc* phead) //全部成绩数据 
{
	int varsno,i=0;
	printf("     选择删除学号  :"); scanf("%d",&varsno);
	Node_sc *p = NULL;
	Node_sc *q = NULL;
	p = phead;
	q = phead;
	while(1)
	{		
	if(i==0&&p->data.sno != varsno )
	{
		q = p;
			p = p->next ;
		i++;
	}
	if(i!=0&&p->data.sno != varsno )
	{
		q->next=p;
		q= q->next ;
		p = p->next ;
	}
	if(p->data.sno == varsno)
	{
			p = p->next ;
	}


	if(p == NULL) break;
	
}
return phead; 
}

Node_sc *deletion(Node_sc* phead)//学生单科成绩数据删除 
{
	int varsno,varcno;
	printf("     选择删除学号  :"); scanf("%d",&varsno);
	printf("     选择删除课程号:"); scanf("%d",&varcno);
	Node_sc *p = NULL;
	Node_sc *q = NULL;
	p = phead;
	q = phead;
	while(p != NULL)
	{
		if(phead->data.sno  == varsno&&phead->data.cno == varcno)
		{	
			phead = phead->next ;
			free(q);
			break;
		}//头
		
		if(p->next->data.sno  == varsno&&p->data.cno == varcno)
		{
			q = p->next;
			p->next = p->next->next ;
			free (q);
			break;
		}
		p = p->next ;
	}
	return phead; 
}
Node_s *deletion(Node_s* phead)//学生数据删除 
{
	int varsno;
	printf("     选择删除学号:"); scanf("%d",&varsno);
	Node_s *p = NULL;
	Node_s *q = NULL;
	p = phead;
	q = phead;
	while(p != NULL)
	{
		if(phead->data.sno  == varsno )
		{	
			phead = phead->next ;
			free(q);
			break;
		}//头
		
		if(p->next->data.sno  == varsno)
		{
			q = p->next;
			p->next = p->next->next ;
			free (q);
			break;
		}
		p = p->next ;
	}
	return phead; 
}
//年龄统计 
void findage(Node_s *phead)//年龄统计 
{
	int count = 0;	
	Node_s *p = phead;
	while(1)
	{		
		if(p!=NULL)
		{
			count++;
		}
		p = p->next ;
		if(p==NULL) break;
	}
	p = phead;
	int a[count],e[120];
	for(int i=0;i<count;i++)
	{
		a[i] =p->data.age ;
		p = p->next ;
	}
	for(int i=0; i<120; i++)
    {
        e[i]=0;
    }
    for(int i=0;i<count;i++)
    {
       for(int j=0;j<120;j++)
       {
           if(a[i]==j)
            e[j]++;
		}

    }
    for(int j=0;j<100;j++)
    if(e[j]>0)
    printf("%d岁\t%d人\n",j,e[j]);
}
//查找学生 
void findgrade(Node_sc *phead)
{
	int sno;	
	float count = 0;
	float sum=0,ave = 0;
	Node_sc *p = phead;	
	printf("     调查学生学号:");scanf("%d",&sno);
	while(1)
	{
		if(p->data.sno == sno)
		{
			sum = sum+p->data.grade;
			count++;
		}
		p = p->next ;		 
		if(p == NULL) break;		
	}
	ave = sum/count;
	p=phead;
	printf("%d号学生的平均成绩%f\n",sno,ave);
	printf("%d号学生成绩如下:\n",sno);
	while(1)
	{			
		if(p->data.sno == sno)
		{
			printf("课程号:%d\n成绩:%f\n---------------\n",p->data.cno ,p->data.grade);
		}	
		p = p->next ;
		if(p == NULL) break;	
	}	
}
void faildata(Node_s *phead_s,Node_sc*phead_sc)//不合格学生统计 
{
	int sno;
	float count = 0;
	float sum=0,ave = 0;
	Node_s *q = phead_s;
	Node_sc *p = phead_sc;
	printf("调查学生学号:");scanf("%d",&sno);
	for(;;)
	{	while(1)
		{
			if(p->data.sno == sno)
			{
				sum = sum+p->data.grade;
				count++;
			}
			p = p->next ;		 
			if(p == NULL) break;		
		}
		printf("%f   %f\n",sum,count);
		ave = sum/count;
		p=phead_sc;
		if(ave<60)
		{
			printf("该生成绩不合格!\n该生自然数据:\n");
			while(1)
			{
				if(q->data.sno == sno)
				{
					printf("---------------\n学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n---------------\n",q->data.sno ,q->data.sname,q->data.sex,q->data.age);
				}
				q=q->next; 
				if(q == NULL) break;
			}
			 printf("※※※※※※※|\n该生各科成绩:\n---------------\n");
			while(1)
			{			
				if(p->data.sno == sno)
				{
					printf("课程号:%d\n成绩:%f\n---------------\n",p->data.cno ,p->data.grade);
				}	
				p = p->next ;
				if(p == NULL) break;	
			}	
		}
		break;
	} 
}

void query_all(Node_sc *phead)//6按学号查询学生的成绩明细 
{
	int sno;
	printf("选择查询学号:");scanf("%d",&sno);
	printf("\n%d号学生成绩如下:\n****************\n",sno);
	Node_sc *p=phead;
	while(1)
	{
		if(p->data.sno == sno)
		{
			printf("课程号:%d\n成绩:%f\n****************\n",p->data.cno ,p->data.grade);
		}
		p=p->next; 
		if(p == NULL) break;	
	}	
	
}
void query(Node_sc *phead)//5按学号和课程号查询学生成绩
{
	int sno,cno;
	printf("选择查询学号  :");scanf("%d",&sno);
	printf("选择查询课程号:");scanf("%d",&cno); 
	Node_sc *p=phead;
	while(1)
	{
		if(p->data.cno  == cno&&p->data.sno == sno)
		{
			printf("成绩:%f\n",p->data.grade);
		}
		p=p->next; 
		if(p == NULL) break;		
	}	
}
 
void query(Node_s *phead)
{
	int varsno;
	printf("选择查询学号:");	
	scanf("%d",&varsno);
	Node_s *p=NULL;
	Node_s *p_node=NULL;
	p=phead;
	while(1)
	{
		if(p->data.sno == varsno)
		{
			p_node=p;
			printf("--------\n学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n--------\n",p_node->data.sno,p_node->data.sname,p_node->data.sex,p_node->data.age);
		}
		p=p->next; 
		if(p == NULL) break;		
	}	
} 
//读盘 
Node_s *fileInput_s()
{
		Node_s *phead=NULL; 
		FILE *fp;
		if((fp=fopen("student.dat","r"))==0) return phead;
		Node_s *ptail, *pnew;
		int i=0;
		student s;
		while(fread(&s,sizeof(student),1,fp)!=0)
		{
			pnew=(Node_s*)malloc(sizeof(Node_s));
			pnew->data=s;
			pnew->next=NULL;		
			if(i==0)
			{
				phead=pnew;
				ptail=pnew;			
			}
			else
			{
			    ptail->next=pnew;
			    ptail=pnew;
		    }
		    i++;
		}
		fclose(fp);
	return phead;
}

Node_c *fileInput_c()
{
	Node_c *phead = NULL; 
	FILE *fp;
	if((fp=fopen("course.dat","r")) == 0) return phead;
	Node_c *ptail = NULL, *pnew = NULL;
	int i=0;
	course s;
	while(fread(&s,sizeof(course),1,fp)!=NULL)
	{
		pnew = (Node_c*)malloc(sizeof(Node_c));
		pnew->data  = s;
		pnew->next = NULL;		
		if(i == 0)
		{
			phead = pnew;
			ptail = pnew;			
		}
		else
		{
		    ptail->next = pnew;
			ptail = ptail->next;
		}
		    i++;
	}
	fclose(fp);
	return phead;	
} 
Node_sc *fileInput_sc()
{
	Node_sc *phead = NULL; 
	FILE *fp;
	if((fp=fopen("sc.dat","r")) == 0) return phead;
	Node_sc *ptail, *pnew;
	int i=0;
	sc s;
	while(fread(&s,sizeof(sc),1,fp)!=0)
	{
		pnew = (Node_sc*)malloc(sizeof(Node_sc));
		pnew->data = s;
		pnew->next = NULL;		
		if(i == 0)
		{
			phead = pnew;
			ptail = pnew;			
		}
		else
		{
		    ptail->next = pnew;
			ptail = pnew;
		}
		    i++;
	}
	ptail->next=NULL;
	fclose(fp);
	return phead;		
}
//键盘输入的存盘 
void fileOutput(Node_s *phead_s)//存盘1  
{
	if(phead_s != NULL)
	{
		FILE *fp1;							
		fp1=fopen("student.dat","ab");
		for(Node_s *p=phead_s;p!=NULL;p=p->next)
		{
			fwrite(p,sizeof(student),1,fp1);
		}
		fclose(fp1);//student
	}	
}
void fileOutput(Node_c *phead_c)//存盘2
{	if(phead_c != NULL)
	{
		FILE *fp2;							
		fp2=fopen("course.dat","ab");
		for(Node_c *p=phead_c;p!=NULL;p=p->next)
		{
			fwrite(p,sizeof(course),1,fp2);
		}
		fclose(fp2);//course
	}
}
void fileOutput(Node_sc *phead_sc)//存盘 3
{
	if(phead_sc != NULL)
	{
		FILE *fp3;							
		fp3=fopen("sc.dat","ab");
		for(Node_sc *p=phead_sc;p!=NULL;p=p->next)
		{
		fwrite(p,sizeof(sc),1,fp3);
		}
			fclose(fp3);
	}	
}
//遍历 
void traversal(Node_sc *phead_sc)
{
	int i = 0;
	while(1)
	{
		if(i == 0)
		{
			printf("--------------------------------------------\n");
			printf("Sno     Course name     Score      \n");
			printf("--------------------------------------------\n");
			if(phead_sc == NULL)
			{
				printf("                                            \n");
				printf("               链 表 为 空!                \n");  
			}
		}
		else 
		{
			if(phead_sc == NULL) break;
			printf("%d%9s%8d\n",phead_sc->data.sno,phead_sc->data.cno,phead_sc->data.grade);
			phead_sc=phead_sc->next;
		} 
		printf("                                            \n");
		i++;
	}
		printf("--------------------------------------------\n");
}
void traversal(Node_c *phead_c)
{
	int i = 0;
	while(1)
	{
		if(i == 0)
		{
			printf("--------------------------------------------\n");
			printf("Course number     Course name     Credit      \n");
			printf("--------------------------------------------\n");
			if(phead_c == NULL)
			{
				printf("                                            \n");
				printf("               链 表 为 空!                \n"); 
			}
		}
		else 
		{
			if(phead_c == NULL) break;
			printf("%d%18s%16d\n",phead_c->data.cno,phead_c->data.cname,phead_c->data.credit);
			phead_c=phead_c->next;
		} 
		printf("                                            \n");
		i++;
	}
		printf("--------------------------------------------\n");
}
void traversal(Node_s *phead_s)
{
	int i = 0;
	while(1)
	{
		if(i == 0)
		{
			printf("--------------------------------------------\n");
			printf("Sno     Sname     Sex     Dept     Age      \n");
			printf("--------------------------------------------\n");
			if(phead_s == NULL)
			{
				printf("                                            \n");
				printf("               链 表 为 空!                \n"); 
			}
		}
		else 
		{
			if(phead_s == NULL) break;
			printf("%d%9s%8s%8s%9d\n",phead_s->data.sno,phead_s->data.sname,phead_s->data.sex,phead_s->data.Dept,phead_s->data.age);
			phead_s=phead_s->next;
		} 
		printf("                                            \n");
		i++;
	}
		printf("--------------------------------------------\n");
}
//建立链表 
Node_s *create_s()
{
	Node_s *phead = NULL;
	Node_s *ptail = NULL;
	Node_s *pnew = NULL;
	int i=0,varsno;
	printf("温馨提示: \n"); 
	printf("输入学号为'0'时退出\n") ;
	while(1)
	{
		pnew = (Node_s *)malloc(sizeof(Node_s));
		printf("     学号:"); 
		scanf("%d",&varsno);
		fflush(stdin);
		if(varsno == 0)
		{
			printf("录入信息结束!\n"); 
			break;
		}
		pnew->data.sno = varsno;
		printf("     姓名:"); gets(pnew->data.sname );
		printf("     性别:"); gets(pnew->data.sex  );
		printf("     专业:"); gets(pnew->data.Dept );
		printf("     年龄:");scanf("%d",&pnew->data.age);
		pnew->next = NULL; 
		printf("\n");
		if(i == 0)
		{
			phead = pnew;
			ptail = pnew;
		}
		if(i != 0)
		{
			ptail->next = pnew;
			ptail = ptail->next ;
		}
		i++;
	}
	return phead;
} 

Node_c *create_c()
{
	Node_c *phead = NULL;
	Node_c *ptail = NULL;
	Node_c *pnew = NULL;
	int i=0,varsno;
	printf("温馨提示: \n"); 
	printf("输入课程序号为'0'时退出\n") ; 
	while(1)
	{
		pnew = (Node_c *)malloc(sizeof(Node_c));
		printf("课程序号:"); 
		scanf("%d",&varsno);
		fflush(stdin);
		if(varsno == 0)
		{
			printf("录入信息结束!\n"); 
			break;
		}
		pnew->data.cno  = varsno;
		printf("     课程名:"); gets(pnew->data.cname  );
		printf("     学分  :"); scanf("%d",&pnew->data.credit);
		pnew->next = NULL; 
		printf("\n");
		if(i == 0)
		{
			phead = pnew;
			ptail = pnew;
		}
		if(i != 0)
		{
			ptail->next = pnew;
			ptail = ptail->next ;
		}
		i++;
	}
	return phead; 
}	
Node_sc *create_sc()
{
	
	Node_sc *phead = NULL;
	Node_sc *ptail = NULL;
	Node_sc *pnew = NULL;
	int i=0,varsno;
	printf("温馨提示: \n"); 
	printf("输入学号为'0'时退出\n") ; 
	while(1)
	{
		pnew = (Node_sc *)malloc(sizeof(Node_sc));
		printf("学号  :"); 
		scanf("%d",&varsno);
		fflush(stdin);
		if(varsno == 0)
		{
			printf("录入信息结束!\n"); 
			break;
		}
		pnew->data.sno = varsno;
		printf("课程号:"); scanf("%d",&pnew->data.cno );
		printf("成绩  :"); scanf("%f",&pnew->data.grade);
		pnew->next = NULL; 
		printf("\n");
		if(i == 0)
		{
			phead = pnew;
			ptail = pnew;
		}
		if(i != 0)
		{
			ptail->next = pnew;
			ptail = ptail->next ;
		}
		i++;
	}
	return phead; 
} 
//查询男女学生人数 
void querySexnumber(Node_s *phead)
{
	unsigned char man[]="男";
	unsigned char woman[]="女";
	Node_s *p = NULL;
	Node_s *q = NULL;
	p = phead;
	q = phead;
	int cnt1;
	int cnt2;
	while(1)
	{
		if(p == NULL) break;
		if(p != NULL)
		{
			if(p->data.sex[3] = man[3])
			{
				cnt1++;	
			} 
			else if(p->data.sex[3] = woman[3])
			{
				cnt2++;
			} 
		}
		p = p->next ;
	}
	printf("****************************************************\n");
	printf("*                                                  *\n");
	printf("*                 男生人数为:%d                    *\n",cnt1);
	printf("*                                                  *\n");
	printf("*                 女生人数为:%d                    *\n",cnt2);
	printf("*                                                  *\n");
	printf("****************************************************\n");
} 	
//查询姓氏学生人数 
void querySurname(Node_s *phead)
{
	char *Sur[21]; 
	printf("请输入您需要查询的姓氏: ");
	gets(*Sur);
	Node_s *p = NULL;
	Node_s *q = NULL;
	p = phead;
	q = phead;
	char *ptr;
	int cnt = 0;
	while(1)
	{
		if(p == NULL) break;
		if(p != NULL)
		{
			ptr = strstr(p->data.sname,*Sur);
			cnt++;
		}
		printf("姓%s的学生人数为%d",ptr,cnt);
		p = p->next ;
	}
}
//查询学生专业人数
void queryDept(Node_s *phead)
{
	Node_s *p = NULL;
	Node_s *q = NULL;
	p = phead;
	q = phead;
	char dept1[]="CS";
	char dept2[]="MA";
	int s1,s2;
	while(1)
	{
		if(p == NULL) break;
		if(p != NULL)
		{
			if(	p->data.Dept[100] == dept1[3])
			{
				s1++;
			}
			if(p->data.Dept[100] == dept2[3])
			{
				s2++;
			}	 
		}
		p = p->next ;
	}
	printf("****************************************************\n");
	printf("*                                                  *\n");
	printf("*                 CS人数为:%d                      *\n",s1);
	printf("*                                                  *\n");
	printf("*                 MA人数为:%d                      *\n",s2);
	printf("*                                                  *\n");
	printf("****************************************************\n");
	system("pause");
}
 //学生人数统计 
 int count(Node_s *phead)
{
	int count = 0;
	Node_s *p;
	p = phead;
	while(1)
	{
		if(p == NULL) break; 
		if(p!= NULL)
		{
			count++;
		}
		p = p->next ;
	} 
	return count ;
}

猜你喜欢

转载自blog.csdn.net/wfy2695766757/article/details/81206288