C言語はチェーンテーブルの一方向チェーンテーブル(14)チェーンテーブルの印刷と並べ替えを実現する


C言語はチェーンテーブルの一方向チェーンテーブル(14)チェーンテーブルの印刷と並べ替えを実現する
前の記事では、データに対応するノードを取得する関数を示しました.この記事では、チェーンテーブルの印刷とソートの関数を示します.ポイントはソートです.
/*============================================================================== 
*       :               
*      :pHeadNode       
*      :         
==============================================================================*/
void PrintfListDataNode(MyListNode* pHeadNode)
{
    int icount = 0;

    while(pHeadNode != NULL)
    {
        icount++;
        printf("The node %d's name is %s, age is %d.
", icount, pHeadNode->sNodeData.cName, pHeadNode->sNodeData.iAge); pHeadNode = pHeadNode->pNextNodeAddr; } printf("
"); } /*============================================================================== * : ,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; }

   
チェーンテーブルを印刷することはよくわかりますが、主にチェーンテーブルのソートという関数が理解しにくいかもしれません.以下、その考えを説明します.
このチェーンテーブルの並べ替えアルゴリズムは、2つのポインタを用いて隣接するノードをそれぞれ格納し、バブル並べ替えにおける隣接データに類似し、バブルの考え方を用いてループすればよいという考え方を採用している.ここでの並べ替えは、ノード内のデータのみを変更し、ノードの順序、すなわち各ノードポインタ領域の値は変わらないことに注意する.チェーンテーブルのデータをソートしただけです.
この関数は理解しにくいかもしれませんが、よく考えてみてください.バブルソートの考えを理解して、もっと類比すれば理解しやすいですが、このソートアルゴリズムは最高ではありません.「プログラマー面接宝典」では、標準的なバブルソート法のステップ、つまり通常見られるi、j二層循環体を制御し、比較並べ替えを行うが、そこにはチェーンテーブルの長さを知る必要があり、いつ循環を終了するかを制御するために使用され、興味のある読者は自分で書いてみて、それから比較してみると、それぞれの長所があり、私のこのプログラムは比較的複雑かもしれないが、これは標準的なチェーンテーブル操作である.そんな基本的な方法を身につけて、理解しやすいことをお勧めします.