Как вставить элементы в массив с помощью функции? - PullRequest
0 голосов
/ 06 августа 2020

Мне немного сложно создать функцию в C, которая имеет 2 параметра, имя массива и его начальный размер, и проверяет массив на нечетные числа. Если он найдет один, он insert будет его двойником прямо рядом с ним и переместит остальные элементы. Я знаю, как это сделать без функции, но с функцией это не работает. Программа запущена, но ничего не делает. Помогите, пожалуйста?

Пример. a[5]= {2, 5, 6, 8, 11};

 a[7]={2, 5, 10, 6, 8, 11, 22}

Кроме того, функция не должна ничего возвращать, и массив индексируется от 0 до n-1.

Так выглядит моя функция.

void Insert(int v[], int *n)    
{
    int i,j;
    
    for(i=*n-1; i>=0; i--)     //passing through the array from right to left
    {
        if(v[i]%2==1)       // if the element is odd
        {
            *n++;           // grow the array size by 1 
            int double=v[i]*2;    
            for(j=*n-1; j>=i+1; j--)    // move all elements in the right of the odd number to the right by 1 space
            {
                v[j+1]=v[j];
            }
            v[i+1]=double;    // add the double value next space after the odd number.
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Проблемы:

  • double - это зарезервированное ключевое слово в c.
  • На самом деле из вопроса я чувствую, что вам не хватает память для хранения элементов, и вы не увеличиваете размер.
  • * n ++ эквивалентно * (n ++), но вам нужно сделать это (* n) ++

Хорошо, если памяти достаточно для хранения всех элементов, то вы можете использовать другой ответ. Если нет, вы можете использовать этот код:

Тогда вам нужно использовать realloc, чтобы время от времени изменять размер. Поэтому для этого ваш массив должен создаваться динамически. И вы должны отправить указатель на указатель на массив (int **) функции, как вы можете видеть в приведенном ниже коде. Все эти изменения выполняются в зависимости от того, как работает realloc.

#include <stdio.h>
#include <stdlib.h>

void Insert(int **v, int *n)
{
    int i, j;

    for(i = (*n) - 1; i >= 0; i--)     //passing through the array from right to left
    {
        if((*v)[i] % 2 == 1)       // if the element is odd
        {
            while (1) {
                int *p = realloc(*v, (*n + 1) * sizeof(int));         // grow the array size by 1
                if (p != NULL) {
                    *v = p;
                    (*n)++;
                    break;
                }
                else {
                    printf("Allocation failed .... Reallocating\n");
                    continue;
                }
            }

            int var = (*v)[i] * 2;
            for(j = (*n) - 1; j >= i + 2; j--)    // move all elements in the right of the odd number to the right by 1 space
            {
                (*v)[j] = (*v)[j - 1];
            }
            (*v)[i + 1] = var;    // add the double value next space after the odd number
        }
    }
}

int main()
{
    int size = 3;
    int *a = malloc(sizeof(int) * size);
    for(int i = 0; i < size; ++i)
        a[i] = i + 1;

    Insert(&a, &size);
    for (int i = 0; i < size; ++i) {
        printf("%d\n", a[i]);
    }

    free(a);
    return 0;
}

0 голосов
/ 06 августа 2020

Если память, выделенная для v, достаточно велика для поддержки роста (см. 32 в основной функции), у вас есть 2 проблемы:

  • double - это зарезервированное слово
  • * n ++ не делает то, что вам нужно, это увеличивает указатель n, а не его значение
static void Insert(int v[], int *n)
{
    int i,j;

    for(i=*n-1; i>=0; i--)     //passing through the array from right to left
    {
        if(v[i]%2==1)       // if the element is odd
        {
            (*n)++;           // grow the array size by 1
            int d=v[i]*2;
            for(j=*n-1; j>=i+1; j--)    // move all elements in the right of the odd number to the right by 1 space
            {
                v[j+1]=v[j];
            }
            v[i+1]=d;    // add the d value next space after the odd number.
        }
    }
}

int main(void) {
    int a[32]= {2, 5, 6, 8, 11};
    int len = 5;
    Insert(a, &len);
    for (int i = 0; i < len; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

Результат:

2 5 10 6 8 11 22

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