18.2后宫管理系统

 

seqList.h

#pragma once
#include<stdbool.h>
#define INIT_SEQLIST_SIZE 8	//顺序表初始大小

//后宫管理系统,管理妃子
//三围
struct Size
{
	int bust;		//胸围
	int hip;		//臀围
	int waist;		//腰围
};
//妃子:girl  
typedef struct Girl
{
	int id;				//编号
	int age;			//年龄
	char name[10];		//姓名
	struct Size size;	//三围
}Girl,Data;

//typedef int Data;			//抽象数据类型ADT

//数组 容量(最多能存储多少个元素) 当前大小
typedef struct SeqList	//顺序表结构
{
	Data* base;		//指向动态内存分配的数组的指针
	int capacity;	//容量
	int size;		//当前元素个数
}SeqList;

//初始化顺序表
void initList(SeqList*list);

//获取大小
int size(SeqList* list);

//是否为空
bool empty(SeqList* list);

//尾部插入
void push_back(SeqList* list,const Data* const pval);

//删除最后一个元素
void pop_back(SeqList* list);
//删除指定的元素
void removeOne(SeqList* list,int delPos);

typedef bool (*CMPCallBack)(const Data* const pval1, const Data* const pval2);
//查找元素,返回下标
int find_pos(SeqList* list, const Data* const pval, CMPCallBack cmp);
//查找元素,返回元素地址
Data* find_val(SeqList* list, const Data* const pval);


//回调登记函数
typedef void (*CallBack)(Data* pval);
void transform(SeqList* list, CallBack dosomething);

 seqList.c

#include"seqList.h"
#include<malloc.h>
#include<stdio.h>
#include<string.h>
void initList(SeqList* list)
{
	list->capacity = INIT_SEQLIST_SIZE;
	list->size = 0;
	list->base = (Data*)calloc(list->capacity, sizeof(Data));
	if (!list)
	{
		puts("内存申请失败~");
		return;
	}
}

int size(SeqList* list)
{
	return list->size;
}

bool empty(SeqList* list)
{
	return list->size == 0;
}

void push_back(SeqList* list, const Data* const pval)
{
	//判断顺序表有没有位置(是否已满)
	if (list->size == list->capacity)
	{
		puts("顺序表已满,无法插入~");
		return;
	}
	list->base[list->size] = *pval;	//插入
	list->size++;					//元素个数加1
}

void pop_back(SeqList* list)
{
	if(!empty(list))
		list->size--;
}

void removeOne(SeqList* list, int delPos)
{
	if (empty(list))	//为空直接返回,无需删除
		return;
	//开始删除元素(把要删除的元素后面的元素都往前挪动)
	for (int i = delPos; i < list->size-1 ; i++)
	{
		list->base[i] = list->base[i + 1];
	}
	//size-1
	list->size--;
}

int find_pos(SeqList* list, const Data* const pval, CMPCallBack cmp)
{
	for (int i = 0; i < list->size; i++)
	{
		//if (list->base[i] == *pval)	//“==”: 对于 struct 非法
		//if(list->base[i].id == pval->id)
		if(cmp(&list->base[i], pval))
		{
			return i;
		}
	}
	return -1;
}

Data* find_val(SeqList* list, const Data* const pval)
{
	for (int i = 0; i < list->size; i++)
	{
		if (memcmp(&list->base[i], pval, sizeof(Data))== 0)
		{
			return list->base + i;
		}
	}
	return NULL;
}

void transform(SeqList* list, CallBack dosomething)
{
	for (int i = 0; i < list->size; i++)
	{
		dosomething(list->base + i);
	}
}

main.c

#include"seqList.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*
1001 11 华妃	 71 4  0
1003 19 翠花	 41 8  18
1005 12 香妃	4  5  5
1007 11 凌妃	7  1  11
1009 15 熏妃	2  7  16
1002 16 贤妃	55 49 76
1004 15 良妃	56 89 21
1006 20 淑妃	45 75 36
1008 14 德妃	26 14 59
1010 12 惠妃	21 35 63
1015 11 敬妃	95 14 13
1013 25 宁妃	25 62 41
1012 56 庄妃	25 64 32
1011 10 昭妃	21 63 45
1013 52 元妃	56 56 56
1011 9  贞妃	26 26 26
1016 22 亦菲	36 36 36
*/
enum Operate
{
	PeekAll  =1,	//偷窥所有女友
	Add,		//添加
	Remove,		//删除
	Search,		//查找
	Modify,		//修改
	Quit		//退出
};

//菜单
int menu()
{
	printf("------翻牌侍寝------  \n");
	printf("* 1,查看所有女友      *\n");
	printf("* 2,添加女友          *\n");
	printf("* 3,删除女友          *\n");
	printf("* 4,查找女友          *\n");
	printf("* 5,修改女友          *\n");
	printf("* 6,寡人累了,推出后宫 *\n");
	printf("input>:");
	int op = -1;
	scanf("%d", &op);	//失败返回0 成功返回读取成功的个数
	return op;
}

bool cmpId(const Data* const pval1, const Data* const pval2)
{
	return pval1->id == pval2->id;
}

bool cmpName(const Data* const pval1, const Data* const pval2)
{
	return strcmp(pval1->name, pval2->name) == 0;
}

bool cmpSize(const Data* const pval1, const Data* const pval2)
{
	return pval1->size.bust  == pval2->size.bust;
}

int main()
{
	//创建顺序表
	SeqList list = { 0 };
	initList(&list);

	while (true)
	{		
		int op = menu();
		switch (op)
	{
	case PeekAll:
		if (empty(&list))
		{
			printf("呜呜呜~好可怜,一个女友都没有~哈哈");
			break;
		}
		for (int i = 0; i < list.size; i++)
		{
			printf("%d %d %s (%d %d %d)\n", list.base[i].id, list.base[i].age, list.base[i].name, list.base[i].size.bust, list.base[i].size.hip, list.base[i].size.waist);
		}
		break;
	case Add:
	{
		Girl baby = { 0 };	
		printf("请输入ID、年龄、姓名、三围(胸围,臀围,腰围)>");
		scanf_s("%d %d %s %d %d %d", &baby.id, &baby.age, baby.name,10, &baby.size.bust, &baby.size.hip, &baby.size.waist);

		push_back(&list, &baby);
		break;
	}
	case Remove:
	{
		Girl g = { .id = 1001,.name="翠花" };
		//先找到pval,需要下标还是元素地址
		int delPos = find_pos(&list, &g, cmpName);
		if (delPos == -1)
		{
			return;
		}
		removeOne(&list, delPos);
		//找倒要删除的
		
		//删除

	}
		break;
	case Search:
		break;
	case Modify:
		break;
	case Quit:
		break;
	default:
		break;
	}
		system("pause");
		system("cls");
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值