#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应该等于之前的头的位置。
答案 0 :(得分:1)
在你的push()函数中看到你想要更改列表的头部,但实际上你是按值传递它,这样它就不会受到影响。
node * head 表示您有一个指向NODE的指针,并且您实际上只能修改该NODE的属性,而不是头指针本身。
你应该使用 node ** head 这是一个指向指针的指针,这意味着它可以实际修改头指针。
这是一个非常简短的解释...请尝试阅读有关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;
}