学生信息管理系统(c语言,链表版)

 相较于数组,链表对于数据的增加和删除更加方便,但是对于查找确增加了难度。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <string.h>
#define len sizeof(struct student)
//定义结构体 
struct student{
		int num;//学号 
		char name[15];//姓名 
		char major[10];//专业computer,softwear,network
		int classNo;//班级 
		int score[3];//3门课的成绩  
		int sum;//3门课的总成绩 
		struct student *next;//指针	88u
	};
//定义全局变量
int n;int a;
//函数声明
struct student *input();
struct student *creatlist(char *filename);
void save(student *head);
void print(struct student*head);void print1(struct student*head);
void del(struct student *head,int x);
struct student * insert(struct student*head);
void outone(struct student *temp);
struct student *MAX(struct student*head);
struct student *numfind(struct student *head);
struct student *search_major_score(struct student *head);
struct student *del_class_score(struct student *head);
//主函数	
int main()
{
	char s[15];
	struct student *head;
	while(1)
	{
		printf("请输入功能编号完成相应功能\n");
		//printf("1.输入学生信息并保存\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("其他,推出系统\n");
		int x,y;
		struct student *h,*k;
		scanf("%d",&x);
		switch(x)
		{
			/*case(1)://输入学生信息并保存
				h=input();
				save(h);
				break;*/
			case(1)://从文件中读取学生信息,并建立链表
				printf("请输入要查找的文件名:\n");
				getchar();
				gets(s);
				head=creatlist(s);
				printf("\n");
				printf("注册链表成功\n"); 
				break;
			case(2)://显示链表中学生信息 
				print(head);
				break;
			case(3)://查找总成绩最高的学生
				printf("总成绩最高的学生信息如下\n");
				printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t\n"); 
				outone(MAX(head));
				break;
			case(4)://寻找指定学号的学生
				printf("请输入要查找的学生的学号:\n");
				numfind(head);
				break;
			case(5)://按学号插入学生信息
				printf("请按顺序输入要插入的信息,用空格隔开\n");
				insert(head);
				//print(head);
				break;
			case(6)://按学号删除学生信息
				printf("请输入要删除的学生的学号:\n");
				scanf("%d",&y);
				del(head,y);
				break;
			case(7)://查找某个专业、某门课程的成绩小于某个分数的学生
				
				print(head=search_major_score(head));
			
				break;
			case(8)://删除某个班级、某门课程的成绩小于某个分数的学生
				head=del_class_score(head);
				print(head);
				break;
			case(9)://保存当前信息
				save(head);
				break;
			default:
				break;
		}
	}
	return 0;
}
//输入学生信息 
struct student *input()
{
	n=0;
	printf("请输入学生人数\n");
	scanf("%d",&a);
	printf("请录入这%d名学生的信息:\n",a);
	struct student *head;
	struct student *p1,*p2;
	head=(struct student*)malloc(len);
	while(n<a)
	{
		p1=(struct student*)malloc(len);
		scanf("%d%s%s%d%d%d%d",&p1->num,p1->name,p1->major,&p1->classNo,&p1->score[0],&p1->score[1],&p1->score[2]);
		p1->sum=0;
		p1->sum=p1->score[0]+p1->score[1]+p1->score[2];
		n++;
		if(n==1)
			head->next=p1;
		else
			p2->next=p1;
		p2=p1;
	}
	p2->next=NULL;
	return(head);
} 
//寻找成绩最高的学生 
struct student *MAX(struct student*head)
{
	struct student *p,*maxn,*max,*q;
	p=head;
	int big;
	big=p->score[0]+p->score[1]+p->score[2];
	maxn=p;
	while(p!=NULL)
	{
		//printf("%d\n",big);
		if((p->score[0]+p->score[1]+p->score[2])>big)
		{
			//outone(p);
			big=p->score[0]+p->score[1]+p->score[2];
			maxn=p;
			//outone(maxn);
		}
		
		p=p->next;
	}
	max->next=maxn;
	while(p!=NULL&&p->next!=NULL)   //寻找分数最大节点 
 {
  p=p->next;
  if(p->sum>=big)      //比较 
  {
   big=p->sum;
   maxn=p;
  }
 }
	return(max);
}
//从文件中读取学生信息,并建立链表
struct student *creatlist(char *filename)
{
	student *s,*p,*head;               //s为当前节点 ,head为头节点
	FILE *fp;
	if((fp=fopen(filename,"rb"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}
	head=(student *)malloc(sizeof(student)); //开辟内存 
	s=(student *)malloc(sizeof(student));    //开辟内存
	if((fread(s,sizeof(student),1,fp))==NULL)
	{
		printf("Wrong.");
		exit(0);	
	} 
	head->next=s;
	p=s;
	while(s->next!=NULL)
	{
		s=(student *)malloc(sizeof(student));
		fread(s,sizeof(student),1,fp);
	
			p->next=s;
			p=s;
	}
	
	return head;
}
//保存数据文件
void save(student *head)
{
	struct student *p;
	p=head->next;//从第二个开始保存的 
	FILE *fp;
	char filename[15];
	printf("请输入要建立的文件的名称:\n"); 
	scanf("%s",&filename);
	if((fp=fopen(filename,"wb"))==NULL)
	{
		printf("Wrong.");
		exit(0);
	}	
	while(p!=NULL)
	{
		if(fwrite(p,sizeof(student),1,fp)!=1)
		{
			printf("写入文件失败\n"); 
		}
		p=p->next;
	}
	printf("写入文件成功!\n"); 
	fclose(fp);
} 
//输出一个节点信息
void outone(struct student *temp)
{
	temp=temp->next;
	printf("%d\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t\n", temp->num, temp->name, temp->major,temp->classNo,temp->score[0],temp->score[1],temp->score[2]);
}
//打印无头节点 
void print(struct student*head)
{
	struct student *p;
	printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t"); 
	p=head->next;
	while(p!=NULL)
	{
		printf("\n%d\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t", p->num, p->name, p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
		p=p->next;
	}
	printf("\n");
}
//打印有头节点 
void print1(struct student*head)
{
	struct student *p;
	p=head;
	printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t"); 
	while(p!=NULL)
	{
		printf("\n%d\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t", p->num, p->name, p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
		p=p->next;
	}
	printf("\n");
}
//按学号删除学生信息
void del(struct student *head,int x)
{
	struct student *p,*q,*k;
	q=head;
	p=head->next;
	if(head==NULL)
		printf("Wrong.\n");
	while(p->num!=x&&p->next!=NULL)
	{
		q=q->next;
		p=p->next;
	}
	if(p->num==x)
	{
		//printf("被删除的学生的信息是:\n");
		//printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t\n"); 
		//outone(p);
		printf("\n");
		printf("确定要删除此人信息?输入'1'确认删除,输入'0'取消删除:\n");
		int y;
		scanf("%d",&y);
		if(y==1)
		{
			q->next=p->next;
			printf("删除成功!\n");
			printf("新的学生信息如下:\n");
			print(head);
		}
		if(y==0)
		{
			printf("取消删除成功!\n");
		}
	}
	else
	{
		printf("很抱歉,系统查无此人\n"); 
	}
}
//按学号插入学生信息 
struct student *insert(struct student*head)
{
	struct student *temp;
	struct student *p;
	temp=(student *)malloc(sizeof(student));
	p=head;
	printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t\n"); 
	scanf("%d%s%s%d%d%d%d",&temp->num,&temp->name,&temp->major,&temp->classNo,&temp->score[0],&temp->score[1],&temp->score[2]);
	temp->sum=temp->score[0]+temp->score[1]+temp->score[2];
	while(p!=NULL)
	{
		if(p->next->num>temp->num)
		{
			temp->next=p->next;
			p->next=temp;
			break;
		}
		else
		{
			p=p->next;
			if(p->next==NULL)
			{
				p->next=temp;
				temp->next=NULL;
				break;
			}
		}
	}
	return(head);
}


//寻找指定学号的学生 
struct student *numfind(struct student *head)
{
	int x;
	scanf("%d",&x);
	struct student *p;
	p=head;
	while(p!=NULL)
	{
		if(p->num==x)
		{
			printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t\n"); 
			printf("%d\t%s\t%s \t%d\t%d\t%d\t%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
			break;
		}
		p=p->next;
	}
	return(head);
}
//查找某个专业、某门课程的成绩小于某个分数的学生
struct student *search_major_score(struct student *head)
{
	struct student *p,*q,*xin,stu1;
	q=(student *)malloc(sizeof(student));
	xin=q;
	p=head;
	char a[15];
	int x,i;
	printf("请输入专业:"); 
	scanf("%s",a);
	printf("请输入课程编号(0-2):");
	scanf("%d",&i);
	printf("请输入分数:");
	scanf("%d",&x);
	while(p!=NULL)
	{
		if(strcmp(p->major,a)==0)
		{
			if(p->score[i]<x)
			{
				q->next=(student *)malloc(sizeof(student));	
				q=q->next;	
				q->num=p->num;strcpy(q->major,p->major);strcpy(q->name,p->name);
				q->score[0]=p->score[0];q->score[1]=p->score[1];
				q->score[2]=p->score[2];q->sum=p->sum;q->classNo=p->classNo;
			}
		}
		p=p->next;
	}
	q->next=NULL;
	return(xin);
}
//删除某个班级、某门课程的成绩小于某个分数的学生
struct student *del_class_score(struct student *head)
{
	
	struct student *p,*q;
	q=head;
	p=head->next;
	int a,i,x;
	printf("请输入班级:"); 
	scanf("%d",&a);
	printf("请输入课程编号(0-2):");
	scanf("%d",&i);
	printf("请输入分数:");
	scanf("%d",&x);
	while(p!=NULL)
	{
		if(p->classNo==a&&p->score[i]<x)
		{
			q->next=p->next;
			p=q->next;
		}
		else
		{
			p=p->next;
			q=q->next;			
		}

	}
	q=NULL;
	return(head);
}

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
学生成绩管理系统是一个常见的项目,可以使用链表来存储和管理学生的信息和成绩。下面是一个示例的C语言代码,用于实现学生成绩管理系统: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义学生结构体 typedef struct student { int id; char name[50]; float score; struct student* next; } Student; // 添加学生 void addStudent(Student** head, int id, char name[], float score) { // 创建新的学生节点 Student* newStudent = (Student*)malloc(sizeof(Student)); newStudent->id = id; strcpy(newStudent->name, name); newStudent->score = score; newStudent->next = NULL; // 如果链表为空,将新节点设为头节点 if (*head == NULL) { *head = newStudent; } else { // 否则遍历到最后一个节点,将新节点插入到最后 Student* current = *head; while (current->next != NULL) { current = current->next; } current->next = newStudent; } } // 显示所有学生信息 void displayStudents(Student* head) { if (head == NULL) { printf("学生信息为空\n"); } else { Student* current = head; printf("学生信息如下:\n"); while (current != NULL) { printf("学号:%d, 姓名:%s, 成绩:%.2f\n", current->id, current->name, current->score); current = current->next; } } } int main() { Student* head = NULL; // 添加几个示例学生 addStudent(&head, 1, "张三", 85.5); addStudent(&head, 2, "李四", 78.0); addStudent(&head, 3, "王五", 92.3); // 显示学生信息 displayStudents(head); // 释放链表内存 Student* current = head; while (current != NULL) { Student* temp = current->next; free(current); current = temp; } return 0; } ``` 这段代码中,通过定义`Student`结构体表示学生的信息,包括学号、姓名和成绩。使用`addStudent`函数可以向链表中添加新的学生节点,使用`displayStudents`函数可以显示所有学生的信息。 注意,在实际开发中,你可能还需要添加其他功能,比如删除学生、修改学生成绩等操作。此外,为了保证数据的安全和可靠性,你还需要考虑数据的输入验证和错误处理。这里仅提供了一个简单的示例,你可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码no摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值