2014-10-30 3 views
0

Для этой программы у меня есть три файла данных. Первый имеет список чисел, второй - список чисел с командой add (A) или delete (D). Я должен поместить числа из первого файла в третий файл, а затем обновить окончательный файл на основе команд и чисел во втором файле. Третий файл не имеет дубликатов и должен быть отсортирован, пока значения вставлены. Вот функции, которые у меня есть, мне трудно получить элементы, хранящиеся в массиве без дубликатов. Массив должен быть статически, я сделал #define max size 2000, которого более чем достаточно для обработки нужных мне чисел. Спасибо! Если я должен загрузить главную, дайте мне знать, но я уверен, что проблема заключается в одной из этих функций.Вставка значения в отсортированный массив без дубликатов: C++

int search(int value, int list[], int n)  // returns index, n is logical size of array 
{ 
    int index = -1; 
    for(int i = 0; i < n; i++) 
    { 
     if(value == list[i]) 
     { 
      index = i; 
      return index; 
     } 
} 

return index; 
} 

void storeValue(int value, int list[], int& n) 
{ 
    int i = n; 
    for(; i > 0 && list[i - 1] < value; i--) 
    { 
     list[i] = list[i - 1]; 
    } 
    list[i] = value; 
    n++; 
} 

void deleteValue(int loc, int list[], int n) 
{ 
    if(loc >= 0 && loc < n) 
    { 
     for(int i = loc; i < n - 1; i++) 
      list[i] = list[i +1]; 
     n--; 
    } 
} 

UPDATE: теперь дубликаты хранятся, но только для некоторых номеров. Например: мой третий файл: 1,2,8,8,9,101,101,104 и т. Д. Выход должен быть: 1,2,8,9,101,104 и т. Д. значение: значение должно быть вставлено list []: массив изменяется (должен быть статическим) n: логический размер массива Я не могу понять, почему некоторые номера дублируются, а другие не являются В основном я запускаю функцию поиска, и если возвращается -1 (значение еще не найдено), я запускаю функцию storeValue.

Вот мои обновленные функции:

int search(int value, int list[], int n)  // returns index 
{ 
    int index = -1; 
    for(int i = 0; i < n; i++) 
    { 
     if(value == list[i]) 
     { 
      index = i; 
      return index; 
     } 
    } 

    return index; 
}  

void storeValue(int value, int list[], int& n) 
{ 
    int i = n; 
    for(; i > 0 && list[i - 1] > value; i--) 
    { 
     list[i] = list[i - 1]; 
    } 
    list[i] = value; 
    n++; 
} 

void deleteValue(int loc, int list[], int& n) 
{ 
    if(loc >= 0 && loc < n) 
    { 
     for(int i = loc; i < n; i++) 
     { 
      if (i == loc) 
      { 
       list[i] = list[i + 1]; 
       i++; 
      } 
     } 
     n--; 
    } 

} 
+1

Вам нужно использовать массив? Существуют и другие структуры, которые обрабатывают уникальные элементы, такие как 'std :: map' и' std :: set'. –

+0

Да, мне нужно использовать массив, размер которого статичен. –

ответ

0

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

char array[3] = [1, 2, 3]; 

и вы хотите, чтобы удалить второе число, ваша функция в настоящее время вывод будет таким:

[1, 3, 3] 

То, что вы хотите сделать, это создать новый массив и перебрать весь список, убедившись, что оставить из последнего элемента следующим образом:

char* deleteValue(int loc, int list[], int n) 
{ 
    char* newArray[n - 1]; 
    if (loc >= 0 && loc < n) 
    { 
     for (int i = 0; i < n - 1; i++) 
     { 
      if (i == loc) // You have arrived at the element that needs to be deleted 
      { 
       newArray[i] = list[i + 1]; 
       i++; // So we skip over the deleted element 
      } 
      else 
       newArray[i] = list[i]; 
     } 
    } 
    return newArray; 
} 

И это должно позаботиться о том случае, когда дублируется последнее значение.

+0

Почему вы использовали тип char для функции? Я в замешательстве. Кроме того, по какой-то причине функция storeValue сохраняет все в обратном порядке, но я не могу понять, где это происходит. –

+0

У меня проблема с обратным порядком, у меня был перепутан < and >. Теперь похоже, что значения не сохраняются, как должно быть. –