第一百一十天学习记录:C++实战:自我设计用单链表、多态和文件操作写一个公会人员管理系统

news2024/11/27 2:30:40

实现程序界面展示:

主界面:

在这里插入图片描述

程序输入非正常字符情况保护

在这里插入图片描述
在这里插入图片描述

添加会员信息

在这里插入图片描述

删除会员信息

在这里插入图片描述

查找会员信息

在这里插入图片描述

变更会员会阶

在这里插入图片描述

显示所有会员

在这里插入图片描述

排序会员信息

在这里插入图片描述

查看种族职业

在这里插入图片描述

保存信息的txt文件

在这里插入图片描述

工程文件目录

在这里插入图片描述

main.cpp代码

#include "allmember.h"
#include "alljob.h"
#include "allrace.h"
#include "allrank.h"

enum Job
{
	EXI,//退出
	ADD,//添加
	LIS,//显示
	DEL,//删除
	MOD,//编辑
	SER,//查找
	SOR,//排序
	CHE //团队
};

const int Orcjob[6] = { 1,2,3,4,9,10 };
const int Trolljob[7] = { 1,2,3,4,5,8,10 };
const int Taurenjob[5] = { 1,2,3,6,10 };
const int Forsakenjob[6] = { 1,4,5,8,9,10 };
const int BloodElfjob[7] = { 2,4,5,7,8,9,10 };
const int Humanjob[7] = { 1,4,5,7,8,9,10 };
const int Dwarfjob[6] = { 1,2,4,7,8,10 };
const int Gnomejob[5] = { 1,4,5,9,10 };
const int NightElfjob[6] = { 1,2,4,6,8,10 };
const int Draeneijob[7] = { 1,2,3,5,7,8,10 };

void showtable()
{
	cout << "*****************************************" << endl;
	cout << "**********公会职业信息管理系统***********" << endl;
	cout << "*****************************************" << endl;
	cout << "************1、 添加会员信息*************" << endl;
	cout << "************2、 显示所有会员*************" << endl;
	cout << "************3、 删除会员信息*************" << endl;
	cout << "************4、 变更会员会阶*************" << endl;
	cout << "************5、 查找会员信息*************" << endl;
	cout << "************6、 排序会员信息*************" << endl;
	cout << "************7、 查看种族职业*************" << endl;
	cout << "************0、 退出管理系统*************" << endl;
	cout << "*****************************************" << endl;
	cout << "***请输入您所需要的操作选项,按回车确认:" << endl;
}

Allmember* newmember(int Id,string Name,int Sex,int woker,int race,int rank)
{
	Worker* tmpwoker = NULL;
	Race* tmprace = NULL;
	GuildRank* tmprank = NULL;
	switch (woker)
	{
	case 1:
		tmpwoker = new Warrior;
		break;
	case 2:
		tmpwoker = new Hunter;
		break;
	case 3:
		tmpwoker = new Shaman;
		break;
	case 4:
		tmpwoker = new Rogue;
		break;
	case 5:
		tmpwoker = new Mage;
		break;
	case 6:
		tmpwoker = new Druid;
		break;
	case 7:
		tmpwoker = new Paladin;
		break;
	case 8:
		tmpwoker = new Priest;
		break;
	case 9:
		tmpwoker = new Warlock;
		break;
	case 10:
		tmpwoker = new DeathKnight;
		break;
	default:
		break;
	}
	switch (race)
	{
	case 1:
		tmprace = new Orc;
		break;
	case 2:
		tmprace = new Troll;
		break;
	case 3:
		tmprace = new Tauren;
		break;
	case 4:
		tmprace = new Forsaken;
		break;
	case 5:
		tmprace = new BloodElf;
		break;
	case 6:
		tmprace = new Human;
		break;
	case 7:
		tmprace = new Dwarf;
		break;
	case 8:
		tmprace = new Gnome;
		break;
	case 9:
		tmprace = new NightElf;
		break;
	case 10:
		tmprace = new Draenei;
		break;
	default:
		break;
	}
	switch (rank)
	{
	case 1:
		tmprank = new President;
		break;
	case 2:
		tmprank = new Official;
		break;
	case 3:
		tmprank = new Elite;
		break;
	case 4:
		tmprank = new Member;
		break;
	case 5:
		tmprank = new Intern;
		break;
	default:
		break;
	}
	string m_Sex;
	if (Sex == 1)
	{
		m_Sex = "男";
	}
	else
	{
		m_Sex = "女";
	}
	Allmember* ptemp = new Allmember(Id, Name, m_Sex, tmpwoker, tmprace, tmprank);
	ptemp->p_next = NULL;
	return ptemp;
}

