为什么我无法初始化链表?

问题描述 投票:0回答:1

我试图创建一个链表,但头指针始终指向空,因此在获取链表的大小和元素后没有输出。另外,当我将 head 作为 Main 函数内部的指针时,当我尝试调用推送和显示函数时,它会给我分段错误。

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node * next;
}node;


void push(node *head,int value){
    node * newnode= (node*)malloc(sizeof(node));
    newnode->data = value;
    newnode->next = NULL;
    printf("%d",value);
    if(head==NULL){
        head = newnode;
        return;

    }
    node* iter = head;
    while(iter->next!=NULL){
        iter = iter->next;
    }
    iter->next = newnode;
}

void display(node *head){
    node *iter = head;
    while(iter!=NULL){
        printf("%d->",iter->data);
        iter = iter->next;
    }
    return;
}

int main(){
    node *head = NULL;
    int size;
    scanf("%d",&size);
    for(int i=0;i<size;i++){
        int value;
        scanf("%d",&value);
        push(head,value);
    }
    display(head);
}
c pointers malloc
1个回答
0
投票

您传入

head
函数的
push()
是一个
node*
,它按值传递给函数
push()
。这意味着您可以修改
node
head
所指向的内容,但不能使
head
指向其他内容(正确地说,您可以,但这种更改仅在该函数调用期间持续,并且不会影响 main 中的原始
head

因此您需要将指针传递给

node*
。你的函数将如下所示:

void push(node** head, int value) {
    node* newnode = (node*)malloc(sizeof(node));
    newnode->data = value;
    newnode->next = NULL;
    printf("%d", value);
    if (*head == NULL) {
        *head = newnode;
        return;

    }
    node* iter = *head;
    while (iter->next != NULL) {
        iter = iter->next;
    }
    iter->next = newnode;
}

你会这样称呼它

push(&head, value);

© www.soinside.com 2019 - 2024. All rights reserved.