Elem(ek) törlése tömbből

Elem törlése tömbből

Adott egy n elemű tömb és egy k index. Töröljük ki a tömbből a k indexű elemet!

Példa:

    n = 6, k = 2
    10 11 13 15 1 20

    A tömb állapota a törlés után: 10 11 15 1 20, és n legyen 5.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    for (int i = 0; i < n; i++)
        cin >> t[i];

    int k;
    cout << "k = ";
    cin >> k;

    // törlés
    for (int j = k+1; j < n; j++) {
        t[j-1] = t[j];
    }

    n--;

    // törlés másképp:
    /*
    for (int j = k; j <= n-2; j++) {
        t[j] = t[j+1];
    }

    n--;
    */

    // kiírás
    for (int i = 0; i < n; i++)
        cout << t[i] << " ";
    cout << endl;

    return 0;
}

HF: https://www.pbinfo.ro/probleme/1452/stergere-element (ugyanaz, csak itt 1-től kell sorszámozni).

Több elem törlése

Például adott tömbből töröljük az összes nullát!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    for (int i = 0; i < n; i++)
        cin >> t[i];

    /*
    */

    int i = 0;
    while (i < n)
        if (t[i] == 0) {
            // töröljük t[i]-t
            for (int j = i+1; j < n; j++)
                t[j-1] = t[j];

            n--;
            // i++ nincs!
        }
        else
            i++;

    for (int i = 0; i < n; i++)
        cout << t[i] << " ";
    cout << endl;

    return 0;
}

Vagy: végigjárhatjuk for-ral is, csak akkor erőltetve vissza kell csökkenteni i-t, hogy ugyanazon a pozíción maradhassunk.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    for (int i = 0; i < n; i++)
        cin >> t[i];

    for (int i = 0; i < n; i++)
        if (t[i] == 0) {
            // töröljük t[i]-t
            for (int j = i+1; j < n; j++)
                t[j-1] = t[j];

            n--;
            i--;
        }

    for (int i = 0; i < n; i++)
        cout << t[i] << " ";
    cout << endl;

    return 0;
}

Hatékonyabb változat több elem törlésére

Ötlet: járjuk végig csak egyszer a tömböt és mindenkit tegyünk a végleges helyére.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int t[100];
    for (int i = 0; i < n; i++)
        cin >> t[i];

    int i_olvas = 0;
    int i_ir = 0;

    while (i_olvas < n) {
        if (t[i_olvas] != 0)
        {
            t[i_ir] = t[i_olvas];
            i_ir++;
        }
        i_olvas++;
    }

    n = i_ir;

    for (int i = 0; i < n; i++)
        cout << t[i] << " ";
    cout << endl;

    return 0;
}