void read_member(Allmember* phead)
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	if (!ifs.is_open())
	{
		ifs.close();
		return;
	}
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		ifs.close();
		return;
	}
	ifs.seekg(0, ios::beg);//因为在前面判断数据库是否为空的时候ifs移动了一个字符,因此这里需要将ifs指向置为初始
	int Id;
	string Name;
	int Sex;
	int worker;
	int race;
	int rank;
	while (ifs >> Id&&ifs >> Name&&ifs >> Sex&&ifs >> worker&&ifs >> race&&ifs >> rank)
	{
		Allmember* pnew = newmember(Id,Name,Sex,worker,race,rank);
		phead->p_next = pnew;
		phead = pnew;
	}
	ifs.close();
}

Allmember* initList()
{
	int Id = 0;
	string Name = "";
	string Sex = "";
	Worker* worker = NULL;
	Race* race = NULL;
	GuildRank* rank = NULL;
	Allmember* member = new Allmember(1, Name, Sex, worker, race, rank);
	member->p_next = NULL;
	return member;
}

void showallmember(Allmember* phead)
{
	while (phead->p_next)
	{
		phead->p_next->showInfo();
		phead = phead->p_next;
	}
}

void savemember(Allmember* phead)
{
	int Id;
	string Name;
	int Sex;
	int worker;
	int race;
	int rank;
	ofstream ofs;
	ofs.open(FILENAME, ios::out);
	while (phead->p_next)
	{
		Id = phead->p_next->getId();
		Name = phead->p_next->getName();
		Sex = phead->p_next->getSex();
		worker = phead->p_next->getWorker();
		race = phead->p_next->getRace();
		rank = phead->p_next->getGuildRank();
		ofs << Id << " "
			<< Name << " "
			<< Sex << " "
			<< worker << " "
			<< race << " "
			<< rank << " " << endl;
		phead = phead->p_next;
	}
	ofs.close();
}

bool checkId(int Id, Allmember* phead)
{
	while (phead->p_next)
	{
		if (Id == phead->p_next->getId())
		{
			return false;
		}
		phead = phead->p_next;
	}
	return true;
}

bool checkrank(Allmember* phead)
{
	while (phead->p_next)
	{
		if (1 == phead->p_next->getGuildRank())
		{
			return false;
		}
		phead = phead->p_next;
	}
	return true;
}

