您的位置:首页 > 编程语言 > C语言/C++

C语言实现链表之单向链表(十四)链表打印和排序

2015-11-08 21:42 323 查看

C语言实现链表之单向链表(十四)链表打印和排序

    上一篇文章给出了获取数据对应的结点的函数,本篇文章将给出链表打印和排序的函数,关键在于排序。

/*==============================================================================
*   操作  :打印链表中的所有结点的数据元素
*   操作前:pHeadNode为链表的头指针
*   操作后:打印出所有数据元素
==============================================================================*/
void PrintfListDataNode(MyListNode* pHeadNode)
{
int icount = 0;

while(pHeadNode != NULL)
{
icount++;
printf("The node %d's name is %s, age is %d.\n", icount, pHeadNode->sNodeData.cName,
pHeadNode->sNodeData.iAge);
pHeadNode = pHeadNode->pNextNodeAddr;
}
printf("\n");
}

/*==============================================================================
*   操作  :对链表中的数据进行排序,2015年9月17日添加,采用冒泡排序法
*   操作前:pHeadNode为链表的头指针
*   操作后:返回排序后的头指针
==============================================================================*/
MyListNode* SortList(MyListNode* pHeadNode)
{
MyListNode* ptemp1 = NULL;
MyListNode* ptemp2 = NULL;
MyListNode* ptemp3 = NULL;

for (ptemp1 = pHeadNode; ptemp1->pNextNodeAddr != NULL; ptemp1 = ptemp1->pNextNodeAddr)
{
MyListNode* pEnd = ptemp3;
ptemp2 = pHeadNode;
ptemp3 = ptemp2->pNextNodeAddr;
for (; ptemp3 != pEnd; ptemp2 = ptemp2->pNextNodeAddr, ptemp3 = ptemp3->pNextNodeAddr)
{
if (ptemp2->sNodeData.iAge > ptemp3->sNodeData.iAge)
{
int temp = ptemp2->sNodeData.iAge;
ptemp2->sNodeData.iAge = ptemp3->sNodeData.iAge;
ptemp3->sNodeData.iAge = temp;

char ctemp[20];
strcpy(ctemp, ptemp2->sNodeData.cName);
strcpy(ptemp2->sNodeData.cName, ptemp3->sNodeData.cName);
strcpy(ptemp3->sNodeData.cName, ctemp);
}
}
}

return pHeadNode;
}


    打印链表大家很清楚地可以明白,主要是对链表排序这个函数可能比较难理解,下面说一下其思想。

    该链表的排序算法采用了冒泡排序法的思想,它使用了两个指针,分别存储相邻的结点,类似于冒泡排序中的相邻数据,然后使用冒泡的思想进行循环即可,注意,这里的排序只改变了结点中的数据,而没有改变结点的顺序,即每个结点指针域的值还是不变的,我们只是对链表中的数据进行了排序。

    这个函数可能比较难理解,大家可以仔细思考一下,只要理解了冒泡排序的思想,再类比一下就比较好理解,不过这种排序算法并不是最好的,在《程序员面试宝典》中给出了其他的排序算法,那里采用了标准的冒泡排序法的步骤,即通常见到的i、j控制双层循环体,然后进行比较排序,不过那里需要知道链表的长度,用来控制何时终止循环,感兴趣的读者可以自己动手先写一下试试,然后比较一下,发现各有所长,我这个程序可能相对于复杂一些,但是这是标准的链表操作,不够我建议大家可以掌握那种基本的方法,容易理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息