2013-12-16 65 views
0
void push(stack *head, int valuee) 
{ 
    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; 
     head = temp; 
     printf("Element %d inserted\n",valuee); 
    } 
} 

第一個元素插入正確,但是當我繼續插入元素時,沒有任何元素在第一個元素之後插入。 閱讀某處我必須將指針傳遞給堆棧指針的地方,但我在postfix中綴問題期間做了同樣的事情,並且在那裏工作。 幫我解決這個問題。 非常感謝提前任何幫助綴後綴的不插入新值的堆棧推 - C

先前的例子正在工作fiine

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; 
    } 
} 
+0

您不能每次都指向新節點。如果你想推你需要更新鏈接。 new_node-> what_head_is_pointing_to_now,然後head-> new_node,現在你有內存泄漏。如果這真的是應該是malloc的C代碼,或者你應該更新你的標籤 – Mike

+0

@Mike by - > you mean =,那麼'new'是一個C++關鍵詞。對? 但我做了這樣做temp-> next = head;和 head = temp; – Mcolorz

+0

@Mike thnx。我更新了新的malloc和它的工作。但是這是怎麼發生的?我的意思是我正在編寫代碼塊並將文件另存爲.cpp,那麼爲什麼使用新命令給出錯誤的答案? – Mcolorz

回答

1

爲什麼u需要指針的指針?

你想修改一個指針的內容,所以如果你只傳遞一個指向函數的指針,它就是通過複製傳遞的,所以你不能修改它。

對於中綴前綴的情況,您必須沒有修改您只會讀取的字符串,因此不需要指向指針的指針。

+0

o我當時在做同樣的事情,也就是插入char而不是int。 我已經編輯了我以前的中綴版本的問題也 – Mcolorz

1

對於在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。函數中的局部變量headmain函數中的我們的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,它在做什麼本質上是:

  1. 如果node->next == NULL,所以node沒有繼任者,然後將其具有值的新分配節點的後繼者c

  2. 否則,node->next != NULLnode有一些後繼者。然後我們將新分配的節點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 = somethingx.next = something會改變這些字段。

現在,讓我們來看看這個:

stack *y = malloc(sizeof(struct stack)); 

我們知道y店地址到實際struct stack(實際struct stack*y)。所以y->value = somethingy->next = something會突變這些字段。

所以希望你能明白爲什麼node->value任務工作。本質上node包含一個地址到一個實際的struct stack,其值是*node。通過指針語法,node->valuenode->next賦值將更改node的內容。

我不是很好的解釋。但只需編寫更多的代碼。當我第一次與C開始時,指針混淆了我的地獄。我認爲,現在我仍然可能被2層或3層間接困惑,並且我遇到了一些非常討厭的指針錯誤。只是練習更多......有一天你會真的明白。我知道這是他們所說的,但這是事實。

+0

雖然庫爾給出了一個更簡單的答案,但這一個清除了我的概念。非常感謝您詳細回答。 但我仍然懷疑,這件事情以前是如何爲我工作的。還有我在做我一樣的,使用malloc而不是新的,但它在那裏工作 – Mcolorz

+0

我已經編輯了與我以前版本的中綴後綴的問題也。 – Mcolorz

+0

我會在我的答案下面添加一段,向你解釋你新添加的代碼 – yanhan

3

您可以更改功能這樣

stack* push(stack *head, int valuee) 
    //return void to stack * 
    return head; 
    //In the end return the new head 

,它會工作。 這樣的電話推送

head = push(head,value); 
+0

不錯,這是比我的答案更簡單...哈哈 – yanhan

+0

thanx kunal,但這件事情是如何工作以前對我來說。還有我在做同樣的事情,使用malloc而不是新的,但它在那裏工作 – Mcolorz

+0

我已經編輯了我以前版本的中綴後綴的問題。 – Mcolorz