надеюсь, что мой вопрос будет читабельным.Как проверить, указывает ли указатель на массив структуры в 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));
спасибо за ваш ответ. У меня возникли вопросы о указателе. Означает ли это, что когда указатель указывает на адрес (например, * p), я могу выполнить 'if (* p == NULL)', чтобы проверить его? А в моем коде 'h-> H [0] .key' указывает на поплавок или указывает на адрес? –
@LeaneLi Вы должны проверить 'p == NULL', потому что' * p' будет иметь значение на этом адресе, поэтому вы не хотите проверять NULL на значение, правильно? Вы проверите его против адреса. –