学生管理系统-链表

    我们的期末作业就是学生管理系统,还是做了四天吧,平时链表接触的少,里面还是有很多bug,就看读者去发现了,也欢迎大家来指教,下面的代码仅供参考。

#include
#include
#include
#define LEN sizeof(struct T)
const int N=4;
struct T
{
    int num;
	char name[20];
	float score[3];
	float aver;
	struct T *next;
};
int  view();
struct T *get();
int sort(struct T *head);
int vision(struct T *head);
int insert(struct T *head);
int deletes(struct T *head);
int seek(struct T *head);
int main()
{
	struct T *head;
	int key,k=0;
	for(;;)//初始页面
	{
		view();
		printf("请输入相应的数字\n");
	scanf("%d",&key);
	if(key!=1&&k!=1&&key!=6)
	{
		printf("为避免客户过于刁钻,请先录入!\n\n");
		continue;
	}
	if(key==1)
	{
		printf("请输入学生信息\n");
		head=get();
		k=1;
		continue;
	}
	if(key==2)
	{
		vision(head);
		continue;
	}
	if(key==3)
	{
		insert(head);
		vision(head);
		continue;
	}
	if(key==4)
	{
		deletes(head);
		continue;
	}
	if(key==5)
	{
		seek(head);
		continue;
	}
	if(key==6)
	{
		printf("---------------------------------------------欢迎下次光临--------------------------------------------------------------------\n");
		break;
	}
	}
	return 0;
}
struct T *get()//动态链表建立与数据输入
{
	int n;
	char c,t;
	n=0;
	struct T *head,*p1,*p2;
	p1=p2=(struct T*)malloc(LEN);
	printf("学号:");
	 scanf("%d",&p1->num);
	 printf("姓名:");;
	 scanf("%s",&p1->name);
	 printf("成绩1:");
	 scanf("%f",&p1->score[0]);
	 printf("成绩2:");
	 scanf("%f",&p1->score[1]);
	 printf("成绩3:");
	 scanf("%f",&p1->score[2]);
		p1->aver=(p1->score[0]+p1->score[1]+p1->score[2])/3;
		head=p1;
		c=getchar();
		printf("继续输入C,否则B\n");
		for(;;)
		{
		scanf("%c",&t);
		c=getchar();
		if(t=='C'||t=='B')break;
		else
			printf("输入错误\n");
		}
		for(;t!='B';)
		{
			p1=(struct T*)malloc(LEN);
		printf("学号:");
	 scanf("%d",&p1->num);
	 printf("姓名:");;
	 scanf("%s",&p1->name);
	 printf("成绩1:");
	 scanf("%f",&p1->score[0]);
	 printf("成绩2:");
	 scanf("%f",&p1->score[1]);
	 printf("成绩3:");
	 scanf("%f",&p1->score[2]);
		p1->aver=(p1->score[0]+p1->score[1]+p1->score[2])/3;

		c=getchar();
			p2->next=p1;
			p2=p1;
		printf("继续输入C,否则B\n");
		for(;;)
		{
		scanf("%c",&t);
		c=getchar();
		if(t=='C'||t=='B')break;
		else
			printf("输入错误\n");
		}
		if(t=='B')break;
		}
		p1->next=NULL;
		return head;
}
int sort(struct T *head)//动态链表排序,这一部分我认为最难,花了我两天的时间
{
	struct T *p=head,*q;
	int t;
	float j;
	float k;
	char a[20];

	for(;p!=NULL;p=p->next)
	{
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(p->aver>q->aver)
			{
				t=p->num;
				p->num=q->num;
				q->num=t;
				j=p->score[0];
				p->score[0]=q->score[0];
				q->score[0]=j;
				j=p->score[1];
				p->score[1]=q->score[1];
				q->score[1]=j;
				j=p->score[2];
				p->score[2]=q->score[2];
				q->score[2]=j;
				k=p->aver;
				p->aver=q->aver;
				q->aver=k;
				strcpy(a,p->name);
				strcpy(p->name,q->name);
				strcpy(q->name,a);
			}
		}
	}//printf("tr;ljg\n");
	return 0;
}
int vision(struct T*head)//动态链表的输出
{
	sort(head);
	struct T *p=head;
	if(head!=NULL)
    printf("学号       姓名        成绩1       成绩2        成绩3        平均分\n");
	for(;p!=NULL;p=p->next)
	{
	printf("%d %s %f %f %f %f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
	}
	return 0;
}
int insert(struct T *head)//动态链表的插入
{
	struct T *p,*p1;
	char q,c;
	for(;;)
 {
	printf("请输入新的学生信息\n");
	p=(struct T *)malloc(LEN);
     printf("学号:");
	 scanf("%d",&p->num);
	 printf("姓名:");;
	 scanf("%s",&p->name);
	 printf("成绩1:");
	 scanf("%f",&p->score[0]);
	 printf("成绩2:");
	 scanf("%f",&p->score[1]);
	 printf("成绩3:");
	 scanf("%f",&p->score[2]);
	p->aver=(p->score[0]+p->score[1]+p->score[2])/3;
	c=getchar();
	for(p1=head;p1->next!=NULL;p1=p1->next)
	{
		if(p->num==p1->num)
		{
			printf("输入有重复,继续按Y,否则按N,即重新输入学号\n");
			scanf("%c",&q);
			c=getchar();
			if(q=='Y')
			{
				strcpy(p1->name,p->name);
				p1->score[0]=p->score[0];
				p1->score[1]=p->score[1];
				p1->score[2]=p->score[2];
				p1->aver=p->aver;vision(head);
				break;
			}
			if(q=='N')break;
		}
	}
	if(p1->next==NULL&&p->num!=p1->num)
	{
		p1->next=p;
		p->next=NULL;
		vision(head);
	}
	printf("继续输入新成绩按Y,否则按N\n");
	scanf("%c",&q);
	c=getchar();
	if(q=='N')break;
 }
	return 0;
}

int deletes(struct T *head)//动态链表的删除
{
	struct T *p;
	char q,c;
	int l,num;
	for(;;)
{
	l=0;
	printf("请输入要删除的学号\n");
	scanf("%d",&num);
	c=getchar();
	for(p=head;p!=NULL;p=p->next)
	{
		if(p->num==num)
		{
		head=p->next;
		vision(head);
		l=1;
		break;
		}
		if((p->next)->num==num)
		{
			if(p->next->next==NULL)
			{
				p->next=NULL;
				l=1;
				vision(head);
				break;
			}
			else
			{
			p->next=p->next->next;
			l=1;
			vision(head);
			break;
			}
		}
	}
	if(l!=1)printf("无此学号,重新输入\n");
	else
	{
		printf("操作已完成,继续按Y,否则按N\n");
		scanf("%c",&q);
		c=getchar();
		break;
	}
	if(q=='N')break;
}
	return 0;
}
int seek(struct T *head)//动态链表的查找
{
	struct T *p;
	int num;
	char c,q;
	for(;;)
	{
	printf("输入查找的学号\n");
	scanf("%d",&num);
	c=getchar();
	for(p=head;p!=NULL;p=p->next)
	{
		if(p->num==num)
		{
		printf("学号       姓名        成绩1       成绩2        成绩3        平均分\n");
		printf("%5.0d %s%10.0f%10.0f%10.0f%10.0f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
		}
		else
		{
		     printf("查无此人\n");
		     break;
		}
	}
	printf("继续按Y,结束按N\n");
	scanf("%c",&q);
	c=getchar();
	if(q=='N')break;
	}
	return 0;
}
int view()//显示界面
{
      printf("------------------------------------------------------------------------------------------------------------------------");
	printf("\n\n                                              欢迎来到学生管理系统\n");
	printf(" \n                                               1.录入     2.显示\n                                               3.插入     4.删除\n                                               5.查找     6.退出\n");
	printf("\n\n");
	printf("------------------------------------------------------------------------------------------------------------------------");
	return 0;
}

 

你可能感兴趣的:(学生管理系统-链表)