【数据结构】数据结构基础:结构体的应用和枚举类型的使用

每日学习

一、练习题

  1. 定义一个学员类型,包含成员属性:姓名、性别、职业、和另一个变量,如果职业是学生,则另一个变量是分数,如果职业是老师,则另一个变量是所带课程。
    再封装一个班级类型,包含成员属性:学员数组、班级当前人数,数组大小MAX为40;
    操作:
    1> 在堆区申请一个班级,并对班级进行初始化
    2> 定义添加学员函数,如果班级人数未满,则将某个学员放入到该班级中
    3> 定义输出函数,展示出当前班级的所有人员信息
    4> 定义查找函数,给定一个姓名,查找该名字是否为该班级成员
    5> 定义释放函数,将堆区申请的班级空间释放
    头文件:test.h
#ifndef _TEST_H
#define _TEST_H
#define MAX 40
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//定义学员类型
typedef struct
{
	char name[20];//姓名
	char sex; 	//性别
	char job; 	//职业
	union
	{
		double score; 	//分数
		char sub[20]; 	//课程
	};
}Stu;
//定义班级类型
typedef struct
{
	Stu data[MAX]; 	//存储学员的数组
	int len; 				//当前班级人数
}Class,*Class_ptr;

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

//声明添加学员函数
int add(Class_ptr C,Stu s);

//声明输出函数
void show(Class_ptr C);

//声明查找函数
int search(Class_ptr C,const char *name);

//释放内存
void Class_free(Class_ptr C);

#endif


源文件:test.c

#include "test.h"

//定义申请空间函数
Class_ptr create(){
	//在堆区申请一个班级空间
	Class_ptr C=(Class_ptr)malloc(sizeof(Class));
	if(NULL==C){
		printf("空间申请失败\n");
		return NULL;
	}
	//对班级进行初始化工作
	C->len=0; 		//将班级人数清零

	printf("班级创建成功\n");
	//将地址返回
	return C;
}

//定义添加学员函数
int add(Class_ptr C,Stu s){
	//判断逻辑
	if(NULL==C||C->len==MAX){
		printf("\n");
		return -1;
	}
	//可以进行添加工作
	C->data[C->len]=s; 	//将数据添加到尾端
	
	//班级人数自增1
	C->len++;

	printf("添加成功\n");
	return 0;
}

//定义输出函数
void show(Class_ptr C){
	//判断逻辑
	if(NULL==C||C->len==0){
		printf("操作失败\n");
		return;
	}
	//开始输出操作
	printf("当前班级人员信息如下\n");
	printf("姓名\t性别\t职业\t成绩或课程\n");
	for(int i=0;i<C->len;i++){
		printf("%s\t%c\t%c\t",C->data[i].name,\
				C->data[i].sex,\
				C->data[i].job);
		if(C->data[i].job=='S'||C->data[i].job=='s'){
			printf("%.2lf\n",C->data[i].score);
		}else{
			printf("%s\n",C->data[i].sub);
		}
	}
}

//定义查找函数
int search(Class_ptr C,const char *name){
	//判断逻辑
	if(NULL==C||C->len==0){
		printf("查找个der。。。");
		return -1;
	}

	//开始进行查找
	//设置一个旗帜
	int flag=0;
	for(int i=0;i<C->len;i++){
		if(strcmp(C->data[i].name,name)==0){
			flag=1; 	//说明查找到了
			printf("姓名\t性别\t职业\t成绩或课程\n");
			printf("%s\t%c\t%c\t",C->data[i].name,\
				C->data[i].sex,\
				C->data[i].job);
			if(C->data[i].job=='S'||C->data[i].job=='s'){
				printf("%.2lf\n",C->data[i].score);
			}else{
				printf("%s\n",C->data[i].sub);
			}
		}
	}
	//判断是否没找到
	if(flag==0){
		printf("你走错班了,该班查无此人\n");
		return -1;
	}
	return 0;
}

//释放内存
void Class_free(Class_ptr C){
	if(NULL!=C){
		free(C);
		C=NULL;
	}
	printf("释放成功\n");
}

测试文件:main.c

#include "test.h"
int main(int argc, const char *argv[])
{
	//调用函数创建一个班级
	Class_ptr C=create();
	if(NULL==C){
		return -1;
	}

	//测试录入学生工作
	while(1){
		Stu s;
		printf("请输入学员的姓名:");
		scanf("%s",s.name);
		printf("请输入学员的性别(M|W):");
		scanf(" %c",&s.sex);
		printf("请输入学员的职业(S|T):");
		scanf(" %c",&s.job);
		if(s.job=='S'||s.job=='s')
		{
			printf("请输入学员的分数:");
			scanf("%lf",&s.score);
		}else if(s.job=='T'||s.job=='t')
		{
			printf("请输入老师所带的课程:");
			scanf("%s",s.sub);
		}
		//调用函数添加学员函数
		add(C,s);

		//判断是否继续录入
		char judge;
		printf("是否继续录入(Y|N):");
		scanf(" %c",&judge);
		if(judge=='Y' || judge=='y'){
			if(C->len<MAX){
				continue;
			}else{
			printf("操作失败,班级已经满员了\n");
			break;
			}
		}else{
			break;
		}
	}

	//调用输出函数
	show(C);

	//定义要查找的名字
	char name[20];
	printf("请输入要查找的姓名:");
	scanf("%s",name);

	//调用查找函数
	search(C,name);

	//调用释放函数
	Class_free(C);
	C=NULL;

	return 0;
}

输出结果:

linux@linux:~/study/abc$ ./a.out 
班级创建成功
请输入学员的姓名:lala
请输入学员的性别(M|W):W
请输入学员的职业(S|T):T
请输入老师所带的课程:math
添加成功
是否继续录入(Y|N):Y
请输入学员的姓名:xixi
请输入学员的性别(M|W):m
请输入学员的职业(S|T):s
请输入学员的分数:100
添加成功
是否继续录入(Y|N):Y
请输入学员的姓名:dodo
请输入学员的性别(M|W):W
请输入学员的职业(S|T):S
请输入学员的分数:99
添加成功
是否继续录入(Y|N):N
当前班级人员信息如下
姓名	性别	职业	成绩或课程
lala	W	T	math
xixi	m	s	100.00
dodo	W	S	99.00
请输入要查找的姓名:dodo
姓名	性别	职业	成绩或课程
dodo	W	S	99.00
释放成功

二、思维导图
数据结构基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值