数据结构DAY4

完成顺序表操作,要求数据元素是构造数据类型。

头文件
#include "student.h"

int main(int argc, const char *argv[])
{
	int num;
	char x;
	//创建班级
	Classptr C = create();
	while(1)
	{
		system("clear");
		printf("0)退出系统\n1)添加成员\n2)展示成员信息\n\
3)按姓名查找\n4)更改指定位置的信息\n\
5)更改指定学生的信息\n6)按照成绩排序\n\
7)删除任意位置的学生信息\n8)释放空间\n");
		printf("请输入选项(0-8):");
		scanf("%d",&num);
			switch(num)
			{
				case 0:
					return 0;
				case 1:
					Class_add(C);
					break;
				case 2:
					Class_output(C);
					while(1)
					{
						printf("是否继续查看(y|n):");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							x=0;
							Class_output(C);
						}else
						{
							x=0;
							break;
						}
					}
					break;
				case 3:
					Class_search_name(C);
					while(1)
					{
						printf("是否继续查找(y|n)");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							Class_search_name(C);
							x=0;
						}else{
							x=0;
							break;
						}
					}
					break;
				case 4:
					Class_update_pos(C);
					while(1)
					{
						printf("是否继续更改(y|n)");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							Class_update_pos(C);
							x=0;
						}else{
							x=0;
							break;
						}
					}
					break;
				case 5:
					Class_update_name(C);
					while(1)
					{
						printf("是否继续更改(y|n)");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							Class_update_name(C);
							x=0;
						}else{
							x=0;
							break;
						}
					}
					break;
				case 6:
					Class_sort(C);
					Class_output(C);
					while(1)
					{
						printf("是否继续排序(y|n)");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							Class_sort(C);
							Class_output(C);
							x=0;
						}else{
							x=0;
							break;
						}
					}
					break;
				case 7:
					Class_delete_pos(C);
					while(1)
					{
						printf("是否继续删除(y|n)");
						scanf(" %c",&x);
						if(x=='y'||x=='Y')
						{
							x=0;
							Class_delete_pos(C);
						}
						else
						{
							x=0;
							break;
						}
					}
				case 8:
					Class_free(C);
					C=NULL;
					break;
				default :
					printf("请输入正确的选项\n");

			}
	}
	return 0;
}
功能函数
#include "student.h"

/********************************申请空间*********************************************/
Classptr create()
{
	//在堆区申请一个班级大小的空间
	Classptr C = (Classptr)malloc(sizeof(Class));
	if(NULL==C)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	//初始化班级
	memset(C,0,sizeof(Class));
	C->len=0;//人数清零
	printf("班级创建成功\n");
	return C;//返回地址
}
/**********************************判满****************************************************/
int Class_full(Classptr C)
{
	//判断逻辑
	if(NULL==C)
	{
		printf("所给顺序表不合法\n");
		return 0;
	}
	//合法则返回是否已满
	return C->len == MAX;
}
/**********************************判空**********************************************/
int Class_empty(Classptr C)
{
	//判断逻辑
	if(NULL==C)
	{
		printf("所给顺序表不合法\n");
		return 0;
	}
	//合法则返回是否为空
	return C->len == 0;
}
/***************************添加学生函数*******************************************/
void Class_add(Classptr C)
{
	//判断逻辑
		if(NULL==C || C->len==MAX)
		{
			printf("班级空间不合法\n");
		}
		Stu s;
	while(1)
	{
		char judge;
		printf("是否继续录入学生(Y|N):");
		scanf(" %c", &judge);	
		if(judge=='Y' || judge=='y')
		{
			if(C->len<MAX)
			{
				printf("请输入学生姓名:");
				scanf("%s",s.name);
				printf("请输入学生性别:");
				scanf(" %c",&s.sex);
				printf("请输入学生年龄:");
				scanf("%d",&s.age);
				printf("请输入学生分数:");
				scanf("%lf",&s.score);

				C->data[C->len]=s;
				C->len++;
			}else
			{
				printf("班级已满,添加失败\n");
				break;
			}
		}else
		{
			break;
		}
	}
}
/*****************************输出函数*****************************************/
void Class_output(Classptr C)
{
	//判断逻辑
	if(NULL == C || Class_empty(C))
	{
		printf("操作失败\n");
	}
	//开始输出
	else
	{
		printf("当前班级成员信息如下\n");
		printf("姓名\t性别\t年龄\t成绩\n");
		for(int i=0;i<C->len;i++)
		{
			printf("%s\t%c\t%d\t%lf\n",C->data[i].name,C->data[i].sex,C->data[i].age,C->data[i].score);
		}
	}

}

/**************************任意位置插入*****************************************/
int Class_insert_pos(Classptr C)
{
	int pos;
	printf("请输入想要插入的位置:");
	scanf("%d",&pos);
	Stu s;
	//判断逻辑
	if(NULL == C || pos>C->len || pos<0)
	{
		printf("插入失败\n");
		return 0;
	}
	printf("请输入学生姓名:");
	scanf("%s",s.name);
	printf("请输入学生性别:");
	scanf(" %c",&s.sex);
	printf("请输入学生年龄:");
	scanf(" %d",&s.age);
	printf("请输入学生成绩:");
	scanf(" %lf",&s.score);

	for(int i=C->len-1;i>=pos;i--)
	{
		C->data[i+1]=C->data[i];
	}
	C->data[pos] = s;	
	C->len++;

	printf("插入成功\n");
	return 1;


}

