我有這段代碼可以幫助我對其節點包含單數單詞的鏈表進行排序。根據我對插入排序的理解,我設法想出了這個作業正常的方法,但是有一部分是我從網上復制的,需要幫助來理解它。
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個節點不是相互獨立嗎?我懷疑這是由于指標的作業方式,因為這對我來說是一個非常新的領域。
我嘗試通過除錯器運行并看到更改,但我不明白為什么/如何發生這種情況。
uj5u.com熱心網友回復:
dummy是指向節點的指標 - 它不是節點。prev是指向節點的指標 - 它不是節點。
節點是由創建的malloc,它們沒有名稱。這就是為什么跟蹤哪些指標指向什么很重要的原因。
如果你這樣做:
Node* dummy = malloc(sizeof(Node));
Node* prev = dummy;
prev->word = "hello";
那么節點的word是"hello",并且 和 都prev指向dummy該節點,所以dummy->word也是"hello"。prev->word并且dummy->word是完全相同的變數。
如果這仍然太混亂,因為節點沒有名稱,您可能會考慮指向具有名稱的變數的指標:
int i;
int* p = &i;
int* q = &i;
和*p和都是*q同i一個變數。pis not q, but *pisi和*pis also i, so *pis *q.
如果你這樣做,*p = 42;那么*q也是 42,因為它們都是i.
uj5u.com熱心網友回復:
指標指向完全??相同的物件,而不是物件的副本。您可以通過查看prev和dummy變數的內容來確認這一點——它們將具有相同的值。執行賦值時,它正在更改兩個變數指向的單個物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532309.html
標籤:C指针链表
