这段代码给出了head-> next = NULL虽然它不应该

时间:2017-06-09 16:30:05

标签: c linked-list stack

#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;

}

上面的代码打印head-&gt; next = NULL虽然它不应该因为当调用push时temp-&gt; next = head然后head = temp所以现在head-&gt; next应该等于之前的头的位置。

1 个答案:

答案 0 :(得分:1)

在你的push()函数中看到你想要更改列表的头部,但实际上你是按值传递它,这样它就不会受到影响。

node * head 表示您有一个指向NODE的指针,并且您实际上只能修改该NODE的属性,而不是头指针本身。

你应该使用 node ** head 这是一个指向指针的指针,这意味着它可以实际修改头指针。

enter image description here enter image description here

这是一个非常简短的解释...请尝试阅读有关C和Pass-By-Reference中的Pass-By-Value的更多信息。

在此修改之后,您还必须将头指针的地址作为参数(&amp; head)传递,并将其更改为* head(在您的函数中)

以下是代码:

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;

}