栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-学生信息管理系统解析(链表)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言-学生信息管理系统解析(链表)

  1. 基于链表的“学生信息管理系统”

实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。

实验要求:

    1. main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
    2. 定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。
    3. 定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。
    4. 定义函数Save:将某个学生信息存入文件。
    5. 定义函数Fetch:从文件中随机读取某个学生的信息。
    6. 定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。
    7. 定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
    8. 定义函数Delete_num:从链表中删除指定学号的学生。
    9. 定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
    10. 定义函数Delete_ major _subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。

题目如上

源代码:

#include
#include
#include

typedef long long ll;

struct Student{
	char num[15];//学号
	char name[15];//姓名
	char major[10];//专业(computer,software,network)
	int classNo;//班级(1-2)
	int score[3];//3门课的成绩(0-2)
	ll numll;
	struct Student *next;
};
typedef struct Student STU;

STU *head=NULL;
STU *p=NULL,*pr=NULL;
int N;

STU* AppendNode(STU *head)//下一元素 
{
	STU *p=NULL,*pr=head;
	p=(STU*)malloc(sizeof(STU));
	if(head==NULL)
	{
		head=p;//第一次创建 
	}
	else//第二次及以后 
	{
		while(pr->next!=NULL) //pr给的头指针地址,每次添加都从头开始寻找 
		{
			pr=pr->next;//直到找到尾节点停止
		}
		pr->next=p; //给当前阶段尾节点以新创建的地址值 
	}
	p->next=NULL;//一定要给予next赋值为NULL,也就是某个阶段的尾节点一定是NULL值 
	return head;
}

