C: вставка элемента в массив структур - PullRequest
0 голосов
/ 03 октября 2018

У меня есть массив структур, в которых каждый элемент массива имеет вид:

struct Item {
  int code;
  char * label;
};

Сам массив является глобальной переменной:

struct Item * ht[SIZE];

Вот как я сейчас вставляю элемент вмассив:

void insert(int toadd, char *toput) {

   struct Item *item = (struct Item*) malloc(sizeof(struct Item));
   item->label = toput;  
   item->code = toadd;

   int hashIndex = 0; 

   //move in array until an empty or deleted cell
   while(ht[hashIndex] != NULL && ht[hashIndex]->code != -1) {
      //go to next cell
      ++hashIndex;

      //wrap around the table
      hashIndex %= SIZE;
   }

   ht[hashIndex] = item;
}

В другой функции я вызываю метод insert, а затем несколько операторов printf, чтобы проверить, что происходит:

insert(ctr, trimwhitespace(line2));
printf("\nAdding to ht: String: %s Integer: %d\n", trimwhitespace(line2), ctr);

for (int i = 0; i < SIZE; i++) {
    if (ht[i] != NULL)
    printf("\nThis is what's inside ht: String: %s Integer: %d\n", ht[i] -> label, ht[i] -> code);            
}

Это пример вывода:

Добавление к ht: строка: четыре целое число: 6

Это то, что находится внутри ht: строка: четыре целое число: 0

это то, что находится внутри ht: строка: четыре целое число: 4

Это то, что внутри ht: строка: четыре целое число: 5

Это то, что внутри ht: строка: четыре целое число: 6

Как вы можете видеть,структура вставляется несколько раз с разными целочисленными значениями.

Я думаю, что это вряд ли проблема с циклами, в которых находится вызов insert, так как первый оператор печати также будет напечатан несколько раз, если вызов insert был выполнен несколько раз.Но я могу ошибаться.

Как мне убедиться, что метод insert вставляет структуру только один раз, а не несколько раз?Или проблема кроется в другом месте?

1 Ответ

0 голосов
/ 03 октября 2018

Оказывается, что добавление оператора if непосредственно перед моим вызовом метода insert, чтобы проверить, был ли конкретный ключ уже вставлен ранее, решило проблему, хотя это может быть не самое идеальное решение:

if (!containsKey(trimwhitespace(stringcopy3))) {           

      insert(ctr, trimwhitespace(stringcopy3));
      printf("\nAdding to ht: String: %s Integer: %d\n", trimwhitespace(stringcopy3), ctr);

}

Я до сих пор не уверен, почему сразу было вставлено несколько экземпляров ключа, но это временное решение.

...