/**********************任意位置删除*****************************************/
int Class_delete_pos(Classptr C)
{
	int pos;
	printf("请输入想要删除的位置:");
	scanf("%d",&pos);
	//判断逻辑
	if(NULL==C || Class_empty(C) || pos<0||pos>C->len)
	{
		printf("删除失败\n");
		return -1;
	}
	//删除逻辑
	for(int i=pos+1;i<C->len;i++)
	{
		C->data[i-1]=C->data[i];//将删除位置后的数据前移
	}
	C->len--;//表的变化
	printf("删除成功\n");
	return 1;
}

/*****************任意位置修改函数******************************************/
int Class_update_pos(Classptr C)
{
	int pos;
	printf("请输入想要修改的位置:");
	scanf("%d",&pos);
	//判断逻辑
	if(NULL==C || Class_empty(C) || pos<0||pos>C->len)
	{
		printf("修改失败\n");
		return -1;
	}
	Stu s;
	printf("请输入学生姓名:");
	scanf("%s",s.name);
	printf("请输入学生性别:");
	scanf(" %c",&s.sex);
	printf("请输入学生年龄:");
	scanf(" %d",&s.age);
	printf("请输入学生成绩:");
	scanf(" %lf",&s.score);
	C->data[pos-1]=s;//更新修改后的数据
	printf("修改成功\n");
	return 1;
}

/***********************按姓名查找**************************************/
void Class_search_name(Classptr C)
{
	//判断逻辑
	if(NULL==C||Class_empty(C))
	{
		printf("查找失败\n");

	}
	Stu s;
	int flag = 0;
	int count = 0;
	printf("请输入想要查找学生的姓名:");
	scanf(" %s",s.name);
	for(int i=0;i<C->len;i++)
	{
		if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
		{	
			flag=1;
			count++;
		}
	}
	if(flag==1)
	{
	
			printf("查找成功\n");
			printf("该姓名共有%d人\n",count);
			printf("学生信息如下:\n");
			printf("姓名\t性别\t年龄\t成绩\n");
			for(int i=0;i<C->len;i++)
			{
				if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
				{	
					printf("%s\t%c\t%d\t%lf\n",C->data[i].name,C->data[i].sex,C->data[i].age,C->data[i].score);
				}
			}
	}
	else
		printf("查无此人\n");
	
}

/****************************释放顺序表***************************************/
void Class_free(Classptr C)
{
	if(NULL!=C)
	{
		free(C);
		C=NULL;
	}
	printf("释放成功\n");
}


/*****************************按照姓名修改**************************/
void Class_update_name(Classptr C)
{
	Stu s;
	printf("请输入想要修改信息的学生的姓名:");
	scanf(" %s",s.name);

	if(NULL==C||Class_empty(C))
	{
		printf("非法操作\n");
	}
	for(int i=0;i<C->len;i++)
	{
		if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
		{
			printf("请输入学生姓名:");
			scanf("%s",s.name);
			printf("请输入学生性别:");
			scanf(" %c",&s.sex);
			printf("请输入学生年龄:");
			scanf(" %d",&s.age);
			printf("请输入学生成绩:");
			scanf(" %lf",&s.score);
			C->data[i]=s;//更新修改后的数据
			printf("修改成功\n");
		}
	}
}


/*************************按照成绩排序********************************/
void Class_sort(Classptr C)
{
	//判断逻辑
	if(NULL==C||Class_empty(C))
	{
		printf("操作失败\n");
	}
	int flag;
	printf("请选择升序(1)还是降序(0):");
	scanf("%d",&flag);
	for(int i=1;i<C->len;i++)//开始排序
	{
		int index=i-1;
		for(int j=i-1;j<C->len;j++)
		{
			
			if(flag==1)//升序
			{
				if(C->data[index].score>C->data[j].score)
				{
					index=j;
				}
			}
			else if(flag==0)//降序
			{
				if(C->data[index].score<C->data[j].score)
				{
					index=j;
				}
			}
			if(index!=i-1)//交换
			{
				Stu temp=C->data[index];
				C->data[index]=C->data[i-1];
				C->data[i-1]=temp;
			}
		}
	
	}
}
头文件
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 40

//定义一个学生类型
typedef struct
{
	char name[20];//姓名
	char sex;//性别
	int age;//年龄
	double score;//分数
}Stu, *StuPtr;
//定义了一个班级类型
typedef struct
{
	Stu data[MAX];//存储学生的数组
	int len;//当前班级人数
}Class, *Classptr;

//声明申请空间函数
Classptr create();

//判满
int Class_full(Classptr C);

//判空
int Class_empty(Classptr C);

//声明添加学生函数
void Class_add(Classptr C);

//输出函数
void Class_output(Classptr C);

//任意位置插入
int Class_insert_pos(Classptr C);

//任意位置删除
int Class_delete_pos(Classptr C);

//任意位置修改函数
int Class_update_pos(Classptr C);

//按姓名查找
void Class_search_name(Classptr C);

//释放顺序表
void Class_free(Classptr C);

//按照姓名修改
void Class_update_name(Classptr C);

//按照成绩排序
void Class_sort(Classptr C);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值