0

だからアイデアは、構造体として定義された二重にリンクされたリストを持っているということです

struct Node
{
    struct Node *next;
    struct Node *prev;
    char value[5];
};

struct DoubleLinkedList
{
   int size;
   struct Node *head;
   struct Node *tail;
};

InsertionSort 関数を使用してリストに挿入しています。二重にリンクされたリストへのポインターをパラメーターとして渡すと、リストに新しい4文字の文字列ノードが追加されて変更されます(辞書順にソートされたリンクリスト)。次に、各文字列ノードを追加してリンク リストを出力します。

印刷に問題があることが判明しています。現在、以下のコードでは、出力は常に次のようになります (すべてのステップで挿入される文字列が aaaa、bbbb、cccc であると仮定します...)

ああああ

bbbb -> bbbb

cccc -> cccc -> cccc

何らかの理由で、リンクされたリスト構造がすべてのノードを、挿入される新しい文字列の値に変更しています。理由がわかりません!また、印刷ブロックをメイン関数にシフトしようとすると、意味不明に印刷されます。

int main()
{
    struct DoubleLinkedList strings;
    while (1)
{
    sleep(1);
    char s[5];
    GenerateRandomString(s,4);
    InsertionSort(&strings, s);
}
    return 0;
}

void InsertionSort(struct DoubleLinkedList *sorted, char *randomstring)
{
struct Node new;
strcpy(new.value,randomstring);
printf("Newvalue %s\n", new.value);
if ((*sorted).size == 0)
{
    new.next = NULL;
    new.prev = NULL;
    (*sorted).head = &(new);
    (*sorted).tail = &(new);
}
else
{
    printf("TEST %s\n", (*(*sorted).head).value);
    struct Node *current;
    current = (*sorted).head;
    printf("CURRENT %s\n", (*current).value);
    while (strcmp(randomstring,(*current).value) > 0)
    {
        current = (*current).next;
        if (current = NULL)
        {
            break;
        }
    }
    new.next = current;
    if (current != NULL)
    {
        new.prev = (*current).prev;
        if ((*current).prev != NULL)
        {
            (*(*current).prev).next = &(new);
        }
        else
        {
            (*sorted).head = &(new);
        }
        (*current).prev = &(new);
    }
    else
    {
        new.prev = (*sorted).tail;
        (*((*sorted).tail)).next = &(new);
        (*sorted).tail = &(new);
    }
}
(*sorted).size++;
struct Node *printing;
printing = (*sorted).head;
int i;
for (i = 0; i < (*sorted).size - 1; i++)
{
    printf("%s -> ", (*printing).value);
    printing = (*printing).next;
}
printf("%s\n",(*printing).value);
}
4

2 に答える 2