-2

コードに問題があり、助けていただけるかどうかを確認する必要があります。ROOM Struct をバブルソートしようとしていますが、コードは以下のとおりです。ほぼ、部屋 1 の名前: z ... 部屋 2 の名前: a、これらを並べ替えて、A、B などを表示するようにします。

問題: リンク リストを出力すると、この並べ替えによって特定のノードが消えてしまいます。たとえば、Z > A を並べ替えて先頭に配置した後、リンク リストを印刷すると A が消えてしまいます。

助けてくれてありがとう!

 void sortRoomsByName(int count, ROOM *head)
{
int i;
int j;

for(i = count ; i > 1 ; i-- ) //outer loop
{
    ROOM *temp;
    ROOM *swap1;

    swap1 = head;
    for(j = 0 ; j < count-1 ; j++ ) //inner loop
    {
        if(strcmp(swap1->roomName,swap1->nextRoom->roomName)<0) //compares names and swaps
        {
            ROOM *swap2;
            swap2 = swap1->nextRoom;
            swap1->nextRoom = swap2->nextRoom;
            swap2->nextRoom = swap1;
            if(swap1 == head)
            {
                head = swap2;
                swap1 = swap2;
            }
            else
            {
                swap1 = swap2;
                temp->nextRoom = swap2;
            }
        }
        temp = swap1;
        swap1 = swap1->nextRoom;
    }
}

}

4

1 に答える 1

0
void sortRoomsByName(int count, ROOM *head)
{
int i;
int j;

for(i = 0 ; i < count - 1 ; i ++ ) //outer loop
{
    ROOM *swap1;

    swap1 = head;
    for(j = 0 ; j < count - i - 1 ; j ++ ) //inner loop
    {
        if(strcmp(swap1->roomName,swap1->nextRoom->roomName)<0) //compares names and swaps
        {
            ROOM *swap2;
            swap2 = swap1->nextRoom;
            swap1->nextRoom = swap2->nextRoom;
            swap2->nextRoom = swap1;
            if(swap1 == head)
            {
                head = swap2;
            }
        }
        else
        {
            swap1 = swap1->nextRoom;
        }
    }
}

スワップが行われない場合は、次のノードにジャンプする必要があります。これが役立つことを願っています...

編集: 関数の引数から Head を削除し、それをグローバルにするか、次のように渡します..

void sortRoomsByName(int count, ROOM **head)
{
int i;
int j;

for(i = 0 ; i < count - 1 ; i ++ ) //outer loop
{
    ROOM *swap1;

    swap1 = *head;
    for(j = 0 ; j < count - i - 1 ; j ++ ) //inner loop
    {
        if(strcmp(swap1->roomName,swap1->nextRoom->roomName)<0) //compares names and swaps
        {
            ROOM *swap2;
            swap2 = swap1->nextRoom;
            swap1->nextRoom = swap2->nextRoom;
            swap2->nextRoom = swap1;
            if(swap1 == head)
            {
                *head = swap2;
            }
        }
        else
        {
            swap1 = swap1->nextRoom;
        }
    }
}

int main (void)
{
    sortRoomsByName(count /* your variable */, &head /* your head pointer */);
}
于 2012-12-06T12:35:43.273 に答える