Znajdowanie elementów na liście oraz usuwanie elementów pomiędzy nimi.

0

Cześć, mam taki programik do napisania:

Napisz program który, znajdzie x na liście jeżeli jest x dopiero szukamy y. Jeżeli jest x oraz y usuwamy elementy pomiędzy nimi – X, Y parametry funkcji. Wytestować na listach:1, 2, 3, 4 (dla x=6 oraz y=12), 4(dla x=5 oraz y=22), 4(dla x=18, y=-5);

Listy:

  1. H->NULL;
  2. H->5->NULL
  3. H->5->8->NULL
  4. H->5->3->6->8->5->18->-5->8->12->22->NULL
  5. H->55->8->25->NULL
  6. H->8->55->25->NULL
  7. H->8->55->25->->75->25->NULL

Udało mi się napisać funkcję która sprawdza czy na danej liście znajduje się x i y. Teraz nie mam pomysłu jak napisać resztę kodu

Oto mój kod:

#include <iostream>
#include <list>

using namespace std;

bool checkXY(list<int> lists, int x, int y){
    bool ifX = false;
    bool ifY = false;
    for(list<int>::iterator i=lists.begin(); i != lists.end(); i++){
        if(*i==x){
            ifX= true;
            continue;
        }
        if(ifX== true && *i==y)
            ifY= true;
    }
    return (ifX && ifY);
}



int main() {

    list<int> list1 = {};
    list<int> list2 = {5};
    list<int> list3 = {5,8};
    list<int> list4 = {5,3,6,8,5,18,5,12,22};
    list<int> list5 = {55,8,25};
    list<int> list6 = {8,55,25};
    list<int> list7 = {8,55,25,75,25};

    return 0;
}
2

Nie baw się w wynajdywanie koła na nowo. użyj std::find do znalezienia x i y, i list::erase do ich usunięcia. To są 3-4 linijki kodu.

0

Na listach za bardzo się nie znam i nigdy nie używałem find na listach ale udało mi się napisać coś takiego:

bool check(list<int> lists, int x, int y){
    list<int>::iterator posX,posY;
    posX = find(lists.begin(),lists.end(),x);
    if(*posX==x){
        posY = find(lists.begin(),lists.end(),y);
        if(*posY==y){
            return true;
        }
    }
    return false;
}

Funkcja która sprawdza czy jest x na liście i jeżeli jest to sprawdza czy jest y.

0

Źle, jak nie znajdzie to zwraca end(), a tej wartości nie możesz wyciągać. Porównaj posX do lists.end(). Swoją drogą, to fatalna nazwa, bo liczba mnoga sugeruje wielość list. Dodatkowo, nie przyjmuj argumentu przez kopię ( Przekazywanie parametru przez wartość i referencję )

Jak chcesz usuwać to użyj erase() między x i y i gotowe.

0

Dobra, coś tam skleiłem, działać działa.

list<int> removeElements(list<int> &listOfNumbers, int x, int y){
    std::list<int>::iterator it1,it2, posX,posY;
    it1 = listOfNumbers.begin();
    it2 = listOfNumbers.end();
    posX = find(listOfNumbers.begin(),listOfNumbers.end(),6);
    posY = find(listOfNumbers.begin(),listOfNumbers.end(),12);
    posX++;
    listOfNumbers.erase(posX,posY);
    return listOfNumbers;
}

a to main:

list<int> list4 = {5,3,6,8,5,18,5,12,22};
removeElements(list4,6,12);
for(list<int>::iterator i=list4.begin(); i!= list4.end(); ++i)
     cout<<*i<<" ";

Output: 5 3 6 12 22

0
    it1 = listOfNumbers.begin();
    it2 = listOfNumbers.end();

Po co to?

    posX = find(listOfNumbers.begin(),listOfNumbers.end(),6);
    posY = find(listOfNumbers.begin(),listOfNumbers.end(),12);

Fajnie używasz parametrów funkcji. Ponadto, nie masz masz szukać y od posX? Aha, pos też jest mylące, to iterator a nie pozycja.