void addmember(Allmember* phead)
{
	int Id;
	string Name;
	int Sex;
	int worker;
	int race;
	int rank;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员编号=>";
		cin >> Id;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (Id < 1 || Id > 9999)
		{
			cout << "输入编号超出范围(1~9999),请重新输入。" << endl;
			continue;
		}
		bool isOk = checkId(Id, phead);
		if (isOk)
		{
			break;
		}
		else
		{
			cout << "存在重复的编号,请重新输入。" << endl;
			continue;
		}
	}
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员姓名=>";
		cin >> Name;
		if (cin.fail()) {
			cout << "输入内容错误,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		break;
	}
	cout << "1、男  2、女" << endl;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员性别=>";
		cin >> Sex;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (Sex < 1 || Sex > 2)
		{
			cout << "输入性别选项超出范围(1~2),请重新输入。" << endl;
			continue;
		}
		break;
	}
	cout << "1、会长  2、官员  3、精英  4、会员  5、见习" << endl;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员公会会阶=>";
		cin >> rank;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (rank < 1 || rank > 5)
		{
			cout << "输入会阶选项超出范围(1~5),请重新输入。" << endl;
			continue;
		}
		if (rank == 1)
		{
			bool isOk = checkrank(phead);
			if (isOk)
			{
				break;
			}
			else
			{
				cout << "公会只允许一名会长,请重新输入。" << endl;
				continue;
			}
		}
		break;
	}
	cout << "1、兽人  2、巨魔  3、牛头人 4、被遗忘者  5、血精灵" << endl;
	cout << "6、人类  7、矮人  8、侏儒   9、暗夜精灵 10、德莱尼" << endl;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员种族=>";
		cin >> race;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (race < 1 || race > 10)
		{
			cout << "输入种族选项超出范围(1~10),请重新输入。" << endl;
			continue;
		}
		break;
	}
	switch (race)
	{
	case 1:
		cout << "1、战士 2、猎人 3、萨满" << endl;
		cout << "4、潜行者 5、术士 6、死亡骑士" << endl;
		break;
	case 2:
		cout << "1、战士 2、猎人 3、萨满" << endl;
		cout << "4、潜行者 5、法师 6、牧师 7、死亡骑士" << endl;
		break;
	case 3:
		cout << "1、战士 2、猎人 3、萨满" << endl;
		cout << "4、德鲁伊 5、死亡骑士" << endl;
		break;
	case 4:
		cout << "1、战士 2、潜行者 3、法师" << endl;
		cout << "4、牧师 5、术士 6、死亡骑士" << endl;
		break;
	case 5:
		cout << "1、猎人 2、潜行者 3、法师" << endl;
		cout << "4、圣骑士 5、牧师 6、术士 7、死亡骑士" << endl;
		break;
	case 6:
		cout << "1、战士 2、潜行者 3、法师" << endl;
		cout << "4、圣骑士 5、牧师 6、术士 7、死亡骑士" << endl;
		break;
	case 7:
		cout << "1、战士 2、猎人 3、潜行者" << endl;
		cout << "4、圣骑士 5、牧师 6、死亡骑士" << endl;
		break;
	case 8:
		cout << "1、战士 2、潜行者 3、法师" << endl;
		cout << "4、术士 5、死亡骑士" << endl;
		break;
	case 9:
		cout << "1、战士 2、猎人 3、潜行者" << endl;
		cout << "4、德鲁伊 5、牧师 6、死亡骑士" << endl;
		break;
	case 10:
		cout << "1、战士 2、猎人 3、萨满" << endl;
		cout << "4、法师 5、圣骑士 6、牧师 7、死亡骑士" << endl;
		break;
	default:
		break;
	}
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入新会员职业=>";
		int chjob = 0;
		cin >> chjob;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		switch (race)
		{
		case 1:
			if (chjob < 1 || chjob > 6)
			{
				cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;
				continue;
			}
			worker = Orcjob[chjob - 1];
			break;
		case 2:
			if (chjob < 1 || chjob > 7)
			{
				cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;
				continue;
			}
			worker = Trolljob[chjob - 1];
			break;
		case 3:
			if (chjob < 1 || chjob > 5)
			{
				cout << "输入职业选项超出范围(1~5),请重新输入。" << endl;
				continue;
			}
			worker = Taurenjob[chjob - 1];
			break;
		case 4:
			if (chjob < 1 || chjob > 6)
			{
				cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;
				continue;
			}
			worker = Forsakenjob[chjob - 1];
			break;
		case 5:
			if (chjob < 1 || chjob > 7)
			{
				cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;
				continue;
			}
			worker = BloodElfjob[chjob - 1];
			break;
		case 6:
			if (chjob < 1 || chjob > 7)
			{
				cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;
				continue;
			}
			worker = Humanjob[chjob - 1];
			break;
		case 7:
			if (chjob < 1 || chjob > 6)
			{
				cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;
				continue;
			}
			worker = Dwarfjob[chjob - 1];
			break;
		case 8:
			if (chjob < 1 || chjob > 5)
			{
				cout << "输入职业选项超出范围(1~5),请重新输入。" << endl;
				continue;
			}
			worker = Gnomejob[chjob - 1];
			break;
		case 9:
			if (chjob < 1 || chjob > 6)
			{
				cout << "输入职业选项超出范围(1~6),请重新输入。" << endl;
				continue;
			}
			worker = NightElfjob[chjob - 1];
			break;
		case 10:
			if (chjob < 1 || chjob > 7)
			{
				cout << "输入职业选项超出范围(1~7),请重新输入。" << endl;
				continue;
			}
			worker = Draeneijob[chjob - 1];
			break;
		default:
			break;
		}
		break;
	}
	Allmember* pnew = newmember(Id, Name, Sex, worker, race, rank);
	while (phead->p_next)
	{
		phead = phead->p_next;
	}
	phead->p_next = pnew;
	cout << "成功添加一名新会员,新会员信息如下:" << endl;
	pnew->showInfo();
}

