9.17作业

学生管理系统

1. 创建学生信息链表 返回地址

2. 学生信息独立空间创建(结构体) 返回地址

3. 学生信息独立空间封装 需要学生信息空间(2)地址 返回地址

4. 创建增添函数 将封装好的空间跟头文件相连

5. 输出链表

6. 根据姓名查找 (能直接修改,删除,注意一查多结果)

7. 根据分数查找 (同上)

8. 根据学号查找 (同上)

#ifndef __1_H__
#define __1_H__

typedef  struct Stu
{
	int num;
	char name[10];
	double score;
}Stu,*Studata;


typedef struct Node
{
	union
	{
		int len;
		Studata data;//定义指针数组存放指针指向学生
	};
	struct Node *prio;
	struct Node *next;
}Node,*double_list;



//创建学生信息链表
double_list stu_list_create();
//创建学生信息存放空间
Studata stu_create();
//学生信息封装函数
double_list make_node(Studata p);
//判空
int list_empty(double_list p);
//学生信息链表录入信息(尾插)
void stu_list_tail_insert(double_list p,double_list new_stu);
//学生信息展示
void stu_list_out(double_list p);
//学号 姓名 分数 查找
void list_search_num(double_list p);
void list_search_name(double_list p);
void list_search_score(double_list p);
#endif
//***************************************************************************************
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include"1.h"

double_list stu_list_create()  // 返回头文件地址
{
	double_list p=(double_list)malloc(sizeof(Node));
	if(p==NULL)
	{
		printf("学生信息链表创建失败");
		return 0;
	}
		p->len=0;
		p->next=p;
		p->prio=p;
		printf("学生信息链表创建成功\n");
		return p;
}
Studata stu_create()              //返回值为stu_pos
{
	Studata p=(Studata)malloc(sizeof(Stu));
	if(p==NULL)
	{
		printf("学生信息空间创建失败\n");
		return 0;
	}
		printf("学生信息空间创建成功\n");
		printf("请输入学生学号:");
		int a;
		scanf("%d",&a);
		printf("请输入学生姓名:");
		char b[10]="";
		scanf("%s",b);
		printf("请输入学生成绩:");
		double c;
		scanf("%lf",&c);
		p->num=a;
		strcpy(p->name,b);
		p->score=c;
		printf("学生信息录入成功\n");
		return p;
}
double_list make_node(Studata p)   // 收到值为 stu_pos  返回值为new_stu
{
	double_list p1=(double_list)malloc(sizeof(Node));
	if(p1==NULL)
	{
		printf("学生信息封装失败\n");
		return 0;
	}
		p1->data=p;
		p1->next=p1;
		p1->prio=p1;
		printf("学生信息封装成功\n");
		return p1;
}


int list_empty(double_list p)//收到值为头文件地址
{
	return p->next==p?1:0;
}

void stu_list_tail_insert(double_list p,double_list new_stu)//收到值为头文件地址 和学生封装地址new_stu
{
	if(p==NULL||new_stu==NULL)
	{
		printf("地址不合法\n");
		return;
	}
	if(list_empty(p))
	{
		new_stu->next=p;
		new_stu->prio=p;
		p->next=new_stu;
		p->prio=new_stu;
		p->len++;
		printf("放入链表成功\n");
		return;
	}

		double_list p1=p->next;
	while(p1->next!=p)
		{
			p1=p1->next;
		}
		new_stu->prio=p1;
		new_stu->next=p;
		p1->next=new_stu;
		p->prio=new_stu;
		p->len++;
		printf("放入链表成功\n");
		return;
}
void stu_list_out(double_list p)// 收到值为头文件地址
	{
		if(list_empty(p))
		{
			printf("没有存放任何数据\n");
			return;
		}
		printf("学号\t姓名\t\t成绩\n");
			double_list p1=p->next;
		while(p1!=p)
		{
			printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
			p1=p1->next;
		}
	}
void list_search_num(double_list p)
{
	if(p==NULL||list_empty(p))
	{
		printf("链表不合法,无法查找\n");
		return ;
	}
	int num;
	printf("请输入需要查找的学号:\n");
	scanf("%d",&num);
	double_list p1=p->next;
	int count=0;
	while(p1!=p)
	{
		if(num==p1->data->num)
		{
			count++;
			printf("存在该学生\n");
			printf("学号\t姓名\t\t分数\n");
			double_list J;
			printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
			printf("选择对该学生信息的操作\n");
			printf("\t1.删除\t\t2.修改\n");
			printf("\t3.不操作\n");
			int a=0;
			scanf("%d",&a);
			if(a==1)
			{
				J=p1->prio;
				p1->next->prio=p1->prio;
				p1->prio->next=p1->next;
				p1->next=p1;
				p1->prio=p1;
				p->len--;
				p1=J;
				printf("删除成功\n");

				goto LOOP;
			//	p1=p1->next;
			//	continue;
			}
			else if(a==2)
			{
				int A;
				printf("请输入修改后的学生学号:");
				scanf("%d",&A);
				putchar(10);
				p1->data->num=A;
				char B[10]="";
				printf("请输入修改后的学生姓名:");
				gets(B);
				putchar(10);
				strcpy(p->data->name,B);
				double C;
				printf("请输入修改后的学生成绩:");
				scanf("%lf",&C);
				putchar(10);
				p1->data->score=C;
				printf("修改成功\n");
			//	p1=p1->next;
			//	continue;
				goto LOOP;
			}
		}
LOOP:
			p1=p1->next;
	}
	if(count==0)
	{
	printf("不存在\n");
	}
	return;
}

