删除数组中的重复项并将其替换为未使用的值

时间:2017-09-20 21:42:41

标签: c arrays

我对这个程序的目标是让用户确定数组的大小,并为他们选择的任何大小动态分配内存。一旦用户定义了数组的大小,不超过数组大小的随机数就会被放入所有分配的位置。我遇到问题的地方是从数组中删除重复项并将其替换为未使用的值,
例如:

Please enter the size of the array:

User Input: 5 

Output of code: 5, 3, 3, 1, 2

我需要它是这样的:

Please enter the size of the array:

User Input: 3

Output of program: 3, 1, 2

目前正在阅读K.N.的“C编程 - 现代方法”。国王(第二版)。

如果有人能指出我如何处理这个问题,那将非常感激。到目前为止,这是我的代码。

#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0

typedef int bool;


int main() {

int *UserData;
int TempPost;
int replace;
int UserInput;
int i;
int result;
bool digit_seen[UserInput];
int digit;
srand ((unsigned) time(NULL));

printf("Please enter the size of the array using a whole number: \n");
scanf("%d", &UserInput);


UserData = malloc(sizeof(int) * (UserInput ) +1);


 for(i=0; i < UserInput; i ++) {

    result = (( rand() % UserInput) + 1);

 }

    // check for duplicate values while putting values in array

    while(UserInput>0){

        digit = UserInput % UserInput;
          if(digit_seen[digit])
              break;

          digit_seen[digit] = true;
          UserInput /= UserInput;

          if(UserInput > 0)
              printf("Repeated digit \n");
          else
              printf("No repeated digit \n");


    }

  // Sorting the array using a Bubble sort

        while(1){

            replace = 0;


            for (i=0; i<(UserInput - 1); i++){


                if(UserData[i]>UserData[i+1]){

                    TempPost = UserData[i];
                    UserData[i] = UserData[i+1];
                    UserData[i+1] = TempPost;

                    replace = 1;


                }


            }


          if(replace==0){

              break;
          } 



        }

    printf("%d \n", result);



 return 0;
}

2 个答案:

答案 0 :(得分:0)

这不是最有效的方式,但您可以在生成随机数时执行此操作。当您选择一个随机数时,请浏览该数组的所有先前元素,看看它是否已被使用。保持循环,直到你选择一个未使用的号码。

for (i = 0; i < UserInput; i++) {
    do {
        result = ( rand() % UserInput) + 1;
    } while (in_array(result, UserData, i-1));
    UserData[i] = result;
}


int in_array(int val, int* array, int array_size) {
    for (int i = 0; i < array_size; i++) {
        if (array[i] == val) {
            return 1;
        }
    }
    return 0;
}

更有效的方法是将数组初始化为0。然后,不是选择随机数,而是选择一个随机索引来填写,然后重复此操作,直到您选择包含0的索引。

UserData = calloc(UserInput, sizeof(int));
for (i = 1; i <= UserInput; i++) {
    int index;
    do {
        index = rand() % UserInput;
    } while (UserData[index] != 0)
    UserData[index] = i;
}

答案 1 :(得分:0)

你可以做的是改变阵列。只需使用简单的for循环按顺序填充数组中的所有数字,然后使用以下内容对其进行洗牌:

//read user input
//create array and fill with all the numbers in order
//[0,1,2,3,4,5 .. ... ]
int index, temp;

// size is the size of the array
for(int i = 0; i < size; i++)
{
    index = rand()%size;//random place to pick from
    temp = array[i];
    array[i] = array[index];
    array[index] = temp;
}

与现有方法相比,这更有效 - 并且更不容易出错。