2017-09-23 109 views
0

在創建鏈表時,我們創建一個節點結構,它由數據和指向下一個節點的指針組成。後來,當我們做一個函數將元素添加到鏈表時,我們創建一個臨時節點來存儲輸入的數據。鏈接列表節點內存分配

讓我們看看下面的程序 -

#include<stdio.h> 
struct node 
{ 
    int data; 
    struct node* link; 
} 
struct node* root=NULL; 
void main(append) 
{ 
    struct node* temp; 
    temp= (struct node*)malloc(sizeof(struct node)) 
    ..... 
} 

我的第一個問題集:

在第11行,我們爲什麼還要提(struct node*) malloc函數之前?

那是什麼意思?

我的第二個問題集:

如果我們做一個雙向鏈表這將有一個節點結構,其中包括2個三分球(對下一個和前一個節點),將我們還初始化一個指針(用於遍歷結構節點類型的列表)?

在這種情況下是否有不同的方式來初始化指針?

+6

誰告訴你,你需要的是什麼?它甚至非常沮喪。一般來說,絕對不要使用不必要的演員,他們終有一天會落在你的頭上。如果你從你的C書中得到了這些,可以找一個更好的。如果來自一些模糊的YouTube視頻,博客或在線教程:獲取一本好的C書。 – Olaf

+1

請注意,如果您使用C++編譯器編譯C代碼,那麼該投射將是必要的。在C語言中沒有必要僅由C編譯器編譯。另請注意[我是否將'malloc()'的結果轉換爲?](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

+1

而不是'temp = malloc( sizeof * temp);'簡單 - 不是嗎? – chux

回答

-1

這是因爲malloc的返回類型是void *。 (struct node *)是一個強制類型,使用它可以告訴編譯器,您想將malloc返回的值作爲指向struct節點的指針。

對於雙鏈表就可以使用,

struct node 
     { 
     int data; 
     struct node *next,*prev; 
     }; 

int main() 
{ 
    struct node *new_node=(struct node *)malloc(sizeof(node)); 
} 
1

的意義就是讓蟲子在你的程序中,

malloc的返回void*,當你分配給你的struct somthing*將程序自動轉換。

+0

該轉換至少使程序與C++編譯器兼容。 – synchronizer

+0

但問題是關於c代碼,而不是關於需要與每種語言兼容的c代碼 – Bizzu

+0

但問題是我們爲什麼要在malloc函數中指出類型的指針,因爲我們已經聲明它爲類型' struct node *'? –

0

爲什麼我們需要在malloc函數前提及'(struct node *)', 那有什麼意義呢?

通過malloc函數之前寫(struct node*),你的類型轉換返回值指定的類型。這裏演員是可選的,並且often frowned upon

,如果我們正在一個雙向鏈表這將有一個節點 結構,其中包括2個三分球(...

當進行雙向鏈表,你應該聲明是這樣的:

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

您可以通過使用malloc功能的節點分配空間,nextprevious指針指針再次向struct node秒。召喚malloc再次爲next元素分配空間。對於第一個節點,previous應該是NULL,對於最後一個節點,next應該是NULLHere是一個實現。

+0

正常情況下,'append'函數會在'next'中分配一個新節點,並讓新節點指向當前(最後一個)節點的'prev'節點。沒有存儲將被分配給'prev'。 –

+0

@PaulOgilvie啊對了。也許我在寫這些時沒注意。編輯。 – babon

+0

但問題是我們爲什麼在我們已經將它聲明爲類型'struct node *'時指出malloc函數中的指針的類型? –

-1

malloc返回void指針(可以在頭文件中檢查和驗證),因此類型轉換是必要的,同時將其分配給其他類型的變量。

請求你在鏈路https://www.tutorialspoint.com/cprogramming/c_type_casting.htm

+0

對不起,你錯了。你的參考是關於整數促銷和數值類型的轉換,而不是關於指針。 @ 0decimal0的回答是正確的。看到參考。 –

+0

我在說malloc的返回類型不是struct node *類型,因此它應該被structpec節點的指針類型typecasted –

+0

「'malloc' _will return_'void *'_當你賦值給你的struct類時*'_it會轉換automaticlly._「(見其他答案。) –

1

讀你只是因爲它返回void*不投的malloc結果。還有就是一個很好的解釋here

一個更好的解決方案可能是:

struct node *temp; 
temp = malloc(sizeof *temp); 
+0

但問題是爲什麼我們意味着malloc函數中的指針的類型,當我們已經將其聲明爲類型'struct node *'? –

+0

答案還是一樣,它的壞習慣。不需要投射malloc的結果。編寫代碼的人認爲需要那些根本不合邏輯的演員。 – 0decimal0