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

时间:2014-10-30 16:20:24

标签: c++ arrays duplicates insertion-sort

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

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,9,101,101,104等。 输出应为:1,2,8,9,101,104等 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--;
   }

}

1 个答案:

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

这应该照顾最后一个值重复的情况。