void statistics(Allmember* phead)
{
	int total = 0;
	int sexarr[2] = { 0 };
	int rankarr[5] = { 0 };
	int racearr[10] = { 0 };
	int jobarr[10] = { 0 };
	while (phead->p_next)
	{
		++total;
		if (1 == phead->p_next->getSex())
		{
			++sexarr[0];
		}
		else
		{
			++sexarr[1];
		}
		switch (phead->p_next->getGuildRank())
		{
		case 1:
			++rankarr[0];
			break;
		case 2:
			++rankarr[1];
			break;
		case 3:
			++rankarr[2];
			break;
		case 4:
			++rankarr[3];
			break;
		case 5:
			++rankarr[4];
			break;
		default:
			break;
		}
		switch (phead->p_next->getRace())
		{
		case 1:
			++racearr[0];
			break;
		case 2:
			++racearr[1];
			break;
		case 3:
			++racearr[2];
			break;
		case 4:
			++racearr[3];
			break;
		case 5:
			++racearr[4];
			break;
		case 6:
			++racearr[5];
			break;
		case 7:
			++racearr[6];
			break;
		case 8:
			++racearr[7];
			break;
		case 9:
			++racearr[8];
			break;
		case 10:
			++racearr[9];
			break;
		default:
			break;
		}
		switch (phead->p_next->getWorker())
		{
		case 1:
			++jobarr[0];
			break;
		case 2:
			++jobarr[1];
			break;
		case 3:
			++jobarr[2];
			break;
		case 4:
			++jobarr[3];
			break;
		case 5:
			++jobarr[4];
			break;
		case 6:
			++jobarr[5];
			break;
		case 7:
			++jobarr[6];
			break;
		case 8:
			++jobarr[7];
			break;
		case 9:
			++jobarr[8];
			break;
		case 10:
			++jobarr[9];
			break;
		default:
			break;
		}
		phead = phead->p_next;
	}
	cout << "***************公会统计信息***************" << endl;
	cout << "公会总人数:" << total << endl;
	cout << "公会男性会员:" << sexarr[0] << endl;
	cout << "公会女性会员:" << sexarr[1] << endl;
	cout << "------------------------------------------" << endl;
	cout << "公会会长人数:" << rankarr[0] << endl;
	cout << "公会官员人数:" << rankarr[1] << endl;
	cout << "公会精英人数:" << rankarr[2] << endl;
	cout << "公会会员人数:" << rankarr[3] << endl;
	cout << "公会见习人数:" << rankarr[4] << endl;
	cout << "------------------------------------------" << endl;
	cout << "公会  兽人  人数:" << racearr[0] << endl;
	cout << "公会  巨魔  人数:" << racearr[1] << endl;
	cout << "公会 牛头人 人数:" << racearr[2] << endl;
	cout << "公会被遗忘者人数:" << racearr[3] << endl;
	cout << "公会 血精灵 人数:" << racearr[4] << endl;
	cout << "公会  人类  人数:" << racearr[5] << endl;
	cout << "公会  矮人  人数:" << racearr[6] << endl;
	cout << "公会  侏儒  人数:" << racearr[7] << endl;
	cout << "公会暗夜精灵人数:" << racearr[8] << endl;
	cout << "公会 德莱尼 人数:" << racearr[9] << endl;
	cout << "------------------------------------------" << endl;
	cout << "公会  战士  人数:" << jobarr[0] << endl;
	cout << "公会  猎人  人数:" << jobarr[1] << endl;
	cout << "公会  萨满  人数:" << jobarr[2] << endl;
	cout << "公会 潜行者 人数:" << jobarr[3] << endl;
	cout << "公会  法师  人数:" << jobarr[4] << endl;
	cout << "公会 德鲁伊 人数:" << jobarr[5] << endl;
	cout << "公会 圣骑士 人数:" << jobarr[6] << endl;
	cout << "公会  牧师  人数:" << jobarr[7] << endl;
	cout << "公会  术士  人数:" << jobarr[8] << endl;
	cout << "公会死亡骑士人数:" << jobarr[9] << endl;
	cout << "***************公会统计信息***************" << endl;
}

