#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; }



