将值插入排序数组中而不重复:C++

Inserting value into sorted array without duplicates: C++

本文关键字:C++ 插入排序 数组      更新时间:2023-10-16

对于这个程序,我有三个数据文件。第一个是数字列表,第二个是带有add(a)或delete(D)命令的数字列表。我必须将第一个文件中的数字放入第三个文件,然后根据第二个文件中命令和数字更新最终文件。第三个文件不能重复,必须在插入值时进行排序。以下是我的函数,我很难在没有重复的情况下将项目存储到数组中。数组必须是静态大小的,我做了一个最大大小为2000的#define,这足以处理我需要的数字。非常感谢!如果我应该上传main,请告诉我,但我很确定问题出在其中一个函数上。

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--;
    }
}

更新:现在正在存储重复项,但仅针对某些数字。例如:我的第三个文件是:1,2,8,8,9101101104等。输出应为:1,2,8,9101104等value:要插入的值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--;
   }
}

在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;
}

这应该考虑到最后一个值重复的情况。