Как удалить повторяющиеся строки из массива строк в c - PullRequest
3 голосов
/ 14 июля 2020

Я пытаюсь создать программу, в которой у меня есть связанный список с разными названиями городов + некоторые другие не относящиеся к делу вещи. Названия городов есть, например. «Сиэтл, Бостон, Нью-Йорк, Сиэтл, Вашингтон, Бостон». Я пытаюсь создать массив, в котором есть только уникальные названия городов. Итак, для данного примера это было бы так: «Сиэтл, Бостон, Нью-Йорк, Вашингтон».

Моя идея состояла в том, чтобы создать необработанный массив строк, который будет просто необработанными данными со всеми дубликатами и затем go через каждый город и сделать все остальные появления "NULL". По какой-то причине это не работает должным образом, я понятия не имею, почему. это мой код:

void city_list(City *head)
{
    City *temp = head;

    char** names_raw;
    char** names_new;
    int num_names = 100;
    int curr_pos = 0;

    names_raw = malloc(num_names * sizeof(char*));

    for(int i = 0; i < num_names; i++)
    {
        names_raw[i] = malloc(256 * sizeof(char));
    }

    while(temp != NULL)
    {
       
        strcpy(names_raw[curr_pos++], temp->name);

        temp = temp->next;
    }

    names_new = malloc(num_names * sizeof(char*));

    for(int i = 0; i < num_names; i++)
    {
        names_new[i] = malloc(256 * sizeof(char));
    }

    for(int i = 0; i < curr_pos; i++)
    {
        if(strcmp(names_raw[i], "NULL"))
        {
            for(int j = i+1; j < curr_pos; j++)
            {
                if(!strcmp(names_raw[j], names_new[i]))
                {
                    strcpy(names_raw[j], "NULL");
                }
            } 

            strcpy(names_new[i], names_raw[i]);
        }
    }

    for(int i = 0; i < curr_pos; i++)
    {
        printf("%s\n", names_new[i]);
    }

    free(names_raw);
    free(names_new);
}

Когда я отлаживаю код, я не получаю никаких ошибок, но он выводит все города, как будто ничего не было сделано с массивом.

1 Ответ

1 голос
/ 14 июля 2020

Вы не показали нам полный пример (Что такое «Город»? Как построен ваш входной массив? Et c et c). Но я подозреваю, что вы усложняете ситуацию: (

ПРЕДЛОЖЕНИЕ:

  1. Передайте свой массив в функцию с именем int delete_dupes(char* arr[], int n) (или аналогичную)

  2. Сортировать массив:

    КОД ПРИМЕРА: https://www.geeksforgeeks.org/c-program-sort-array-names-strings/

  3. «Удалить» дубликаты перемещением их в начало вашего массива

    int delete_dupes(char* arr[], int n) {
      char *current_name = arr[0];
      int i=1, j=1;
      while (i < n) {
        if (strcmp(arr[i], current_name) != 0) {
          free(arr[j]);  /* Do *NOT* do this if you didn't malloc() this string!!!! */
          arr[j++] = arr[i];
          current_name = array[i];
        }
      }
      return j;
    }
    
  4. Функция возвращает новые строки # /. Это число будет <= n. </p>

    Кроме того, вы можете захотеть обнулить неиспользуемые элементы массива и / или освободить повторяющиеся строковые значения.

  5. «Идеальным» решением было бы реализовать список динамических c.

  6. Если вы хотите использовать "mallo c ()" для каждой строки отдельно, обратите внимание на стандартную C библиотечную функцию strdup () .

А нет, не тестировал :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...