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