2022.7.22 作业

1、用单链表实现一个学生管理系统

studentsys.h

#ifndef __STU_H__
#define __STU_H__

#include <stdio.h>
#include "stdlib.h"

#define N 20

typedef struct {
	int id;
	char name[N];
	float score;
}Stu;

typedef struct node {
	Stu data;
	struct node *next;
}Linklist;

//创建
int stu_insert(Linklist **s,Stu msg);

//判空
int empty(Linklist *s);

//遍历
int stu_show(Linklist *s);

//删除学生信息
int stu_delete(Linklist **s);

//修改学生信息
int stu_update(Linklist *s);

//按成绩排序
int stu_sort_score(Linklist *s,int flag);

//按学号排序
int stu_sort_id(Linklist *s,int flag);

#endif

studentsys.c

#include "student.h"
#include <string.h>

int stu_insert(Linklist **s,Stu msg)
{
	Linklist *p=(Linklist *)malloc(sizeof(Linklist));
	if(NULL==p){
		return -1;
	}
	p->data=msg;
	p->next=NULL;
	if(*s==NULL){
		*s=p;
	}else{
		p->next=*s;
		*s=p;
	}
	return 0;
}

int empty(Linklist *s)
{
	return s==NULL ? 1 : 0;
}

int stu_show(Linklist *s)
{
	if(empty(s))
		return -1;
	printf("\t学号\t姓名\t成绩\n");
	while(s!=NULL){
		printf("\t%d\t%s\t%.1f\n",s->data.id,s->data.name,s->data.score);
		s=s->next;
	}
	putchar(10);
	return 0;
}

int stu_delete(Linklist **s)
{
	if(empty(*s))
		return -1;

	int t_id=-1;
	char t_name[N]={0};
	int flag=0;

	printf("请输入你要删除的学生学号或姓名>>>");
	scanf("%d",&t_id);
	if(t_id<0){
		scanf("%s",t_name);
	}
	while(getchar()!='\n');

	Linklist *p=*s;
	Linklist *h=NULL,*tail=NULL;
	*s=NULL;
	while(p!=NULL){
		if(p->data.id==t_id || strcmp(t_name,p->data.name)==0){
			h=p;
			p=p->next;
			free(h);
			h=NULL;
			flag=1;
		}else{
			if(*s==NULL){
				*s=p;
				tail=*s;
			}else{
				tail->next=p;
				tail=p;
			}
			p=p->next;
		}
	}
	if(*s!=NULL){
		tail->next=NULL;
		tail=NULL;
	}
	if(flag)
		puts("删除成功");
	else
		puts("查无此人,无法删除");
	return 0;
}

int stu_update(Linklist *s)
{
	if(empty(s))
		return -1;

	int t_id=-1;
	char t_name[N]={0};
	Stu msg;

	printf("请输入你要修改的学生学号或姓名>>>");
	scanf("%d",&t_id);
	if(t_id<0){
		scanf("%s",t_name);
	}
	while(getchar()!='\n');
	
	int i=0;
	struct Temp {
		Linklist *tp;
		struct Temp *next;
	};
	struct Temp *h=NULL,*tail=NULL;

	while(s!=NULL){
		if(s->data.id==t_id || strcmp(s->data.name,t_name)==0){
			struct Temp *tmp=(struct Temp *)malloc(sizeof(struct Temp));
			tmp->tp=s;
			tmp->next=NULL;
			if(h==NULL){
				h=tail=tmp;
			}else{
				tail->next=tmp;
				tail=tmp;
			}
			i++;
		}
		s=s->next;
	}
	
	while(1){
		if(i==0){
			puts("查无此人,无法修改");
			return 0;
		}else{
			int j=0,choose=0;;
			if(t_id>0)
				printf("找到%d名学生的学号为%d,如下:\n",i,t_id);
			else
				printf("找到%d名学生的姓名为%s,如下:\n",i,t_name);

			tail=h;
			printf("\t编号\t学号\t姓名\t成绩\n");
			while(tail!=NULL){
				printf("\t%d\t%d\t%s\t%.1f\n",++j,tail->tp->data.id,
						tail->tp->data.name,tail->tp->data.score);
				tail=tail->next;
			}
			putchar(10);
			printf("请输入你修改学生信息的编号>>>");
			scanf("%d",&choose);
			while(getchar()!='\n');

			while(1){
				int n=0;
				printf("请输入修改后的学号 姓名 成绩>>>");
				n=scanf("%d %s %f",&msg.id,msg.name,&msg.score);
				while(getchar()!='\n');
				if(n!=3){
					puts("信息输入不合法,请重试!");
					continue;
				}
				break;
			}

			if(choose==1){
				tail=h;
				tail->tp->data=msg;
				h=tail->next;
				free(tail);
				tail=NULL;
			}else{
				tail=h->next;
				struct Temp *p=h;
				while(--choose>1){
					tail=tail->next;
					p=p->next;
				}
				tail->tp->data=msg;
				p->next=tail->next;
				free(tail);
				tail=NULL;
			}
			puts("修改成功");
			i--;
			printf("是否继续修改(y|Y)>>>");
			char ch=getchar();
			while(getchar()!='\n');
			if(ch=='y' || ch=='Y')
				continue;
			else
				break;
		}
	}
	while(h!=NULL){
		if(h->next!=NULL){
			tail=h;
			h=h->next;
			free(tail);
			tail=NULL;
		}else{
			free(h);
			h=NULL;
		}
	}
	return 0;
}

