在分配新节点后,根节点(空值)的值没有变化

时间:2015-02-05 17:59:41

标签: c pointers struct linked-list

目前,我正在尝试编写链表,但我遇到了一个问题。 当我执行下面的代码时,它只是打印

  

现状:

所以我使用gdb并发现当我分配“iHead = newNode”并返回main时,head的值没有改变! 这个问题是相对于传递值/引用还是其他任何原因???

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

typedef struct node *nodePtr;
struct node{
    int value;
    nodePtr next;
};

void print(nodePtr);
void insert(nodePtr, int);


int main(void){
    nodePtr head = NULL;

    insert(head, 1);
    insert(head, 2);
    insert(head, 3);
    insert(head, 4);
    insert(head, 5);

    print(head);

    return 0; 
}

void print(nodePtr iHead){
    nodePtr ptr = iHead;

    printf("Current state:");
    while(ptr){
        printf("%d ", ptr->value);
        ptr = ptr->next;
    }
    printf("\n");
}

void insert(nodePtr iHead, int iValue){
    nodePtr newNode;

    newNode = (nodePtr) malloc(sizeof(struct node));
    newNode->value = iValue;
    newNode->next = NULL;

    if(iHead == NULL)
        iHead = newNode;
    else{
        //find the last node
        nodePtr ptr = iHead;
        while(ptr -> next)
            ptr = ptr->next;

        //append new node
        ptr -> next = newNode;
    }
}

1 个答案:

答案 0 :(得分:1)

你正在按值传递。

因此,在函数内完成的更改不会反映在main()中。有两种方法可以解决这个问题。

  1. void insert(nodePtr *iHead, int iValue)
  2. 通过参考此函数

    1. nodePtr insert(nodePtr iHead,int iValue)
    2. 更改功能并返回HEAD

      main()中,您的列表HEAD完好无损

      nodePtr HEAD = insert(HEAD,2);