對於在if
聲明else
部分這行代碼:
head = temp;
你的意圖是突變head
,換句話說,改變什麼head
指向。但是,指針作爲值傳入,就像其他變量一樣。換句話說,假設我在其他地方調用push
函數。爲簡單起見,假設我把它在main
功能,像這樣:現在
int main()
{
stack *headOfStack = new stack;
// suppose this next push triggers the else portion of the push code
push(headOfStack, 6);
}
,該push(headOfStack, 6);
語句已被執行之後,你的意圖是希望headOfStack
指向其中包含一個新的「棧節點」價值6
。現在,headOfStack
是一個指向棧類型變量的指針。它存儲一個內存地址。你可以把內存地址想象成一些整數。當我們調用push
,我們複製的內容headOfStack
(的headOfStack
內容是一個內存地址)到局部變量push
功能head
。因此,當:執行
head = temp;
,我們正在分配的temp
的內容head
。什麼是temp
?它是指向stack
類型變量的指針。換句話說,temp
的值是一個內存地址。因此head = temp;
只是將temp
中包含的內存地址分配給本地變量head
。函數中的局部變量head
和main
函數中的我們的headOfStack
變量是具有不同存儲器地址的兩個完全不同的變量變量。如果我的解釋到目前爲止已清楚,這意味着當我們在push
函數中修改head
時,main
中的headOfStack
變量完全不變。
你想在這種情況下,做的是:
void push(stack **headPtr, int valuee)
{
// this will get the actual pointer we are interested in
stack *head = *headPtr;
if(head->next==NULL && head->value==-1)
{
head->value = valuee;
printf("First element %d inserted\n",valuee);
}
else
{
stack *temp = new stack;
temp->value = valuee;
temp->next = head;
// mutation is done here
*headPtr = temp;
printf("Element %d inserted\n",valuee);
}
}
及其用法,用我們的虛構main
功能:
int main()
{
stack *headOfStack = new stack;
// notice the use of &headOfStack instead of headOfStack
push(&headOfStack, 6);
}
只要記住,指針存儲內存地址,而指針只是變量,而且它們也有內存地址。要改變一個指針(改變一個指針指向的內容),只需將它的內存地址傳遞給該函數即可。
希望有幫助!
編輯新的編輯問題
void push(char c, stack *node)
{
stack *B = (stack *)malloc(sizeof(stack));
if (node->next == NULL)
{
node->next = B;
B->value = c;
B->next =NULL;
}
else
{
B->next = node->next;
node->next = B;
B->value = c;
}
}
對於此版本的push
,它在做什麼本質上是:
如果node->next == NULL
,所以node
沒有繼任者,然後將其具有值的新分配節點的後繼者c
否則,node->next != NULL
和node
有一些後繼者。然後我們將新分配的節點B
設置爲node
的後繼者,並將node
的原始後繼者設置爲B
的後繼者。或換句話說,它在node
及其後繼者之間拼接新節點B
(值爲c
)。
我發現它非常難以解釋,但一個簡單的解釋是,這push
不會改變node
指向。我們沒有表現出意圖改變node
。我認爲涉及B
的內容應該是可以理解的,所以我們將重點放在node->next
分配上。
我假設stack
是一個結構,看起來是這樣的:
struct stack {
char value;
struct stack *next;
};
現在,假設我們main
功能,我們有一個stack
:
stack x;
注意x
是不是指針。我想我們都同意做x.value = something
和x.next = something
會改變這些字段。
現在,讓我們來看看這個:
stack *y = malloc(sizeof(struct stack));
我們知道y
店地址到實際struct stack
(實際struct stack
在*y
)。所以y->value = something
和y->next = something
會突變這些字段。
所以希望你能明白爲什麼node->value
任務工作。本質上node
包含一個地址到一個實際的struct stack
,其值是*node
。通過指針語法,node->value
和node->next
賦值將更改node
的內容。
我不是很好的解釋。但只需編寫更多的代碼。當我第一次與C開始時,指針混淆了我的地獄。我認爲,現在我仍然可能被2層或3層間接困惑,並且我遇到了一些非常討厭的指針錯誤。只是練習更多......有一天你會真的明白。我知道這是他們所說的,但這是事實。
您不能每次都指向新節點。如果你想推你需要更新鏈接。 new_node-> what_head_is_pointing_to_now,然後head-> new_node,現在你有內存泄漏。如果這真的是應該是malloc的C代碼,或者你應該更新你的標籤 – Mike
@Mike by - > you mean =,那麼'new'是一個C++關鍵詞。對? 但我做了這樣做temp-> next = head;和 head = temp; – Mcolorz
@Mike thnx。我更新了新的malloc和它的工作。但是這是怎麼發生的?我的意思是我正在編寫代碼塊並將文件另存爲.cpp,那麼爲什麼使用新命令給出錯誤的答案? – Mcolorz