這樣的想法是我定義爲一個結構鏈表印刷及添加元素
struct Node
{
struct Node *next;
struct Node *prev;
char value[5];
};
struct DoubleLinkedList
{
int size;
struct Node *head;
struct Node *tail;
};
,我插入使用插入排序函數列表中的雙向鏈表。我將指針傳遞給我的雙鏈表作爲參數,並且通過向列表中添加新的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);
}
爲什麼不寫'sorted-> size'而不是'(* sorted).size'?我的意思是,這是更常見的。並且不要命名變量'new'。 – pzaenger
'(*排序)。頭= &(new);' 本地自動變量的地址不能在範圍之外使用。 – BLUEPIXY