C++链式队列节点使用冒泡排序按hourlySalary排序失效求助
问题排查与修复方案
核心错误点
- 冒泡排序函数
bubbleSort的比较条件存在笔误:原代码写为if(i->hourlySalary > i->hourlySalary),是同一个节点的薪资和自身比较,条件永远不成立,交换函数完全不会被触发,因此节点不会有任何排序效果。 - 你当前写的双层循环逻辑属于选择排序的实现逻辑,不是标准冒泡排序的相邻节点比较逻辑,但修正比较条件后即可正常得到正确排序结果,如果需要严格符合冒泡排序的要求,可以再调整循环逻辑为相邻节点两两比较。
Swap交换函数的实现没有问题,通过交换节点内部数据的方式在当前场景下是可行的,不需要额外修改。
修正后的完整代码
#include <iostream> using namespace std; class myNumberIsEleven{ private: struct linkedlist{ string firstName; string lastName; unsigned int age; char gender; int hourlySalary; linkedlist *linker; }*Ptr,*curPtr; public: int counter=0; myNumberIsEleven(){ Ptr=NULL; } void printList(){ curPtr=Ptr; while(curPtr!=NULL){ cout << curPtr->firstName << " " << curPtr->lastName << endl << curPtr->age << endl << curPtr->gender << endl << curPtr->hourlySalary << endl << "=====" << endl; curPtr=curPtr->linker; } } void add(int salary,string name,string lastname,int ageisjustanumber,char Gender){ linkedlist *newPtr = new linkedlist; newPtr->hourlySalary = salary; newPtr->firstName = name; newPtr->lastName = lastname; newPtr->gender = Gender; newPtr->age = ageisjustanumber; newPtr->hourlySalary = salary; newPtr->linker = Ptr; Ptr = newPtr; counter++; } void Swap(linkedlist* a,linkedlist* b){ string temp_firstName; string temp_LastName; unsigned int temp_Age; char temp_Gender; int temp_hourlySalray; temp_firstName = a->firstName; temp_LastName = a->lastName; temp_Age = a->age; temp_Gender = a->gender; temp_hourlySalray = a->hourlySalary; a->firstName = b->firstName; a->lastName = b->lastName; a->age = b->age; a->gender = b->gender; a->hourlySalary = b->hourlySalary; b->firstName = temp_firstName; b->lastName = temp_LastName; b->age = temp_Age; b->gender = temp_Gender; b->hourlySalary = temp_hourlySalray; } void bubbleSort(){ // 仅修改了if判断的条件,把i和i比较改为i和j比较 for(linkedlist* i=Ptr;i->linker != NULL;i=i->linker){ for(linkedlist* j = i->linker;j!=NULL;j=j->linker){ if(i->hourlySalary > j->hourlySalary){ Swap(i,j); } } } printList(); } }; int main() { myNumberIsEleven myNameIsBerkan; myNameIsBerkan.add(1000,"berkan","iwontgivemysurname",21,'M'); myNameIsBerkan.add(2100,"ah","be",31,'F'); myNameIsBerkan.add(50,"uhmmm","something",10,'M'); myNameIsBerkan.add(69000,"elon","musk",44,'M'); myNameIsBerkan.bubbleSort(); return 0; }
运行修改后的代码,会按照hourlySalary从小到大输出所有节点信息。
内容的提问来源于stack exchange,提问作者Berkan
相关产品推荐
相关产品推荐

