2015-06-21 62 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的指針。