void search(Allmember* phead)
{
	int Id;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入需要查找的编号=>";
		cin >> Id;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		while (phead->p_next)
		{
			if (phead->p_next->getId() == Id)
			{
				phead->p_next->showInfo();
				return;
			}
			phead = phead->p_next;
		}
		break;
	}
	cout << "查无此人!" << endl;
}

void deletemenber(Allmember* phead)
{
	cout << "注:输入0取消删除操作。" << endl;
	int Id;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入需要删除的编号=>";
		cin >> Id;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (0 == Id)
		{
			cout << "已取消删除操作。" << endl;
			return;
		}
		while (phead->p_next)
		{
			if (phead->p_next->getId() == Id)
			{
				string Name = phead->p_next->getName();
				Allmember* deltemp;
				deltemp = phead->p_next;
				phead->p_next = phead->p_next->p_next;
				delete deltemp;
				cout << Name << "已退出公会!" << endl;
				return;
			}
			phead = phead->p_next;
		}
		break;
	}
	cout << "查无此人!" << endl;
}

void modmenber(Allmember* phead)
{
	Allmember* truephead = phead;
	cout << "注:输入0取消删除操作。" << endl;
	int Id;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入需要变更职务的编号=>";
		cin >> Id;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (0 == Id)
		{
			cout << "已取消变更操作。" << endl;
			return;
		}
		while (phead->p_next)
		{
			if (phead->p_next->getId() == Id)
			{
				int newrank;
				cout << "1、会长  2、官员  3、精英  4、会员  5、见习" << endl;
				while (true)
				{
					int availableChars = (int)cin.rdbuf()->in_avail();
					if (availableChars)
					{
						cin.ignore(numeric_limits<streamsize>::max(), '\n');
					}
					cout << "请输入新的公会会阶=>";
					cin >> newrank;
					if (cin.fail()) {
						cout << "输入内容不是整数,请重新输入!" << endl;
						cin.clear();
						continue;
					}
					if (0 == newrank)
					{
						cout << "已取消变更操作。" << endl;
						return;
					}
					if (newrank < 1 || newrank > 5)
					{
						cout << "输入会阶选项超出范围(1~5),请重新输入。" << endl;
						continue;
					}
					if (newrank == 1)
					{
						bool isOk = checkrank(truephead);
						if (isOk)
						{
							break;
						}
						else
						{
							cout << "公会只允许一名会长,请重新输入。" << endl;
							continue;
						}
					}
					break;
				}
				int oldrank = phead->p_next->getGuildRank();
				if (oldrank == newrank)
				{
					cout << "新会阶与原会阶一样。" << endl;
					return;
				}
				int Sex = phead->p_next->getSex();
				int worker = phead->p_next->getWorker();
				int race = phead->p_next->getRace();
				string Name = phead->p_next->getName();
				Allmember* temp= phead->p_next->p_next;
				delete phead->p_next;
				phead->p_next = newmember(Id, Name, Sex, worker, race, newrank);
				phead->p_next->p_next = temp;
				if (oldrank > newrank)
				{
					cout << Name << "已晋升" << endl;
				}
				else
				{
					cout << Name << "已降职" << endl;
				}
				return;
			}
			phead = phead->p_next;
		}
		break;
	}
	cout << "查无此人!" << endl;
}

