Я пытаюсь объединить два отсортированных (int) массива с помощью указателей и по какой-то причине он хранит адреса - PullRequest
1 голос
/ 19 января 2020
void interclas(int *ptr,int *vec, int *c, int n) {
    int i,j,tmp;
    tmp=0;
    for (i=0;i++;i<n)
        for (j=0;i++;j<n)
        {
            if (vec[j]<=ptr[i])
                c[tmp]=vec[j];
            else
                c[tmp]=ptr[i];
            tmp++;
        }
}

int main() {
    int i,n;
    int *ptr,*vec,*c;

    printf("Nr. of elements of initial arrays : 5 \n");
    n=5;
    vec=(int*)malloc( n * sizeof(int));
    ptr=(int*)malloc( n * sizeof(int));

    c=(int*)malloc( 2 * n * sizeof(int));
    for (i=0;i<n;i++) {
        scanf("%d",&ptr[i]);
    }
    for (i=0;i<n;i++) {
        scanf("%d",&vec[i]);
    }

    printf("\n");
    printf("Initial arrays are : ");
    for (i=0;i<n;i++) {
        printf("%d ",ptr[i]);
    }
    printf("\n");
    for (i=0;i<n;i++) {
        printf("%d ",vec[i]);
    }

    interclas(ptr,vec,&c,n);

    printf("Merged array is : ");
    for (i=0;i<10;i++) {
        printf("%d ",c[i]);
    }
    return 0;
}

Поэтому я пытаюсь объединить два отсортированных массива в один новый, используя указатели с функцией 'interclas'. Я попытался использовать тот же метод для сортировки массива с указателем в функции, и он работал просто отлично. Теперь, как вы можете видеть, он хранит адрес переменной, а не саму переменную. Если я запускаю это, он хранит адреса массивов. Как я могу это исправить? (Я все еще новичок в указателях)

1 Ответ

4 голосов
/ 19 января 2020

В теле вашего метода измените:

for (i=0;i++;i<n)
    for (j=0;i++;j<n)

на следующее:

for (i=0; i<n; i++)
    for (j=0; j<n; j++)

, а затем измените вызов вашего метода следующим образом:

interclas(ptr, vec, &c, n);

к этому:

interclas(ptr, vec, c, n);

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


Лог c вашего метода также испорченный, попробуйте поместить несколько printfs (например, printf("here i = %d, j = %d, ptr[i] = %d, vec[j] = %d, tmp = %d\n", i, j, ptr[i], vec[j], tmp);), чтобы увидеть, какие значения имеют ваши переменные на его итерации - вы получите только первые два элемента первого массива для объединения!

Если вы думаете об этом что вы хотите сделать, это go через первый элемент массива ptr и vec и сохранить минимум этих двух. Если бы теперь этот min имел массив ptr, вы бы хотели, чтобы следующий элемент ptr был принят во внимание, в противном случае следующий элемент vec.

Возьмите карандаш и бумагу и Сделайте набросок этого алгоритма - вы увидите, что он хорошо работает, но некоторые оставшиеся элементы могут остаться и не вставляться в выходной массив.

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

Кодирование этой мысли дает что-то вроде этого:

void interclas(int *ptr,int *vec, int *c, int n) {
    int i = 0, j = 0, tmp = 0;
    // Traverse both arrays simultaneously,
    // and choose the min of the two current elements.
    // Increase the counter of the array who had
    // the min current element.
    // Increase the counter for the output array in
    // any case.
    while(i < n && j < n)
    {
         if(ptr[i] < vec[j])
        {
            c[tmp++] = ptr[i++];
        }
        else
        {
            c[tmp++] = vec[j++];
        }
    }
    // Store remaining elements of first array 
    while (i < n) 
        c[tmp++] = ptr[i++]; 

    // Store remaining elements of second array 
    while (j < n) 
        c[tmp++] = vec[j++]; 
}

Не источник вашей проблемы, но Я приведу результат mallo c?

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