2015-04-22 2 views
2

надеюсь, что мой вопрос будет читабельным.Как проверить, указывает ли указатель на массив структуры в c?

так что я делаю это вставить элемент с уникальным dataIndex в массив, но перед его вставкой мне нужно проверить, уже ли используется dataIndex.

Эти две структуры, которые я использовал:

typedef struct item { 
    float key; // the key for deciding position in heap 
    unsigned int dataIndex; // a unique id for each item 
} HeapItem; 

typedef struct heap { 
    HeapItem *H; // the underlying array 
    unsigned int *map; //map[i] is the location of item with dataIndex==i 
    unsigned int n; // the number of items currently in the heap 
    unsigned int size; // the maximum number of items allowed in the heap 
} Heap; 

Что я сделал, чтобы проверить dataIndex это:

for (unsigned int i = 0; i < h->n; i++) { 
     if (h->H[i].dataIndex == dataIndex) { 
      return HEAP_FAIL; 
     } 
} 

но цикл будет принимать O (п) раз каждый раз, когда я вставьте что-нибудь, так что я хочу сделать так:

if (h->map[dataIndex] != NULL) { 
    return HEAP_FAIL; 
} 

но этот код не работает.

Так что мой вопрос в том, как проверить, нет ли h->H[h->map[dataIndex]]?

и после путь выделяю H и карта:

h->H = (HeapItem *)malloc(sizeof(HeapItem)); 
h->map = (unsigned int *)malloc(sizeof(unsigned int)); 

ответ

0
if (h->map[dataIndex] != NULL) { 
    return HEAP_FAIL; 
} 

Он не будет работать, потому что h->map[dataIndex] содержит значение, а не адрес, выше if будет проверять против значения 0. Даже если вы не инициализируете, в любом месте будет некоторая стоимость мусора.

Итак, лучший способ - инициализировать с некоторым значением, например -1, бесконечность или все, что вы думаете, что не будет в вашем фактическом диапазоне значений.

+0

спасибо за ваш ответ. У меня возникли вопросы о указателе. Означает ли это, что когда указатель указывает на адрес (например, * p), я могу выполнить 'if (* p == NULL)', чтобы проверить его? А в моем коде 'h-> H [0] .key' указывает на поплавок или указывает на адрес? –

+0

@LeaneLi Вы должны проверить 'p == NULL', потому что' * p' будет иметь значение на этом адресе, поэтому вы не хотите проверять NULL на значение, правильно? Вы проверите его против адреса. –

Смежные вопросы