新手虚心请教:C语言交换双链表内的两个结点位置,代码尽力写得规范了,大家帮忙,谢谢

时间:2021-02-21 23:18:56

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

#1


EmpNode* currentNode;

    //tempNode是记录内层循环的游标作用的结点
    EmpNode* tempNode;
    
    //maxNode是记录最高工资的结点
    EmpNode* maxNode;

    //依次用每一个数据与其它数据比较,遍历一次排好一个数
    for(i = 1; i < empList->length; i++)
    {
        //初始化游标结点和maxNode为当前结点
        tempNode = currentNode->next;//currentNode 没有初始化

        maxNode = currentNode;