2015-11-29 74 views
0

所以我在我的C程序數組我如何知道數組中的元素是否存在?

Node *array; 
array = (Node*)malloc(53*sizeof(Node)); 

if(array[5] is empty) 
//Fill array index with element 

如何測試是否元素有或沒有?我試過如果(數組[5] == NULL),但它不斷給我一個錯誤。

+1

'陣列[5]'是類型Node'的',而不是一個指針'Node'。它不可比較'NULL' – Shloim

+1

'array'是一個指針,而不是一個數組。在'malloc'調用之後的 – Olaf

+4

,有53個節點。有沒有這樣的事情,一個節點「是否存在」。 –

回答

1

我試過if(array[5] == NULL)但它一直給我一個錯誤。

這並不原因有二:

  • malloc不初始化內存返回到程序。你是負責設置內存爲零,而
  • Node不是指針類型,所以你不知道,如果一個Node是否有效不知道的Node本身你可以切換到結構

雙指針Node **array,並分配它是這樣的:

array = (Node**)malloc(53*sizeof(Node*)); 
memset(array, 0, 53*sizeof(Node*)); 

然而,這意味着,你將不得不array作爲一個指針數組,與malloc的個性化的元素等。

如果要Node結構的陣列,使用指示特定元件被使用或不使用標記物的單獨的陣列。

0

你可以初始化一個哨兵值存儲,如零,然後檢查是否array[5]只包含價值。例如: -

#define UNINITIALIZED 0 

Node *array = calloc(53, sizeof(Node)); // don't cast malloc and friends! 
Node null_node; 
memset(&null_node, UNINITIALIZED, sizeof(Node)); 

if(memcmp(&array[5], &null_node, sizeof(Node)) == 0) 
    // … 

只要確保有效Node實例可以永遠等於哨兵值。

這比dasblinkenlight的解決方案更有效,因爲它涉及到一個額外的間接。但是,如果安全哨兵值不能被發現,並添加int uninitialized(或類似)標誌字段Node是不可能的,額外的指針是必要的,除非你存儲哪些元素是其他地方初始化的信息。

+2

雖然這假設一個歸零節點不是一個有效/有用的值,當然......它很可能是。 –

+0

是的。在這種情況下,可能會有其他值用於表示「未初始化」。 – emlai

+0

也許你可以添加一個簡短的提到使用一個sentinel值到你的答案。 –

1

數組中的所有元素都存在。沒有辦法檢查元素是否存在,因爲元素不能存在。

如果你想有一個「不存在的元素」的一些概念,你必須自己做出來。實現這一點的直接方法是在Node中有一個字段,用於存儲節點是否存在。每分配一個Node後,您都會將該字段設置爲false,並且只要您希望該節點「存在」就將其設置爲true。

0

我個人認爲在這種情況下,用C++是更好的,因爲你可以使用默認的構造函數初始化。 在你的情況,如果你想檢查節點是否被初始化,只需做一個calloc然後檢查一些整數變量的值。

struct Node { 
    //set to 1 if not empty 
    char emptyFlag; 
    initialize() { 

     emptyFlag = 1; 

     //other stuff 
    } 
} 

Node *array; 
array = (Node*)calloc(53 , sizeof(Node)); 

if(array[5].emptyFlag == 0) 
//initialize array[5] 
+1

當OP表示他們使用C時推薦C++與推薦他們使用Javascript相同。 –

相關問題