void Input(STU *p)
{ 
	scanf("%s %s %s %d %d %d %d",&p->num,&p->name,&p->major,&p->classNo,&p->score[0],&p->score[1],&p->score[2]);
	ll temp=0,ans=0;
	int len=strlen(p->num);
	for(int i=0;inum[i]-'0';
		for(int j=0;jnumll=ans;
}

void Output(STU *p)
{
	printf("n 学号t         姓名t  专业t       班级    课程0   课程1   课程2 n");
	printf("%st %st %st %dt %dt %dt %dt n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}

void Save(STU *head)
{
	FILE *fp;
	STU *p=head;
	fp=fopen("studentInit_save.txt","w");
	if(fp==NULL)
	{
		printf("文件打开失败");
		exit(0);
	}
	while(p->next!=NULL)
	{
		fprintf(fp,"%10s  %10s  %10st%5dt%5dt%5dt%5d n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
		p=p->next;
	}
	fprintf(fp,"%10s  %10s  %10st%5dt%5dt%5dt%5d n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
	fclose(fp);
	printf("输出完毕");
} 
STU *CreateList(STU *head_this)
{
	STU *head=head_this;
	STU *p=head,*pr=head;
	printf("请输入学生的数量:");
	scanf("%d",&N);
	printf("请输入学生信息,以学号 姓名 专业 班级 成绩0 成绩1 成绩2格式输入n");
	for(int i=0;inext;
		}
		Input(p);
		p=head;
	} 
	return p;
}

void Fetch(ll index)
{
	STU *head=NULL,*p=NULL,*pr=NULL;
	FILE *fp=NULL;
	fp=fopen("studentInit.txt","r");
	for(int i=0;inext;
		}
		fscanf(fp,"%s %s %s %d %d %d %d",&p->num,&p->name,&p->major,&p->classNo,&p->score[0],&p->score[1],&p->score[2]);
		ll temp=0,ans=0;
		int len=strlen(p->num);
		for(int i=0;inum[i]-'0';
			for(int j=0;jnumll=ans;
		p=head;
	}
	
	while(head->next!=NULL)
	{
		if(head->numll==index)break;
		head=head->next;
	}
	if(head->next==NULL&&head->numll!=index)
	{
		printf("未找到对应学生");
	}
	else Output(head);
}
STU* Search_num(STU *head_this,ll num)
{
	STU *head=head_this;
	STU *p=NULL;
	int flag=1;
	while(head->next!=NULL)
	{
		if(head->numll==num)
		{
			Output(head);
			return head;
		}
		head=head->next;
	} 
	if(head->next==NULL&&head->numll==num)
	{
		Output(head);
		return head;
	}
	else
	{
		printf("未找到指定学号的学生");
		return NULL;
	}
}
void InsertList(STU *head_this)
{
	STU stu;
	STU *head=head_this;
	STU *p=head,*pr=NULL;
	pr=(STU*)malloc(sizeof(STU));
	
	scanf("%s %s %s %d %d %d %d",&stu.num,&stu.name,&stu.major,&stu.classNo,&stu.score[0],&stu.score[1],&stu.score[2]);
	
	ll temp=0,ans=0;
	ll temp2=0,ans2=0;
	int len2;
	int len=strlen(stu.num);
	for(int i=0;inext!=NULL)
	{
		if(((p->next)->numll)>stu.numll)break;
		
		p=p->next;
	}
	
	//找到第一个不满足条件的前一个位置
	if((head->numll)>stu.numll)//小于所有学号的,放到最前 
	{
		
		pr->next=head;
		
		strcpy(pr->num,stu.num);
		strcpy(pr->name,stu.name);
		strcpy(pr->major,stu.major);
		
		len2=strlen(pr->num);
		for(int i=0;inum[i]-'0';
			for(int j=0;jscore[0]=stu.score[0];
		pr->score[1]=stu.score[1];
		pr->score[2]=stu.score[2];
		pr->classNo=stu.classNo;
		pr->numll=ans2;
	}
	else
	{
		pr->next=p->next;//要插入元素的下一个元素的链接 
		p->next=pr;//链接新元素
		
		strcpy(pr->num,stu.num);
		strcpy(pr->name,stu.name);
		strcpy(pr->major,stu.major);
		
		len2=strlen(pr->num);
		for(int i=0;inum[i]-'0';
			for(int j=0;jscore[0]=stu.score[0];
		pr->score[1]=stu.score[1];
		pr->score[2]=stu.score[2];
		pr->classNo=stu.classNo;
		pr->numll=ans2;
	}
}

void Delete_num(STU *head_this)
{
	STU *head=head_this;
	STU *p=head;
	STU *ans=NULL;
	ll n;
	int flag=1;
	scanf("%lld",&n);
	while(p->next!=NULL)
	{
		if(flag==1&&p->numll==n)
		{
			ans=p;
			break;
		}
		if((p->next)->numll==n)
		{
			ans=p;//找到前一个 
			break;
		}
		p=p->next; 
		flag=0;
	}
	if(flag==1)
	{
		head=head->next;
	}
	else
	{
		ans->next=(ans->next)->next;
	}
} 

STU* Search_major_subject_score(STU *head_this,char *major,int n,int scorelimit)
{
	STU *p=head_this;
	while(p->next!=NULL)
	{
		if((*(p->major)==*major)&&p->score[n]next;
	}
	if(p->next==NULL&&p->score[n]>=scorelimit)
	{
		printf("未找到该范围内的学生n");
		return NULL;
	} 
	else
	{
		Output(p);
		return p;
	}
}
void Delete_major_subject(STU *head_this,char *major,int n,int scorelimit)
{
	STU *head=head_this;
	STU *p=head;
	while(p->next!=NULL)
	{
		if((*((p->next)->major)==*major)&&(p->next)->score[n]next;
	}	
	p->next=(p->next)->next;
}
int main()
{
	int a; 
	printf("  ----------------------------------------------------------"); 
	printf("n  |             请输入功能编号,运行相应功能               |n");
	printf("  |                                                        |n");
	printf("  |1.创建链表                                              |n");
	printf("  |2.将信息储存至studentInit_save.txt文件中                |n");
	printf("  |3.读取某一个学生的信息                                  |n");
	printf("  |4.查找指定学号的学生                                    |n");
	printf("  |5.输入新学生信息并插入至系统                            |n");
	printf("  |6.删除指定学号的学生信息                                |n");
	printf("  |7.查找指定专业、课程,分数范围的第一个学生              |n");
	printf("  |8.删除指定专业、课程,分数范围的第一个学生              |n");
	printf("  |9.输出当前系统中所有学生信息                            |n");
	printf("  |             若输入其他数字则退出程序                   |n");
	printf("  |           程序运行前请先输入1以创建链表                |n");
	printf("  ----------------------------------------------------------n"); 
	while(scanf("%d",&a)!=0)
	{
		
		if(a<1||a>9)break;
		switch(a)
		{
			case 1:
				printf("请输入学生信息n"); 
				head=CreateList(head);
				pr=head;
				printf("链表构造完成n");
				printf("请继续输入序号使用功能n");
				break;
			
			case 2:
			
				Save(head);
				printf("文件已经储存");
				printf("n请继续输入序号使用功能n");
				break;
			
			case 3:
			
				printf("输入要取出信息的学生学号n"); 
				ll n;
				scanf("%lld",&n);
				Fetch(n);
				printf("n请继续输入序号使用对应功能n");
				break;
			
			case 4:
				printf("输入需要查找的学生学号n");
				ll num;
				scanf("%lld",&num); 
				p=Search_num(head,num);
				printf("请继续输入功能序号n");
				break;
				
			case 5:
				printf("输入需要插入的新学生信息n"); 
				InsertList(head);
				printf("完成n请继续输入序号使用功能n");
				break;
				
			case 6:
				printf("输入需要删除的学生信息n");
				Delete_num(head);
				printf("完成n请继续输入序号使用功能n");
				break;
			
			case 7:
				printf("输入需要查找的学生信息,以专业 课程序号 成绩最大值格式输入,以空格分隔n");
				char Major[20];
				int lesson,scorelimit;
				scanf("%s %d %d",Major,&lesson,&scorelimit); 
				p=Search_major_subject_score(head,Major,lesson,scorelimit);
				printf("完成n请继续输入序号使用功能n");
				break;
			
			case 8:
				printf("输入需要删除的学生信息,以专业 课程序号 成绩最大值格式输入,以空格分隔n");
				char Major2[20];
				int lesson2,scorelimit2;
				scanf("%s %d %d",Major2,&lesson2,&scorelimit2); 
				Delete_major_subject(head,Major2,lesson2,scorelimit2);
				printf("完成n请继续输入序号使用功能n");
				break;
			
			case 9:
				pr=head;
				while(pr->next!=NULL)
				{
					Output(pr);
					pr=pr->next;
				}
				Output(pr);
				break;
		}
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993746.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号