void sortmenber(Allmember* phead)
{
	Allmember* truephead = phead;
	cout << "1、按照编号升序排列。" << endl;
	cout << "2、按照编号降序排列。" << endl;
	cout << "注:输入0取消删除操作。" << endl;
	int sortmod;
	while (true)
	{
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "请输入需要排序的模式=>";
		cin >> sortmod;
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (0 == sortmod)
		{
			cout << "已取消变更操作。" << endl;
			return;
		}
		if (sortmod < 1 || sortmod > 2)
		{
			cout << "输入选项超出范围(1~2),请重新输入。" << endl;
			continue;
		}
		break;
	}
	int total = 0;
	while (phead->p_next)
	{
		++total;
		phead = phead->p_next;
	}
	if (total < 2)
	{
		cout << "当前公会人数少于2人无法排序。" << endl;
		return;
	}
	phead = truephead;
	int* intarr = new int[total];
	Allmember** Allmemberarr = new Allmember* [total];
	int i = 0;
	while (phead->p_next)
	{
		Allmemberarr[i] = phead->p_next;
		intarr[i] = phead->p_next->getId();
		++i;
		phead = phead->p_next;
	}
	int flag;
	for (int i = 0; i < total - 1; ++i)
	{
		flag = 0;
		for (int j = 0; j < total - i - 1; ++j)
		{
			if (sortmod == 1)
			{
				if (intarr[j] > intarr[j + 1])
				{
					int tmp = intarr[j];
					intarr[j] = intarr[j + 1];
					intarr[j + 1] = tmp;
					Allmember* sorttemp = Allmemberarr[j];
					Allmemberarr[j] = Allmemberarr[j + 1];
					Allmemberarr[j + 1] = sorttemp;
					flag = 1;
				}
			}
			else
			{
				if (intarr[j] < intarr[j + 1])
				{
					int tmp = intarr[j];
					intarr[j] = intarr[j + 1];
					intarr[j + 1] = tmp;
					Allmember* sorttemp = Allmemberarr[j];
					Allmemberarr[j] = Allmemberarr[j + 1];
					Allmemberarr[j + 1] = sorttemp;
					flag = 1;
				}
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
	phead = truephead;
	for (int i = 0; i < total; ++i)
	{
		phead->p_next = Allmemberarr[i];
		phead = phead->p_next;
	}
	phead->p_next = NULL;
	cout << "排序后结果:" << endl;
	showallmember(truephead);
}

int main()
{
	showtable();
	Allmember* pHead = initList();
	Allmember* pQuit = NULL;
	read_member(pHead);
	int choice = 8;
	do {
		int availableChars = (int)cin.rdbuf()->in_avail();
		if (availableChars)
		{
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
		}
		cout << "主菜单选项=>" ;
		cin >> choice;
		system("cls");
		showtable();
		if (cin.fail()) {
			cout << "输入内容不是整数,请重新输入!" << endl;
			cin.clear();
			continue;
		}
		if (choice < 0 || choice> 7 )
		{
			cout << "输入数字超出范围,请重新输入。" << endl;
			continue;
		}
		switch (choice)
		{
		case ADD:
			addmember(pHead);
			savemember(pHead);
			break;
		case LIS:
			showallmember(pHead);
			break;
		case DEL:
			deletemenber(pHead);
			savemember(pHead);
			break;
		case MOD:
			modmenber(pHead);
			savemember(pHead);
			break;
		case SER:
			search(pHead);
			break;
		case SOR:
			sortmenber(pHead);
			savemember(pHead);
			break;
		case CHE:
			statistics(pHead);
			break;
		default:
			break;
		}
	} while (choice);
	while (pHead)
	{
		pQuit = pHead;
		pHead = pHead->p_next;
		delete pQuit;	
	}
	cout << "欢迎下次使用,再见。" << endl;
	return 0;
}

20230719修改:代码里有一处内存泄漏没有注意到。
在代码第974行(函数:void sortmenber(Allmember* phead)末尾)插入如下代码:

	showallmember(truephead);
	if (intarr != NULL)
	{
		delete intarr;
		intarr = NULL;
		cout << "delete intarr" << endl;
	}
	if (Allmemberarr != NULL)
	{
		delete Allmemberarr;
		Allmemberarr = NULL;
		cout << "delete Allmemberarr" << endl;
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年7月广州/深圳软考中级系统集成项目管理工程师招生

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

FFmpeg 命令行实现居中高清上下模糊播放效果

FFmpeg 命令行实现居中高清上下模糊播放效果。 1、16:9 的横屏原视频&#xff0c;以 16:9 竖屏上下模糊播放 以该效果播放视频的命令如下&#xff1a; ffplay -i horizontal_test_video_169.mp4 -vf \ "split[a][b]; \ [a]crop(ih/16*9):ih,scaleiw/10:-1,gblursigma5…

GreatSQL通过错误日志信息判断数据库实例是如何关闭的

背景概述 在一次客户的数据库实例连接不上了&#xff0c;需要我们排查一下原因&#xff0c;通过查看数据库实例进程已经不存在了&#xff0c;在错误日志中没有发现其他报错信息&#xff0c;发现有shutdown的字样出现&#xff0c;怀疑是某个用户手动关闭了实例。我们通过以下测…

华为认证的题库,不仅能考试,还能帮你提升技能

1、OSPF协议在哪种状态下确定DD报文的主从关系&#xff1f; A. 2-way B.Exchange C. ExStart D. Full 2、在VRP操作系统中&#xff0c;如何进入OSPF区域0的视图&#xff1f;A. [Huawei-ospf-1]area 0 B.[Huawei]ospf area 0 C. [Huawei-ospf-1]area 0 enable D. [Huawe…

珀莱雅、华熙生物、贝泰妮、丸美股份一季报PK,谁是“卷王”?

国货美妆有多“卷”&#xff1f; 618落幕&#xff0c;各大电商平台公布了美妆销售数据。据统计&#xff0c;618期间天猫、京东、抖音、快手四大平台美妆销售总额超过610亿元。 近日&#xff0c;四家国货美妆企业&#xff0c;珀莱雅、华熙生物、贝泰妮、丸美股份分别公布了202…

经济和行政手段使双高企业降低能耗总量和能耗强度,提高能源利用效率-安科瑞黄安南

摘要 2022年6月29日工信部、发改委、财政部、生态环境部、国资委、市场监管总局六部门联合下发《关于印发工业能效提升行动计划的通知》&#xff08;工信部联节〔2022〕76号&#xff0c;以下简称《行动计划》&#xff09;&#xff0c;主要目的是为了提高工业领域能源利用效率&…

【5】Vite+Vue3 JsonPath的使用

在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载方面具有突…

PMP证书怎么考?来自前辈的经验之谈

虽然我成功通过了 PMP 考试&#xff0c;这是我第一季度所做的事情的成果&#xff0c;但是考试的兴奋感很快就过去了。在交流群里&#xff0c;大家都在讨论证书的存续条件以及获得证书后带来的实质性收益&#xff0c;例如补贴、城市定居加分和职业晋升等。与这些相比&#xff0c…

Android ViewGroup onDraw为什么没调用

ViewGroup&#xff0c;它本身并没有任何可画的东西&#xff0c;它是一个透明的控件&#xff0c;因些并不会触发onDraw&#xff0c;但是你现在给LinearLayout设置一个背景色&#xff0c;其实这个背景色不管你设置成什么颜色&#xff0c;系统会认为&#xff0c;这个LinearLayout上…

【Redis】底层探析 I - Redis 有序集合(ZSet)是如何实现的?

目录 ZSet的编码方式 什么是跳跃列表(skiplist)&#xff1f; ZSet的底层结构 跳跃列表的查询过程 ZSet的编码方式 Redis中的有序集合zset底层实现采用了两种编码方式&#xff1a; REDIS_ENCODING_SKIPLIST 跳跃列表REDIS_ENCODING_ZIPLIST 压缩列表 对于不同编码的触发方式…

Kotlin获取Fragment中的组件

左边和右边分别是两个不同的Fragment&#xff0c;左边的Fragment中右一个Button组件&#xff0c;目标是想要获取这个组件的id&#xff0c;以便进行将右边的Fragment更改成另一个Fragmeent的操作。 left_fragment.xml <?xml version"1.0" encoding"utf-8&qu…

raid5故障导致上层文件系统不可用的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器上有两组分别由4块SAS硬盘组建的raid5磁盘阵列&#xff0c;这两组raid5阵列划分LUN并组成LVM结构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列上的一块硬盘未知原因离线&#xff0c;热备盘上线替换离线…

浅谈医用IT隔离电源系统在医疗场所的应用及设计

安科瑞 华楠 摘 要:结合某工程设计实例对IT系统特点、构成及医疗IT系统相关规范要求进行了详细阐述&#xff0c;并提供了医疗IT系统的工程设计经验&#xff0c;旨在推动医疗IT系统的发展。 关键词:医疗IT系统&#xff0c;隔离变压器&#xff0c;绝缘监测&#xff0c;电击 随…

餐饮行业油烟监控管理系统设计与应用

安科瑞 华楠 摘 要&#xff1a;餐饮油烟污染问题已经成为城市环境污染的重要污染源&#xff0c;本研究的油烟在线监测数据管理信息系统是油烟在线监测数据采集仪的配套软件&#xff0c;用于展现现场端数据采集仪采集的数据&#xff0c;对数据采集仪进行远程控制&#xff0c;以…

Docker安装Nacos2.0.2

docker拉取镜像 docker pull nacos/nacos-server:2.0.2查看镜像 docker images创建容器和运行 docker run -e JAVA_OPTS"-Xms256m -Xmx256m" -e MODEstandalone -e PREFER_HOST_MODEhostname -p 8848:8848 --privilegedtrue --restartalways --name nacos -d naco…

Redis简介(1)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis简介1、NoSQL1.1、什么是NoSQL&#xff1f;1.2、NoSQL 特点…

MySQL事务与事务的隔离级别

MySQL事务与事务的隔离级别 什么事务&#xff1f;事务的特点&#xff08;ACID&#xff09;事务的隔离级别多事务运行的并发问题隔离级别repeatable read&#xff08;可重复读&#xff09;之 MVCC&#xff08;多版本并发控制&#xff09; 并发机制优化 什么事务&#xff1f; 事务…

这些项目管理实际问题,你遇到过几个

大家好&#xff0c;我是老原。 我做了这么久的内容&#xff0c;给大家分享了很多干货、工具还有行业的内容。 今天的文章汇总了粉丝们来私信我的一些实际工作问题&#xff0c;不知道这些问题你熟不熟悉&#xff0c;是否也遇到过&#xff1f; 当然&#xff0c;这不仅是纯粹为…

postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 表锁介绍 当表打开&#xff0c;或者操作表时&#xff0c;都需要…

spring复习:(44)使用TransactionProxyFactoryBean来实现事务时,事务是怎么提交的?

TransactionAspectSupport类的invokeWithinTransaction方法的最后&#xff1a; 调用commitTransactionAfterReturning,它的代码如下&#xff1a; 调用的commit代码如下&#xff08;AbstractPlatformTransactionManager类里&#xff09;&#xff1a; 其中调用的processCommit…