专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

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

发布时间:2011-06-23 14:27:03 文章来源:www.iduyao.cn 采编人员:星星草
新手虚心请教:C语言交换双链表内的两个结点位置,代码尽力写得规范了,大家帮忙,谢谢
C/C++ code

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




这个排序函数没有编错误,但是使用不正常,好像是自身又连接自身了,不知道哪里有问题

------解决方案--------------------
EmpNode* currentNode;

//tempNode是记录内层循环的游标作用的结点
EmpNode* tempNode;

//maxNode是记录最高工资的结点
EmpNode* maxNode;

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

maxNode = currentNode;
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: