- C/C++ code
#define TRUE 1;#define FALSE 0;//定义Employeetypedef struct { int id; char name[30]; int age; double wage;}Employee;//定义Employee链表结点结构typedef struct node{ Employee* emp; //双向链表 struct node* precede; struct node* next;}EmpNode;//定义Employee链表typedef struct { //链表头结点 EmpNode* head; //当前长度 int length;}EmpList;//选择排序,对输入的链表的结点的Employee排序,排序以wage为依据int sort(EmpList* empList){ int i; int j; //currentNode是记录外层循环的当前结点 EmpNode* currentNode; //tempNode是记录内层循环的游标作用的结点 EmpNode* tempNode; //maxNode是记录最高工资的结点 EmpNode* maxNode; //依次用每一个数据与其它数据比较,遍历一次排好一个数 for(i = 1; i < empList->length; i++) { //初始化游标结点和maxNode为当前结点 tempNode = currentNode->next; maxNode = currentNode; //从当前结点向后遍历 for(j = i; j < empList->length; j++) { //如果游标指示的结点对应的工资比当前工资高,更新maxNode if(tempNode->emp->wage > currentNode->emp->wage) { maxNode = tempNode; } //比较一次后,currentNode向后移动 tempNode = tempNode->next; } //一趟遍历完成后,选出的最大结点与当前结点位置交换 swap(currentNode, maxNode); //交换完成后让当前结点后移一位 currentNode = currentNode->next; } return TRUE;}//交换链表中的两个结点的位置int swap(EmpNode* node1, EmpNode* node2){ //交换前先记录下node1的前后结点 EmpNode* preNode = node1->precede; EmpNode* nextNode = node1->next; //使node1处于node2的位置 node1->precede = node2->precede; node1->next = node2->next; node2->precede->next = node1; if(NULL != (node2->next)) { node2->next->precede = node1; } //使node2处于原来node1的位置 node2->precede = preNode; node2->next = nextNode; preNode->next = node2; if(NULL != (nextNode)) { nextNode->precede = node2; } return TRUE;}
这个排序函数没有编错误,但是使用不正常,好像是自身又连接自身了,不知道哪里有问题
------解决方案--------------------------------------------------------
EmpNode* currentNode;
//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;
//maxNode是记录最高工资的结点
EmpNode* maxNode;
//依次用每一个数据与其它数据比较,遍历一次排好一个数
for(i = 1; i < empList->length; i++)
{
//初始化游标结点和maxNode为当前结点
tempNode = currentNode->next;//currentNode 没有初始化
maxNode = currentNode;