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

0

呃,你也没有为 new 分配内存,所以当你退出 InsertionSort 时,Node 是悬空的。

应该在 InsertionSort

new = (struct Node *)malloc(sizeof(struct Node));

然后调整所有内容以使用指针(即 new -> stuff 而不是 new.stuff 和 new 而不是 &new)。

也在 main strings.size 中未初始化

strings.size = 0;

似乎不见了。

最后一个,当你写的时候

if (current = NULL)

我想你的意思是

if (current == NULL)

(在某些 C 传统中,你会写 if (!current))

通过这些修改,它似乎起作用了。

于 2013-09-28T21:37:52.700 回答
0

您还没有为 strcpy(new.value,randomstring); 中的值分配内存。你很幸运你随后的 printf 作品。

你可以做例如

new.value = strdup(randomstring);

(如果这样做,请不要忘记在删除节点时使用 free(new.value) 释放内存,因为 strdup 调用 malloc)。

于 2013-09-28T21:25:44.290 回答