所以我的想法是我有一个定义为struct
的双向链表struct Node
{
struct Node *next;
struct Node *prev;
char value[5];
};
struct DoubleLinkedList
{
int size;
struct Node *head;
struct Node *tail;
};
我正在使用InsertionSort函数插入列表。我将指针传递给我的Doubly Linked列表作为参数,并通过在列表中添加一个新的4字符串节点(按字典顺序排序的链接列表)进行修改。然后,我添加每个字符串节点打印链表。
印刷证明是有问题的。现在,使用下面的代码,输出总是类似的(假设在每一步插入的字符串都是aaaa,bbbb,cccc ...)
AAAA
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);
}
答案 0 :(得分:0)
您尚未为该值分配内存 的strcpy(new.value,randomstring); 你很幸运,后来的printf工作正常。
你可以做例如
new.value = strdup(randomstring);
(如果这样做,请不要忘记在删除节点时释放带有free(new.value)的内存,因为strdup调用malloc)。
答案 1 :(得分:0)
呃,你没有为新的内存分配内存,所以当你退出InsertionSort时,节点正在悬空。
应该在InsertionSort中
new = (struct Node *)malloc(sizeof(struct Node));
然后调整所有内容以使用指针(这是新的 - &gt;东西而不是new.stuff和new而不是&amp; new)。
同样在未初始化的主要strings.size中
strings.size = 0;
似乎不见了。
最后一个,当你写
if (current = NULL)
我认为你的意思是
if (current == NULL)
(在某些C传统中,你会写if(!current))
通过这些修改,似乎可行。