2017-03-08 171 views
-4

在java中我不能一個節點添加到當我訪問空例如差異在C和Java之間鏈表

void add(int val,node k){ 
    while(k!=null) 
    k=k.right; 
    k=new node(val,null); 
} 

凡在C

void add(ll* ll1,int val){ 
    node* neu=(node*)malloc(sizeof(node)); 
    neu->val=val; 
    neu->right=NULL; 
    if(ll1->head==NULL){ 
     ll1->head=neu; 
     return; 
    } 
    node** curr=&(ll1->head); 
    while(*curr){ 
     curr=&((*curr)->right); 
    } 

    (*curr)=neu; 
} 

我可以添加一個鏈接列表當我訪問NULL時節點。有人可以解釋我的區別嗎?爲什麼它會這樣工作?

對不起,如果我的問題是嚴重的解釋。(你可以問的意見,更好地瞭解)

+0

因爲Java試圖成爲一種「安全」的語言,而C並不假裝成一種語言。因此,C在涉及某些應用程序時更加強大。 – StoryTeller

+0

在您的C代碼示例中沒有「訪問NULL」 - 它的工作方式與Java相同,只需在列表末尾添加節點即可。 –

+0

你的C代碼實際上工作嗎?我認爲它會像在Java中一樣工作。 – anacron

回答

0

在C,你必須在內存中一個定義良好的位置,在那裏你會遇到這樣的空。然後,用新節點替換該空值。

在Java中,您試圖將一個新節點置於無處不在的位置。這個null與任何東西都沒有關係。當然,你知道它來自k.right,但你在k = new那一點你只有空值,而不是它的地址。與C不同。因此,沒有辦法在任何地方放置新節點,並且出現錯誤。

正如你想象一下自己,只需使用k.right!=null檢查。這基本上就是C代碼所做的,只是隱藏在另一層指針之後。

+0

java版本是否還沒有任何方法傳回第一個節點,如果它被創建? –

+0

@ChrisTurner你的意思是,如果你傳遞的這個節點沒有初始化,你可以創建並返回它嗎? 使用寫入的函數,nope - 如果你給這個函數node = null,它不可能創建並返回。 但是,例如,如果您將它傳遞給「linkedListStart」,它是一個包含節點(可能爲null)的結構,那麼您可以將第一個節點放入列表中。 C代碼實際上在做什麼 - 有一個ll1,其頭部=第一個節點。如果第一個節點爲空,則將新創建的節點放在那裏。如果ll1本身爲空,則會崩潰。 –