2017-06-09 1 views
0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

// linked-list implementation of stack 

typedef struct stack node; 

struct stack{ 

    int value; 
    node* next;  

}; 

void push(node*,int); 
void pop(node*); 



int main(){ 

node* head=malloc(sizeof(node)); 
head->next = NULL; 
push(head,5); 
if (head->next == NULL){ 
printf("head->next is NULL."); 
} 
pop(head); 

} 


void push(node* head,int value){ 

    head->value = value; 
    node* temp = malloc(sizeof(node)); 
    temp->next = head; 
    head = temp; 

} 

上記コードプリントヘッド - >次= NULLが、それべきではないので、プッシュ次いでtemp->次=頭部、次いでヘッド= TEMP呼び出されたときだから、head-> nextは前の頭の位置と同じになるはずです。このコードは頭部>次= NULL与えるが、それべきではない

+2

あなたは頭部> next' '更新したことがありません。 'head = temp;'はローカルコピーを変更しています。あなたの最後の段落で –

+0

論理は間違っている - 'temp->次= head'その後、'ヘッド= temp' '頭部>次の==のhead'そう。 –

+1

あなたは値渡しという概念を理解していますか? –

答えて

1

では、あなたのプッシュ()関数では、リストの先頭を変更することがわかりますが、それは影響されませんので、実際には値によるそれを渡しています。

ノード*ヘッドは、ノードへのポインタがあり、実際にはそのヘッドポインタ自体ではなく、そのノードのプロパティのみを実際に変更できることを意味します。

ノード**ヘッドはポインタへのポインタですので、実際にヘッドポインタを変更できることを意味します。非常に簡単な説明だった

enter image description here enter image description here

... Cと参照渡しで値渡しについての詳細を読みしてみてください。あなたもここに(あなたの関数で)*ヘッドとして

をパラメータ(&ヘッド)として先頭ポインタのアドレスを渡すと、それに変更を加える必要があり、この修正後

はコードです:

void push(node **、int); void pop(node *);

int main(){ 

node* head=malloc(sizeof(node)); 
head->next = NULL; 
push(&head,5); 
if (head->next == NULL){ 
printf("head->next is NULL."); 
} 
//pop(head); 

} 


void push(node** head,int value){ 

    (*head)->value = value; 
    node* temp = malloc(sizeof(node)); 
    temp->next = *head; 
    (*head) = temp; 

} 
関連する問題