void list_search_name(double_list p)
{
	if(p==NULL||list_empty(p))
	{
		printf("链表不合法,无法查找\n");
		return ;
	}
	char N[10];
	printf("请输入需要查找的姓名:\n");
	scanf("%s",N);
	double_list p1=p->next;
	int count=0;
	while(p1!=p)
	{
		if(strcmp(N,p1->data->name)==0)
		{
			count++;
			printf("存在该学生\n");
			printf("学号\t姓名\t\t分数\n");
			double_list J=p1->prio;
			printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
			printf("选择对该学生信息的操作\n");
			printf("\t1.删除\t\t2.修改\n");
			printf("\t3.不操作\n");
			int a;
			scanf("%d",&a);
			if(a==1)
			{
				p1->next->prio=p1->prio;
				p1->prio->next=p1->next;
				p1->next=p1;
				p1->prio=p1;
				p->len--;
				p1=J;
				printf("删除成功\n");
			}
			if(a==2)
			{
				int A;
				printf("请输入修改后的学生学号:");
				scanf("%d",&A);
				putchar(10);
				p1->data->num=A;
				char B[10]="";
				printf("请输入修改后的学生姓名:");
				gets(B);
				putchar(10);
				strcpy(p->data->name,B);
				double C;
				printf("请输入修改后的学生成绩:");
				scanf("%lf",&C);
				putchar(10);
				p1->data->score=C;
				printf("修改成功\n");
			}
				p1=p1->next;
				continue;
		}
				p1=p1->next;
	}
	if(count==0)
	{
	printf("不存在\n");
	}
	return;

}
void list_search_score(double_list p)
	{
	if(p==NULL||list_empty(p))
	{
		printf("链表不合法,无法查找\n");
		return ;
	}
	double S;
	printf("请输入需要查找的分数:\n");
	scanf("%lf",&S);
	double_list p1=p->next;
	int count=0;
	while(p1!=p)
	{
		if(S==p1->data->score)
		{
			count++;
			printf("存在该学生\n");
			printf("学号\t姓名\t\t分数\n");
			double_list J=p1->prio;
			printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
			printf("选择对该学生信息的操作\n");
			printf("\t1.删除\t\t2.修改\n");
			printf("\t3.不操作\n");
			int a;
			scanf("%d",&a);
			if(a==1)
			{
				p1->next->prio=p1->prio;
				p1->prio->next=p1->next;
				p1->next=p1;
				p1->prio=p1;
				p->len--;
				p1=J;
				printf("删除成功\n");
			}
			if(a==2)
			{
				int A;
				printf("请输入修改后的学生学号:");
				scanf("%d",&A);
				putchar(10);
				p1->data->num=A;
				char B[10]="";
				printf("请输入修改后的学生姓名:");
				gets(B);
				putchar(10);
				strcpy(p->data->name,B);
				double C;
				printf("请输入修改后的学生成绩:");
				scanf("%lf",&C);
				putchar(10);
				p1->data->score=C;
				printf("修改成功\n");
			}
				p1=p1->next;
				continue;
		}
				p1=p1->next;
	}
	if(count==0)
	{
	printf("不存在\n");
	}
	return;
	}
//***************************************************************************************
#include <stdio.h>
#include<stdlib.h>
#include"1.h"
int main(int argc, const char *argv[])
{
	double_list p;//头文件
	Studata stu_pos;
	double_list new_stu=NULL;
	while(1)
	{
	printf("\t\t****功能菜单****\n");
	printf("1.录入学生信息\t\t\t2.学生信息输出\n");
	printf("3.按学号查找\t\t\t4.按姓名查找\n");
	printf("5.按分数查找\t\t\t6.结束运行\n");
	printf("请选择功能:");
	int choose;
	scanf("%d",&choose);
	switch(choose)
	{
		case 1:
			p=stu_list_create();
			printf("学生总数:");
			int m;
			scanf("%d",&m);
			putchar(10);
			for(int i=1;i<=m;i++)
			{
				stu_pos=stu_create();
				new_stu=make_node(stu_pos);
				stu_list_tail_insert(p,new_stu);
			}
			break;
		case 2:
			stu_list_out(p);
			break;
		case 3:
			list_search_num(p);
			break;
		case 4:
			list_search_name(p);
			break;
		case 5:
			list_search_score(p);
			break;
		case 6:
			return 0;
	}
	
	}


	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值