return listOfNumbers;

Po co kopiujesz listę?

0
void removeElements(list<int> &listOfNumbers, int x, int y){
    std::list<int>::iterator it1,it2, posX,posY;
    posX = find(listOfNumbers.begin(),listOfNumbers.end(),x);
    posY = find(posX,listOfNumbers.end(),y);
    posX++;
    listOfNumbers.erase(posX,posY);
}

Tak to powinno finalnie wyglądać ?

0

Jeszcze wyświetlanie listy wywaliłem z maina i dałem do tej funkcji

0

Już nieźle. it1 i it2 wciąż zbędne, zamiast pisać długie typy użyj auto, i po wyszukaniu posY sprawdź czy znalazłeś. nie możesz wykonać posX++ jeśli nie znalazłeś x. Poza tym, nie miałeś usuwać włącznie ze znalezioną liczbą?

chwila, dodałeś wyświetlanie do funkcji removeElements? Dlaczego?!

0

Zaraz to przerobie. Wyświetlanie dodałem do funkcji bo zadanie jest trochę dłuższe:
Zadania do napisania:
• Usuń elementy pomiędzy x oraz y
• Znajdujemy x na liście jeżeli jest x dopiero szukamy y. Jeżeli jest x oraz y usuwamy elementy pomiędzy nimi – X, Y parametry funkcji. Wytestować na listach:1, 2, 3, 4 (dla x=6 oraz x=12), 4(dla x=5 oraz x=22), 4(dla x=18, x=-5);
• Elementy pomiędzy z oraz y przenieś na koniec listy.
• Analogicznie jak poprzednio - wytestować na listach:1, 2, 3, 4 (dla x=6 oraz x=12), 4(dla x=5 oraz x=22), 4(dla x=18, x=-5);
• Skopiuj listę na koniec w odwrotnej kolejności,
• H->2->8->6->4->NULL po działaniu funkcji H->2->8->6->4->4->6->8->2->NULL
• Wytestować na listach 1-4,
• Znajdź maksymalny element na liście i przenieś go na początek listy,
• Wytestować na liście 1, 2, 3, 4, 6, 7
• Zamień element pierwszy z ostatnim na liście,
• Wytestować na liście 1, 2, 3, 4

Więc żeby nie modyfikować tej listy to zrobiłem wyświetlanie wewnątrz funkcji i usunąłem &

0

Zadanie nie wymusza tworzenia obrzydliwego kodu, czemu więc to robisz?

0

Tylko w treści jest błąd, autor tego zadania w nawiasach pisał (dla x oraz x) pewnie powinno być (dla x oraz y)
I też zastanawiam się jak mam wytestować to na listach 1-3 gdzie nie mam podanych parametrów x y

0

Lista ma się nie zmienić.

0

No tak, ale jak w 1-3 nie mam parametrów to funkcja mi się nie wykona bo nie podałem 2 parametrów

0

Wpisz dowolne.

0

Zmieniłem liste, która miała tylko 1 element (w wywołaniu funkcji zmieniłem tylko nazwe, x i y zostawiłem takie jakie były), przy wykonywaniu programu nic się nie wyświetlało, tzn pewnie pokazywało pustą liste. Dodalem ten warunek żeby sprawdziło y jeżeli znajdzie x.

void removeElements(list<int> &listOfNumbers, int x, int y){
    auto itX = find(listOfNumbers.begin(),listOfNumbers.end(),x);
    if(*itX==x) {
        auto itY = find(itX, listOfNumbers.end(), y);
        itX++;
        listOfNumbers.erase(itX, itY);
    }
}

Teraz jest oki ?

0

Znowu robisz dereferencję iteratora zamiast porównać do end().

0

Nie wiem czy o to ci chodzi, zamiast itX++ ma być itX=lustOfNumbers.end()?

0

zmiast if(*itX==x) porównaj itX do end (ma być różne)

1 użytkowników online, w tym zalogowanych: 0, gości: 1