int stu_sort_score(Linklist *s,int flag)
{
	if(empty(s))
		return -1;
	Stu temp;
	Linklist *max=NULL;
	Linklist *p=NULL;
	while(s!=NULL){
		max=s;
		if(s->next!=NULL)
			p=s->next;
		else
			break;
		while(p!=NULL){
			if(0==flag){
				if(max->data.score > p->data.score)
					max=p;
			}else{
				if(max->data.score < p->data.score)
					max=p;
			}
			p=p->next;
		}
		if(max!=s){
			temp=max->data;
			max->data=s->data;
			s->data=temp;
		}
		s=s->next;
	}
	p=max=NULL;
	puts("排序完成");
	return 0;
}

int stu_sort_id(Linklist *s,int flag)
{
	if(empty(s))
		return -1;
	Stu temp;
	Linklist *max=NULL;
	Linklist *p=NULL;
	while(s!=NULL){
		max=s;
		if(s->next!=NULL)
			p=s->next;
		else
			break;
		while(p!=NULL){
			if(0==flag){
				if(max->data.id > p->data.id)
					max=p;
			}else{
				if(max->data.id < p->data.id)
					max=p;
			}
			p=p->next;
		}
		if(max!=s){
			temp=max->data;
			max->data=s->data;
			s->data=temp;
		}
		s=s->next;
	}
	p=max=NULL;
	puts("排序完成");
	return 0;
}

main.c

#include <stdio.h>
#include "student.h"

void menu()
{
	puts("\t***********欢迎使用***********");
	puts("\t*******学生信息管理系统*******");
	puts("\t\t1.录入学生信息");
	puts("\t\t2.查看所有信息");
	puts("\t\t3.删除学生信息");
	puts("\t\t4.修改学生信息");
	puts("\t\t5.按成绩排序");
	puts("\t\t6.按学号排序");
	puts("\t\t0.退出系统");
	puts("\t******************************");
}

int main(int argc, const char *argv[])
{
	Stu msg;
	int choose=0,n=0,flag=0;
	char ch;
	Linklist *s=NULL;
	while(1){
		menu();
		printf("请输入你的选择>>>");
		scanf("%d",&choose);
		while(getchar()!='\n');
		switch(choose){
			case 1:
Try:
				printf("请依次输入学生的学号 姓名 成绩>>>");
				n=scanf("%d %s %f",&msg.id,msg.name,&msg.score);
				while(getchar()!='\n');
				if(n!=3){
					puts("信息输入不合法,请重试!");
					goto Try;
				}
				stu_insert(&s,msg);
				break;
			case 2:
				if(stu_show(s)<0)
					puts("系统目前为空");
				break;
			case 3:
			   if(stu_delete(&s)<0)
				   puts("系统信息为空,删除失败");
				break;
			case 4:
				if(stu_update(s)<0)
					puts("系统信息为空,修改失败");
				break;
			case 5:
				printf("是否要从小到大排序(Y|y)>>>");
				ch=getchar();
				while(getchar()!='\n');
				if(ch=='Y' || ch=='y')
					flag=0;
				else
					flag=1;
				if(stu_sort_score(s,flag)<0){
					puts("系统信息为空,排序失败");
					break;
				}
				stu_show(s);
				break;
			case 6:
				printf("是否要从小到大排序(Y|y)>>>");
				ch=getchar();
				while(getchar()!='\n');
				if(ch=='Y' || ch=='y')
					flag=0;
				else
					flag=1;
				if(stu_sort_id(s,flag)<0){
					puts("系统信息为空,排序失败");
					break;
				}
				stu_show(s);
				break;
			case 0:
				puts("正在退出系统...");
				exit(0);
				break;
			default :
				puts("输入有误,请重试!");
				break;
		}
	}
	return 0;
}

2、插入与查看测试

 3、删除测试

4、修改测试

 5、按成绩排序测试

 6、按学号排序测试

6、退出测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值