《学生信息管理系统》

  • Post author:
  • Post category:其他


#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <conio.h>
#define LEN sizeof(struct student)
//定义学生结构体
struct student
{
	long num;
	int score;
	struct student *next;
};

int n=0;//定义学生人数为全局变量

int menu();
struct student *create(struct student *head);//批量录入
void print(struct student *head);//输出
struct student *del(struct student *head,long num);//删除
struct student *insert(struct student *head,struct student *inStu);//插入
void query(struct student *head,long num);	//查询


void main()
{
	
	struct student *head=NULL;			//学生链表开始为空
	int answer;							//用户的回答
	long num;							 //要查询或者要删除的学生的学号
	struct student *inStu=NULL;			//要插入的学生结点
	do{
		system("cls");
		answer=menu();
		switch(answer)
		{
			case 1:
				system("cls");
				head=create(head);
				printf(" \n\n\n\t\t你已经退出学生信息的录入,按任意键返回主菜单……");
				getch();
				break;
			case 2:
				system("cls");
				print(head);
				printf("     按任意键返回主菜单……");
				getch();
				break;
			case 3:
				system("cls");
				if(head==NULL)
				{
					printf("\n\n\n\t\t抱歉,学生数据为空,无法删除!!!\n\n\n");
					printf("     按任意键返回主菜单……");
					getch();
				}
				else
				{
					printf("请输入要删除的学生的学号:");  
					scanf("%ld",&num);
					head=del(head,num);
					printf("     按任意键返回主菜单……");
					getch();
				}
				break;
			case 4:
				system("cls");
				inStu=(struct student *)malloc(LEN);  
				printf("请输入要插入的学生的学号和成绩:");  
				scanf("%ld%d",&inStu->num ,&inStu->score );
				head=insert(head,inStu);
				printf("     按任意键返回主菜单……");
				getch();
				break;
			case 5:
				system("cls");
				if(head==NULL)
				{
					printf("\n\n\n\t\t抱歉,学生数据为空,无法查询!!!\n\n\n");
					printf("     按任意键返回主菜单……");
					getch();
				}
				else
				{
					printf("\n\n\t\t请输入要查询的学生的学号:");
					scanf("%ld",&num);
					query(head,num);
					printf("\n\n     按任意键返回主菜单……");
					getch();
				}
				break;
		}
	}while(answer!=0);	
}

//主界面
int menu()
{
	int option;
	printf("\n\n\n\t*********************欢迎使用学生信息管理系统********************\n\n\n");
	printf("\t                     1.录入学生信息                              \n\n");
	printf("\t                     2.显示学生信息                              \n\n");
	printf("\t                     3.删除学生信息                              \n\n");
	printf("\t                     4.插入学生信息                              \n\n");
	printf("\t                     5.查询学生信息                              \n\n");
	printf("\t                     0.退出系统                                  \n\n\n");
	printf("\t*****************************************************************\n\n\n");
	printf(" \t\t请选择0—5中的数字之一,以进行学生信息管理:");
	while(1)
	{
		scanf("%d",&option);
		if(option>=0&&option<=5)
			break;
		else
			printf("\n\n您选择的选项不对,应该输入0、1、2、3、4、5中的一个数字,请重新选择:");
	}
	return(option);	
}


//创建链表
struct student *create(struct student *head)
{
	struct student *p=NULL;//要插入的新结点
	struct student *q=NULL;//链表的尾部结点
	p=(struct student *)malloc(LEN);
	printf("\n\n\t请输入学生的学号和成绩(数据之间用空格分隔,输入完成按回车键确认。\n\n\t如果想结束录入工作,请输入成绩-1):\n");
	scanf("%ld",&p->num);
	scanf("%d",&p->score);
	if(head==NULL)
	{
		q=p;
	}
	else
	{
		q=head;
		while(q->next !=NULL)
			q=q->next ;
	}
	while(p->score!=-1)
	{
		n++;
		if(head==NULL)
			head=p;
		else
		{
			q->next=p;
			q=p;
		}
		p=(struct student * )malloc(LEN);
		scanf("%ld",&p->num );
		scanf("%d",&p->score);
		
	}
	q->next=NULL;
	return(head);
}

//显示学生信息
void print(struct student *head)
{
	struct student *p=NULL;	//指向链表当前结点的指针
	p=head;
	if(head!=NULL)
	{
		printf("\n\n\t\t*********共有 %d 个记录*********\n\n",n);
		printf("\t\t————————————————\n\n");
		printf("\t\t\t%-15s%-15s\n\n","学号","成绩");
		while(p!=NULL)
		{
			printf("\t\t\t%-15ld%-15d\n\n",p->num,p->score);
			p=p->next;
		}
		printf("\t\t********************************\n\n");
	}
	else
		printf("\n\n\t\t抱歉,没有学生数据!\n\n");
}


//删除学生信息
struct student *del(struct student *head,long num)
{
	struct student *p=NULL;//要删除的结点
	struct student *q=NULL;//要删除的结点的前一个结点
	p=head;
	while(p->num!=num&&p->next !=NULL)
	{
		q=p;
		p=p->next ;
	}
	if(num==p->num )
	{
		if(p==head)
			head=p->next ;
		else
			q->next =p->next ;

		n=n-1;
		printf("\n\n\n\t\t已成功删除学号为%ld的学生信息\n\n\n\n",num);
		
	}
	else
		printf("\n\n\t\t抱歉,没有找到学号为%ld的学生的信息\n\n\n",num);

	return(head);
}

//在链表的尾部插入学生信息
struct student *insert(struct student *head,struct student *inStu)
{
	struct student *p0=NULL;//要插入的结点
	struct student *p1=NULL;//要插入的结点的前一个结点
	if(head!=NULL)
	{
		p1=head;
		while(p1->num !=inStu->num &&p1->next !=NULL)
			p1=p1->next ;
		if(p1->num ==inStu->num )
		{
			printf("\n\n\n\t\t很遗憾,你要插入的学生的学号%ld已经存在,无法插入!!\n\n\n",inStu->num );
			return(head);
		}
	}

	p0=inStu;
	p1=head;
	if(head==NULL)
	{
		head=p0;
		p0->next =NULL;
	}
	else
	{
		while(p1->next !=NULL)
			p1=p1->next ;
		p1->next =p0;
		p0->next=NULL;

	}
	n=n+1;
	printf("\n\n\n\t\t\t恭喜您,已成功插入学号为%ld的学生信息!\n\n\n\n",inStu->num);
	return(head);
}

//根据学号查询学生信息
void query(struct student *head,long num)
{
	struct student *p=NULL;
	p=head;
	while(p->num!=num&&p->next !=NULL)
	{
		p=p->next ;
	}
	if(p->num==num)
	{
		printf("\n\n\t\t*********查询到的学生记录*********\n\n",n);
		printf("\t\t————————————————\n\n");
		printf("\t\t\t%-15s%-15s\n\n","学号","成绩");
		printf("\t\t\t%-15ld%-15d\n\n",p->num,p->score);
		printf("\t\t********************************\n\n");
	}
	else
		printf("\n\n\t\t抱歉,没有找到学号为%ld的学生的信息\n\n\n",num);
	return;


}



版权声明:本文为zhourui2103原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。