2015-06-21 116 views
2

一个结构,这可能是一个非常简单的解决方案的一个问题,但我不能让我的头周围...我尝试使用结构,实现了学校proyect链表,但是当我初始化的第一个节点的malloc似乎让所有初始化指针使用malloc

没有影响,这里是我到目前为止的代码:

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

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

void init_List(Node *head, int data) 
{ 
    head = (Node*)malloc(sizeof(Node)); 
    if(head == NULL) 
    { 
     printf("Memory Allocation Error"); 
     return; 
    } 
    head->data = data; 
    head->next = NULL; 
} 

int main() 
{ 
    Node *head = NULL; 
    int N; 
    printf("N: "); 
    scanf("%d", &N); 
    init_List(head, N); 
    printf("%d", head->data); 
} 

任何数字我看了让我的节点打印为CERO的第一个数据。不知道会发生什么。 感谢您的帮助!

+0

您使用什么语言? 'C'还是'C++'? – Galik

+2

这是一个C问题,所以我删除了C++标记。 C++的答案是“不要使用malloc” – kfsone

+0

标准警告:不要使用'malloc()'返回的'void *'!旁注:这与C++不同。 – Olaf

回答

2

当您将head传递给函数init_List时,将创建本地副本head,然后将内存分配给此本地指针。在main,head仍然指向NULL

你需要使用指针的函数参数指针。

void init_List(Node **head, int data) 
{ 
    *head = malloc(sizeof(Node)); 
    if(*head == NULL) 
    { 
     printf("Memory Allocation Error"); 
     return; 
    } 
    (*head)->data = data; 
    (*head)->next = NULL; 
} 

你的函数调用应该像

init_List(&head, N); 

还要注意的是,不投的malloc返回值。

+1

'*头戴式> data' - >>'(*头) - > data' – wildplasser

+0

@wildplasser;哎呀!现在编辑。 – haccks

0

事实上,你已经初始化列表中陈述

Node *head = NULL; 

所以,你需要的是一个将在列表前面推整数的函数。该功能可以看看下面的方式

void push_front(Node **head, int data) 
{ 
    Node *tmp = malloc(sizeof(Node)); 

    if (tmp != NULL) 
    { 
     tmp->data = data; 
     tmp->next = *head; 
     *head = tmp; 
    } 
    else 
    { 
     printf("Memory Allocation Error"); 
    } 
} 

而且函数调用方式如下

push_front(&head, n); 

考虑到这是一个坏主意来命名一个大写字母变量。

至于你的问题,那么函数参数的局部变量。所以任何一个局部变量的改变都不会影响原始参数。函数处理它们参数的副本。

所以在功能

void init_List(Node *head, int data) 
{ 
    head = (Node*)malloc(sizeof(Node)); 
    //... 

有改变局部变量head。尽管它与用于调用函数的参数名称相同,但本地变量的任何更改都不会影响参数。原始的参数不会改变。您必须将参数声明为指针Node **head的指针。