データ構造-シングルチェーンテーブルの並べ替えで発生した問題

2743 ワード

シングルチェーンの機能を実現する時に出会う一つの問題、マークの下で.
一度しくじったら一智を得る!
コードを先に見ます
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より大きいです.)
自分はまだ水のようです.いつもこんなミスをします.
勉強の途中で、あなたと一緒に勉強します.