栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++单链表实现教职工管理系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++单链表实现教职工管理系统

#include
#include
#include
using namespace std;
typedef class lnode {
public:
	int no;
	int depno;
	int value;
	string name;
	class lnode* next;
}lnode, * linklist;





//初始化链表
bool initlist(linklist& L)
{
	L = (lnode*)new lnode;//指向头结点
	if (L == NULL)
		return false;//内存不足,分配空间失败
	(*L).next = NULL;//头节点为空
	return true;
}



//在第i个节点插入(链表指针,节点序号,编号s,部门号de,名字n,价格v)
bool listinsert(linklist& L, int i, int s, int de, string n, int v)
{

	if (i < 1)
		return false;
	lnode* p;//当前扫描到的节点指针
	int j = 0;//p指向的是第几个节点
	p = L;//指向头节点
	while (p != NULL && j < i - 1)//使p指向插入节点的前一个节点
	{
		p = p->next;
		j++;
	}

	if (p == NULL)
		return false;
	lnode* s1 = (lnode*)new lnode;
	s1->no = s;
	s1->name = n;
	s1->depno = de;
	s1->value = v;
	s1->next = p->next;
	p->next = s1;
	return true;
}



//删除第i个节点
bool listdelete(linklist& L, int i)
{
	if (i < 1)
		return false;
	lnode* p;//当前节点指针
	int j = 0;
	p = L;
	while (p != NULL && j < i - 1)//使p指向i-1节点处
	{
		p = p->next;
		j++;
	}

	if (p == NULL)
		return false;
	if (p->next == NULL)
		return false;
	lnode* q = p->next;
	p->next = q->next;

	delete q;
	return true;
}



//菜单显示
void menu()
{
	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 << "-------------------------------------------------------------------------" << endl;
}


//下级菜单显示
void menu2()
{
	cout << "-------------------------------------------------------------------------" << endl;
	cout << "请操作:" << endl;
	cout << "1:按链表位序查找" << endl;
	cout << "2:按名字查找" << endl;
	cout << "-------------------------------------------------------------------------" << endl;
}

//排序下级菜单显示
void menu3()
{
	cout << "-------------------------------------------------------------------------" << endl;
	cout << "请操作:" << endl;
	cout << "1:编号排序" << endl;
	cout << "2:部门标号排序" << endl;
	cout << "3:价值排序" << endl;
	cout << "-------------------------------------------------------------------------" << endl;
}



//摧毁下级菜单显示
void menu4()
{
	cout << "-------------------------------------------------------------------------" << endl;
	cout << "请操作:" << endl;
	cout << "1:按链表位序摧毁" << endl;
	cout << "2:按教职工编号摧毁" << endl;
	cout << "3:DESTORY ALL!!!!" << endl;
	cout << "-------------------------------------------------------------------------" << endl;
}




void listInitialization(linklist& L)//第一次输入链表
{
	int z;
	cout << "你要输入几个人?" << endl;
	cin >> z;
	int a, b, de;
	string c;
	for (int i = 1; i <= z; i++)
	{
		cout << "请输入第" << i << "个人的信息,格式为:编号,部门号,书名,价格" << endl;
		cin >> a >> de >> c >> b;
		if (listinsert(L, i, a, de, c, b))
			cout << "第" << i << "个人的信息输入成功" << endl;
		else
		{
			cout << "超出链表范围";
			break;
		}
		cout << "操作完毕" << endl;
	}
}



//选定一个节点,插入多本书
bool listinsertmany(linklist& L)//选定一个节点,插入多本书
{
	int z, i;
	cout << "你要输入几个人的信息?" << endl;
	cin >> z;
	if (z < 1)
	{
		cout << "输入错误" << endl;
		return false;
	}
	cout << "要插入到链表序号几?" << endl;
	cin >> i;


	int a, b;
	int de;
	string c;
	for (int w = 0; w < z; w++, i++)
	{
		cout << "请输入序号为" << i << "的人的信息,格式为:编号,部门号,书名,价格" << endl;
		cin >> a;
		cin >> de >> c >> b;
		if (listinsert(L, i, a, de, c, b))
			cout << "序号为" << i << "的people的信息已成功输入" << endl;
		else
			cout << "超出链表范围" << endl;
	}
	cout << "操作完毕" << endl;
	return true;
}


