データ構造-シングルチェーンテーブルの並べ替えで発生した問題
2743 ワード
シングルチェーンの機能を実現する時に出会う一つの問題、マークの下で.
一度しくじったら一智を得る!
コードを先に見ます
しかし、私の関数の入り口は、私が入ってきたのは率先して接合されたチェーンの頭の針です.
しかし、私の並べ替えアルゴリズムの実装では、頭の最後の結点を考慮していないで、直接に頭のポインタを最初の結点に向けています.
以下のとおりです
もしwindowsの上のcodeblocksこのコンパイラが走るならば、すべて見たところ正常です.通常の並べ替え
私がmacのxcodeというコンパイラで走ると、問題が発生しました.最大の要素はなくなりましたが、最小は0になりました.
その後、
windows上のcodeblocks変数には値が付けられていません.デフォルトは乱数です.mac上のcodeblocksの変数には値が割り当てられていません.デフォルトは0です.
私の頭の結点のデータ領域は割り当てられていないので、windowsでは、数値が大きいので、当然のことながら一番目の結点になりました.印刷するとき、印刷関数を呼び出します.(この関数は頭の結点、つまりL->>nextは最初の結点を表します.)このとき、並べ替えられたチェーンの一番目の結点は印刷関数のチェーンの頭の結点になります.L->nextを通過すると、自然に最初の結点(すなわち、値を付けていません.数字が大きい方)を省略します.結果は正常に見えます.
しかし、xcodeではデフォルトは0です.このようにして、頭の結点のデータを考慮して並べば、0は自然に最後まで並べられます.そして、一番目の結点を省略して、一番大きな要素がなくなりましたが、一番小さいのは0になりました.(私が入力したテストデータは全部0より大きいです.)
自分はまだ水のようです.いつもこんなミスをします.
勉強の途中で、あなたと一緒に勉強します.
一度しくじったら一智を得る!
コードを先に見ます
LinkList SelectSort(LinkList L)
{
LinkList first; /* */
LinkList tail; /* */
LinkList p_min; /* */
LinkList min; /* */
LinkList p; /* */
first = NULL;
while (L != NULL) /* 。*/
{
/* : for */
for (p=L,min=L; p->next!=NULL; p=p->next) /* , 。*/
{
if (p->next->data < min->data) /* min 。*/
{
p_min = p; /* : p->next p。*/
min = p->next; /* 。*/
}
}
/* for , ;
;
, 。*/
/* */
if (first == NULL) /* */
{
first = min; /* 。*/
tail = min; /* : 。*/
}
else /* */
{
tail->next = min; /* , next 。*/
tail = min; /* 。*/
}
/* */
if (min == L) /* */
{
//printf(" %d , 。
", min->data);
L = L->next; /* head head->next, , OK*/
}
else /* */
{
p_min->next = min->next; /* next min next, min 。*/
}
}
if (first != NULL) /* first*/
{
tail->next = NULL; /* next NULL*/
}
L = first;
return L;
}
コードは複雑ですが、簡単です.選択順位でチェーンを並べ替えます.しかし、私の関数の入り口は、私が入ってきたのは率先して接合されたチェーンの頭の針です.
しかし、私の並べ替えアルゴリズムの実装では、頭の最後の結点を考慮していないで、直接に頭のポインタを最初の結点に向けています.
以下のとおりです
/* */
if (first == NULL) /* */
{
first = min; /* 。*/
tail = min; /* : 。*/
}
コードを修正して、高い順に低い順に並べたら、違う環境で違った問題が発生しました.もしwindowsの上のcodeblocksこのコンパイラが走るならば、すべて見たところ正常です.通常の並べ替え
私がmacのxcodeというコンパイラで走ると、問題が発生しました.最大の要素はなくなりましたが、最小は0になりました.
その後、
windows上のcodeblocks変数には値が付けられていません.デフォルトは乱数です.mac上のcodeblocksの変数には値が割り当てられていません.デフォルトは0です.
私の頭の結点のデータ領域は割り当てられていないので、windowsでは、数値が大きいので、当然のことながら一番目の結点になりました.印刷するとき、印刷関数を呼び出します.(この関数は頭の結点、つまりL->>nextは最初の結点を表します.)このとき、並べ替えられたチェーンの一番目の結点は印刷関数のチェーンの頭の結点になります.L->nextを通過すると、自然に最初の結点(すなわち、値を付けていません.数字が大きい方)を省略します.結果は正常に見えます.
しかし、xcodeではデフォルトは0です.このようにして、頭の結点のデータを考慮して並べば、0は自然に最後まで並べられます.そして、一番目の結点を省略して、一番大きな要素がなくなりましたが、一番小さいのは0になりました.(私が入力したテストデータは全部0より大きいです.)
自分はまだ水のようです.いつもこんなミスをします.
勉強の途中で、あなたと一緒に勉強します.