首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

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

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

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

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;

热点排行