//按链表位序查找(链表指针,节点位序),返回要查找节点的指针(注意:会返回头结点)
lnode* get_elem_in_order(linklist L, int i)
{

	if (i < 0)
		return NULL;
	lnode* p;
	p = L;
	int j = 0;
	while (p != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	return p;
}




//按书名查找(链表指针,书名)(注:如未找到,会返回NULL)
lnode* get_elem_by_name(linklist L, string e)
{
	lnode* p = L->next;
	while (p != NULL && p->name != e)
	{
		p = p->next;
	}
	return p;
}

//显示全部图书(链表指针),返回值无意义
bool showall(linklist& L) {
	lnode* p = L->next;//指针p指向节点1
	cout << "------------------------------------------------------------------------" << endl;
	cout << "编号" << setw(20) << "部门" << setw(20) << "名字" << setw(20) << "价格" << endl;
	for (; p != NULL; p = p->next)
	{
		cout << p->no << setw(20) << p->depno << setw(20) << p->name << setw(20) << p->value << endl;
	}
	cout << "------------------------------------------------------------------------" << endl;
	cout << "显示完成" << endl;
	return true;
}



//显示结点书籍信息
bool show(lnode* p) {
	if (p == NULL)
	{
		cout << "------------------------------------------------------------------------" << endl;
		cout << "未找到" << endl;
		return false;
	}
	cout << "------------------------------------------------------------------------" << endl;
	cout << "序号" << setw(20) << "部门" << setw(20) << "书名" << setw(20) << "价格" << endl;
	cout << p->no << setw(20) << p->depno << setw(20) << p->name << setw(20) << p->value << endl;
	return true;
}

//no序号升序排列
bool Ascending_order_of_numbers(linklist& L)
{
	lnode* p, * q;
	int t;
	string st1;
	p = L->next;
	if (p == NULL)return false;
	while (p != NULL)//第一重循环将p的位置固定下来,进入第二重循环与后面的遍历指针p所指向的结点之间相互比较大小
	{
		q = p->next;//将q指向p的下一个结点,进行数据之间的大小比较
		while (q != NULL)//第二重循环就是不断将指针q后移,与p所指向的结点数据进行大小比较,数据互换
		{
			if (p->no > q->no)
			{
				t = p->value;//将数据寄存在t中,进行互换
				p->value = q->value;
				q->value = t;
				t = p->depno;//将数据寄存在t中,进行互换
				p->depno = q->depno;
				q->depno = t;
				t = p->no;//将数据寄存在t中,进行互换
				p->no = q->no;
				q->no = t;
				st1 = p->name;
				p->name = q->name;
				q->name = st1;
			}
			q = q->next;//遍历
		}
		p = p->next;

	}


	return true;

}




bool department_number(linklist& L)
{
	lnode* p, * q;
	int t;
	string st1;
	p = L->next;
	if (p == NULL)return false;
	while (p != NULL)//第一重循环将p的位置固定下来,进入第二重循环与后面的遍历指针p所指向的结点之间相互比较大小
	{
		q = p->next;//将q指向p的下一个结点,进行数据之间的大小比较
		while (q != NULL)//第二重循环就是不断将指针q后移,与p所指向的结点数据进行大小比较,数据互换
		{
			if (p->depno > q->depno)
			{
				t = p->value;//将数据寄存在t中,进行互换
				p->value = q->value;
				q->value = t;
				t = p->depno;//将数据寄存在t中,进行互换
				p->depno = q->depno;
				q->depno = t;
				t = p->no;//将数据寄存在t中,进行互换
				p->no = q->no;
				q->no = t;
				st1 = p->name;
				p->name = q->name;
				q->name = st1;
			}
			q = q->next;//遍历
		}
		p = p->next;

	}


	return true;

}



bool value_in_order(linklist& L)
{
	lnode* p, * q;
	int t;
	string st1;
	p = L->next;
	if (p == NULL)return false;
	while (p != NULL)//第一重循环将p的位置固定下来,进入第二重循环与后面的遍历指针p所指向的结点之间相互比较大小
	{
		q = p->next;//将q指向p的下一个结点,进行数据之间的大小比较
		while (q != NULL)//第二重循环就是不断将指针q后移,与p所指向的结点数据进行大小比较,数据互换
		{
			if (p->value > q->value)
			{
				t = p->value;//将数据寄存在t中,进行互换
				p->value = q->value;
				q->value = t;
				t = p->depno;//将数据寄存在t中,进行互换
				p->depno = q->depno;
				q->depno = t;
				t = p->no;//将数据寄存在t中,进行互换
				p->no = q->no;
				q->no = t;
				st1 = p->name;
				p->name = q->name;
				q->name = st1;
			}
			q = q->next;//遍历
		}
		p = p->next;

	}


	return true;

}







//(链表指针,人的编号no)摧毁编号为no的教职工信息
bool destory_Faculty_by_no(linklist& L, int x)
{

	lnode* p = (L->next);//初始指向1号节点
	int w = 1;
	while (p != NULL)
	{
		if (p->no == x)
		{
			p = p->next; listdelete(L, w); w++;
		}
		else { p = p->next; w++; }
	}
	return true;
}



//DESTORY ALLLLLLLL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
bool destoryALL(linklist& L)
{

	lnode *q,* p = (L->next);//初始指向1号节点
	while (p != NULL)
	{
		q = p->next;
		delete p;
		p = q;
	}
	L->next = NULL;	
	return true;
}



int main()
{
	linklist b;
	lnode* p;
	int a;
	if (initlist(b))
		cout << "链表初始化成功" << endl;
	else
	{
		cout << "链表初始化失败" << endl; return 0;
	}
	for (int e = 0; e == 0; e = e + 0)
	{
		menu();

		int c; cin >> c;

		switch (c)
		{
		case 1:listInitialization(b); break;
		case 2:listinsertmany(b); break;

		case 3: 
		{int er; menu4(); cin >> er;
		switch (er)
		{
		case 1: {cout << "删除链表序号为几的人?" << endl; int d; cin >> d; listdelete(b, d); }; break;
		case 2: {cout << "要删除信息的职工号是多少?" << endl; int ert; cin >> ert; destory_Faculty_by_no(b, ert); cout << ert << "号目标已全部摧毁" << endl; }; break;
		case 3: {destoryALL(b); cout << "All targets have been destroyed!!!!!!!" << endl; }; break;
		}
		}break;
		case 4:showall(b); break;
		case 5:
		{menu2(); int h; cin >> h;
		switch (h)
		{
		case 1: {int hr; cout << "要查找的人链表位序为" << endl; cin >> hr; show(get_elem_in_order(b, hr)); }; break;
		case 2: {string hg; cout << "要查找的人的名字是" << endl; cin >> hg; show(get_elem_by_name(b, hg)); }; break;
		}
		}  break;
		case 7:e++; break;
		case 6:
		{
			menu3();
			int rt; cin >> rt;
			switch (rt)
			{
			case 1:Ascending_order_of_numbers(b); break;
			case 2:department_number(b); break;
			case 3:value_in_order(b); break;
			}
			cout << "排序操作已完成" << endl;
		}break;
		default:cout << "请重新输入" << endl;
		}

	}
	cout << "程序退出" << endl;
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号