I have this piece of code that helps me to sort a linked list whose nodes contain a singular word. From my understanding of insertion sort, I've managed to come up with this which works fine, but there is a part where I've copied from online and need help in understanding it.
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;
}
In the line
prev->next = current;
Why would it also change the value of where my dummy node points to? Wouldn't the 2 nodes be independent of one another? I suspect this is due to how pointers work as this is very new territory for me.
I have tried running through the debugger and saw the changes but I do not understand why/how does this occur.
CodePudding user response:
The pointers are pointing to the exact same object, not copies of the object. You can confirm this by looking at the contents of the prev
and dummy
variables - they will have the same value. When performing the assignment, it's changing the single object that both of the variables are pointing to.
CodePudding user response:
dummy
is a pointer to a node - it's not a node. prev
is a pointer to a node - it's not a node.
The nodes are created by malloc
and they don't have names. That's why it's important to keep track of which pointers are pointing to what.
If you do:
Node* dummy = malloc(sizeof(Node));
Node* prev = dummy;
prev->word = "hello";
then the node's word
is "hello"
, and both prev
and dummy
point to the node, so dummy->word
is also "hello"
. prev->word
and dummy->word
are the exact same variable.
If this is still too confusing because the node doesn't have a name, you may think about pointers to variables which have names:
int i;
int* p = &i;
int* q = &i;
both *p
and *q
and i
are the same variable. p
isn't q
, but *p
is i
and *p
is also i
, so *p
is *q
.
If you do *p = 42;
then *q
is also 42 because both of them are i
.