C++ :: Aufgabe #335

1 Lösung Lösung öffentlich

Duplikate bis auf Dopplungen aus Liste entfernen

Anfänger - C++ von JKooP - 21.02.2021 um 11:24 Uhr
Gegeben ist eine sortierte Liste, welche alle gängigen Datentypen aufnehmen kann.
Dabei sind alle Werte des gleichen Typs. Statt der Liste können auch Arrays genutzt werden.

Beispiele:
List<int> {1, 1, 1, 2, 2, 3}
List<char> {‘a’, ‘a’, ‘b’, ‘c’, ‘c’, ‘c’}

Aus dieser Liste sollen jetzt alle Duplikate entfernt werden, wobei hier jeder Wert 2-mal vorkommen darf.

Lösung:
List<int> {1, 1, 2, 2, 3}
List<char> {‘a’, ‘a’, ‘b’, ‘c’, ‘c’}

Schreibe eine Methode/Funktion, die eine Liste/Array aufnimmt, die Duplikate entfernt
und diese dann wieder als Rückgabewert oder Referenz zurückgibt.

Viel Spaß

Lösungen:

vote_ok
von felixTheC (1200 Punkte) - 04.03.2021 um 16:14 Uhr
Quellcode ausblenden C-Code
#include <iostream>
#include <list>

using std::list;

template<typename T>

void printListe(list<T> &liste) {
    std::cout << '{';

    for (auto val = liste.begin(); val != liste.end(); ++val) {
        std::cout << *val;
        if (val != --liste.end()) {
            std::cout << ", ";
        }
    }

    std::cout << '}' << std::endl;
}

void filterDuplicates(list<int> *&liste);
void filterDuplicates(list<char> *&liste);

int main() {
    auto *intList = new list<int>{1, 1, 1, 2, 2, 3};
    auto *charList = new list<char>{'a', 'a', 'b', 'c', 'c', 'c'};

    std::cout << "Before..." << std::endl;
    printListe(*intList);
    printListe(*charList);

    filterDuplicates(intList);
    filterDuplicates(charList);

    std::cout << "After..." << std::endl;
    printListe(*intList);
    printListe(*charList);

    return 0;
}

void filterDuplicates(list<int> *&liste)
{
    auto *tmp = new list<int>;
    int counter = 1;
    int *tmpVal = nullptr;

    for (auto &val : *liste)
    {
        if (tmpVal != nullptr && *tmpVal != val)
        {
            counter = 1;
        }

        tmpVal = &val;

        if (counter <= 2)
        {
            tmp->push_back(val);
            ++counter;
        }
    }

    delete(liste);
    liste = nullptr;
    liste = tmp;

}

void filterDuplicates(list<char> *&liste)
{
    auto *tmp = new list<char>;
    int counter = 1;
    char *tmpVal = nullptr;

    for (auto &val : *liste)
    {
        if (tmpVal != nullptr && *tmpVal != val)
        {
            counter = 1;
        }

        tmpVal = &val;

        if (counter <= 2)
        {
            tmp->push_back(val);
            ++counter;
        }
    }

    delete(liste);
    liste = nullptr;
    liste = tmp;

}