我有一段代码可以帮助我对一个链表进行排序,这个链表的节点包含一个单数单词。根据我对插入排序的理解,我已经设法想出了这个代码,它工作得很好,但是有一部分我是从网上复制的,需要帮助来理解它。
Node* insertion_sort(Node* head) {
Node* dummy;
dummy= malloc(sizeof(Node));
if (dummy == NULL) {
printf("Memory allocation error");
}
dummy->next = head;
Node* last_sorted = head;
Node* current = head->next;
while (current != NULL) {
if(strcmp(last_sorted, current) <= 0) {
last_sorted = current;
}
else {
Node* prev = dummy;
while (strcmp(prev->next->word, current) < 0) {
prev = prev->next;
}
last_sorted->next = current->next;
current->next = prev->next;
prev->next = current;
}
current = last_sorted->next;
}
return dummy->next;
}
行中
prev->next = current;
为什么它也会改变我的虚拟节点指向的值?这两个节点不是彼此独立的吗?我怀疑这是由于指针的工作方式,因为这对我来说是一个非常新的领域。
我已经尝试通过调试器运行并看到了更改,但我不明白为什么/如何发生这种情况。
2条答案
按热度按时间8ljdwjyq1#
dummy
是指向节点的指针--它不是节点。这些节点是由
malloc
创建的,它们没有名字,这就是为什么跟踪哪些指针指向什么是很重要的。如果您这样做:
则节点的
word
是"hello"
,并且prev
和dummy
都指向该节点,因此dummy->word
也是"hello"
。prev->word
和dummy->word
是完全相同的变量。如果因为节点没有名字而仍然让人感到困惑,你可以考虑指向有名字的变量的指针:
*p
和*q
以及i
是相同的变量。p
不是q
,但是*p
是i
,并且*p
也是i
,所以*p
是*q
。如果你计算
*p = 42;
,那么*q
也是42,因为它们都是i
。ifsvaxew2#
指针指向完全相同的对象,而不是对象的副本。您可以通过查看
prev
和dummy
变量的内容来确认这一点-它们将具有相同的值。在执行赋值时,它将更改两个变量所指向的单个对象。