#define TRUE 1;
#define FALSE 0;
//定义Employee
typedef 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;
}
这个排序函数没有编错误,但是使用不正常,好像是自身又连接自身了,不知道哪里有问题
1 个解决方案
#1
EmpNode* currentNode;
//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;
//maxNode是记录最高工资的结点
EmpNode* maxNode;
//依次用每一个数据与其它数据比较,遍历一次排好一个数
for(i = 1; i < empList->length; i++)
{
//初始化游标结点和maxNode为当前结点
tempNode = currentNode->next;//currentNode 没有初始化
maxNode = currentNode;
//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;
//maxNode是记录最高工资的结点
EmpNode* maxNode;
//依次用每一个数据与其它数据比较,遍历一次排好一个数
for(i = 1; i < empList->length; i++)
{
//初始化游标结点和maxNode为当前结点
tempNode = currentNode->next;//currentNode 没有初始化
maxNode = currentNode;
#1
EmpNode* currentNode;
//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;
//maxNode是记录最高工资的结点
EmpNode* maxNode;
//依次用每一个数据与其它数据比较,遍历一次排好一个数
for(i = 1; i < empList->length; i++)
{
//初始化游标结点和maxNode为当前结点
tempNode = currentNode->next;//currentNode 没有初始化
maxNode = currentNode;
//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;
//maxNode是记录最高工资的结点
EmpNode* maxNode;
//依次用每一个数据与其它数据比较,遍历一次排好一个数
for(i = 1; i < empList->length; i++)
{
//初始化游标结点和maxNode为当前结点
tempNode = currentNode->next;//currentNode 没有初始化
maxNode = currentNode;