• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista stl - dodawanie za elementem

Object Storage Arubacloud
0 głosów
349 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

Witam :) 

Mam pytanie odnośnie metody insert(). Używam jej na takiej zasadzie, że podaje numer elementu, za którym ma pojawić się mój element. Jednak chciałbym uzyskać taki efekt, że element będzie wstawiany po wskazanym numerze indeksu ( czy innej danej w danym elemencie). Czy jest taka możliwość, żeby przerobić tę funkcję? 

 

void insert()
{
     string numer_albumu, imie, nazwisko, rok_studiow, kierunek, specjalnosc;



    list<student>::iterator i=lista.begin(); i!= lista.end(); ++i;
    int pozycja;
    cout<<"Gdzie wstawic element: ";
    cin>>pozycja;
     cout << "Podaj wszystkie informacje o studencie." << endl;
     cout << "Numer albumu: ";
     cin >> numer_albumu;
     cout << "Imie studenta: ";
     cin >> imie;
     cout << "Nazwisko studenta: ";
     cin >> nazwisko;
     cout << "Rok studiow: ";
     cin >> rok_studiow;
     cout << "Kierunek studiow: ";
     cin >> kierunek;
     cout << "Specjalnosc: ";
     cin >> specjalnosc;
    advance(i, pozycja);
    lista.insert(i, {numer_albumu, imie, nazwisko, rok_studiow, kierunek, specjalnosc});

}

 

1 odpowiedź

0 głosów
odpowiedź 29 marca 2017 przez criss Mędrzec (172,590 p.)
wybrane 29 marca 2017 przez krzakurts
 
Najlepsza

Podaj insertowi iterator na element nastepny w stosunku do elementu za którym ma się znaleźć nowy element (bo insert wstawia w miejsce przed podanym iteratorem). Skorzystaj z std::find_if i std::next. Np.:

std::list<Student> l;
//zalozmy ze lista nie jest pusta

auto it = std::find_if(l.begin(). l.end(), [](const Student & s) { return s.nr_albumu == "165546"; });
l.insert(std::next(it), {...});

Możliwe, ze jest w tym kodzie jakiś błąd, bo nie mam już czasu sprawdzać, ale mam nadzieje, że zrozumiałeś o co mi chodziło anyway :) 

(powyższy kod powinien wstawić nowy element za elementem o numerze albumy rownym "165546" - o ile ofc taki istnieje, w przeciwnym wypadku crash).

komentarz 29 marca 2017 przez krzakurts Obywatel (1,470 p.)

Działa, dziękuję. Mam jeszcze mały problem z dodawaniem po elemencie w liście, której metody sam implementuje, bowiem zawsze dodaje mi nowy element na drugim miejscu niezależnie od tego na jaki inny element wskażę. Nie wiem, gdzie może być błąd. 

 

void lista::dodaj_studenta_po(){
int nr_albumu_studenta, wybor1;
     string nazwisko_studenta;

     cout << "Podaj nr albumu: ";
     cin >> nr_albumu_studenta;
      student *nowy = new student;
student *temp= pierwszy;

     while(temp!=NULL && (temp->numer_albumu)!=nr_albumu_studenta)
temp=temp->nastepny;
 if(temp == NULL)
 {
      cout << "Nie ma studenta o nr albumu: " << nr_albumu_studenta<< endl;
 }
 else
 {
nowy -> nastepny=temp;
nowy -> nastepny= pierwszy->nastepny;
nowy -> poprzedni= pierwszy;
pierwszy -> nastepny-> poprzedni=nowy;
pierwszy -> nastepny = nowy;
 }


     cout << endl;
     cout << "Podaj numer albumu studenta: ";
     cin >> nowy -> numer_albumu;
     cout <<  "Podaj imie studenta: ";
     cin >>  nowy -> imie;
     cout << "Podaj nazwisko studenta: ";
     cin >> nowy -> nazwisko;
     cout <<  "Podaj rok studiow studenta: ";
     cin >> nowy ->  rok_studiow;
     cout <<  "Podaj kierunek studiow studenta: ";
     cin >> nowy ->  kierunek;
     cout <<  "Podaj specjalnosc studiow studenta: ";
     cin >> nowy -> specjalnosc;
     cout << endl;
komentarz 29 marca 2017 przez krzakurts Obywatel (1,470 p.)
Dodam, że w przypadku listy jednokierunkowej wszystko ładnie chodziło, jednak tutaj pewnie psuje coś w tych wskaźnikach.
komentarz 29 marca 2017 przez criss Mędrzec (172,590 p.)
nowy -> nastepny=temp;
nowy -> nastepny= pierwszy->nastepny;
nowy -> poprzedni= pierwszy;
pierwszy -> nastepny-> poprzedni=nowy;
pierwszy -> nastepny = nowy;

Jaki sens ma dwukrotne przypisywanie?

Czego się spodziewałes skoro koniec końców nowy->poprzedni == pierwszy a nowy->następny == pierwszy->następny ? Ewidentnie dodajesz element na drugą pozycję. 

komentarz 1 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)
Jak według Ciebie to powinno wyglądać, żeby odpowiednio chodziło? Usiadłem do tego teraz ponownie i nie mam pomysłu, co tu zmienić.
komentarz 1 kwietnia 2017 przez criss Mędrzec (172,590 p.)

Zauważ, że najpierw wyszukujesz element o właściwym nr albumu, a potem kompletnie nic z nim nie robisz.

IMO tak powinno być (mam nadzieję, że się nie machnąłem gdzieś):

student * prev = temp, * next = temp->nastepny;
next->poprzedni = nowy;
prev->nastepny = nowy;
nowy->nastepny = next;
nowy->poprzedni = temp;

komentarz 1 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)

Kompiluje się, jednak po wyświetleniu listy nie ma tego dodanego elementu. Moja funkcja wyswietlająca wygląda tak: 

 

void wyswietl_liste()
{
     student *temp=pierwszy;
     while(temp)
     {
          cout << "Numer albumu: " << temp->numer_albumu << " Imie: " << temp->imie << " Nazwisko: " << temp->nazwisko << " Rok studiow: " << temp->rok_studiow << " Kierunek: " << temp-> kierunek << " Specjalnosc: " << temp-> specjalnosc << endl;
          temp=temp-> nastepny;
     }
}

 

komentarz 1 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Hm, zamień dwie ostatnie linie tego kodu co wkleiłem z 2 i 3.
komentarz 1 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)
Dalej to samo
komentarz 1 kwietnia 2017 przez criss Mędrzec (172,590 p.)
To nie wiem, a teraz nie mam czasu za bardzo. Spróbuj sam pokombinować.

Podobne pytania

0 głosów
1 odpowiedź 451 wizyt
pytanie zadane 27 marca 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 322 wizyt
0 głosów
2 odpowiedzi 406 wizyt
pytanie zadane 8 lipca 2019 w C i C++ przez niezalogowany

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...