Проблема в том не могу написать удаление элемента из одномерного массива и сдвиг

 (элемент проверяем есть ли в массиве, размер массива после удаления естественно понижаем)

#include <stdio.h>
#include <windows.h>

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int a[10], n, id, p;
    printf("Введите размер массива: ");
    scanf("%d", &n);

    printf("Введите элементы\n");
    for (int i = 0; i < n; i++)
    {
        fflush(stdin);
        scanf("%d", &a[i]);
    }
    fflush(stdin);
    printf("Введите элемент для удаления: ");
    scanf("%d", &id);
    fflush(stdin);
    p = 1;
    while (p != 0)
    {
        p = 0;
        for (int i = 0; i < n; i++)
        {
            if (id == a[i])
            {
                for (int j = 0; j < n; j++)
                {
                    a[j] = a[j + 1];
                }
            }
        }
        n--;

        for (int i = 0; i < n; i++)
        {
            printf("%d ", a[i]);
        }
        printf("\np = \n");
        scanf("%d", &p);
        fflush(stdin);
    }



    return 0;
}

Вот


Ответы (1 шт):

Автор решения: MBo

Простой вариант (неэффективный)

for (int i = n-1; i >=0 ; i--)
    {
        if (id == a[i])
        {
            for (int j = i; j < n - 1; j++)
            {
                a[j] = a[j + 1];
            }
        n--;
        }
    }

Более эффективный:

int cnt = 0;
for (int i = 0; i < n; i++)
{
    if (id == a[i])
        cnt++;
    else
       a[i - cnt] = a[i];
}
n-= cnt;

Для    5   1 3 2 1 2      2
Выдаёт     1 3 1
→ Ссылка