Lista jednokierunkowa dodawanie elementu

0

Mam do napisania grę i muszę wykonać do niej równiej moduł zapisujący wyniki w pliku. Postanowiłem użyć tu listy jednokierunkowej i mam problem ze zmianą wartości w elemencie który już istnieje. Chciałbym, żeby funkcja po wpisaniu odpowiednich parametrów sprawdziła, czy istnieje taki element w liscie, jesli tak to dodaje punkty jesli nie to tworzy nowy element.

 
void dodaj_na_poczatku(Wynik *&start, string imie, int punkty) {
    Wynik *p;
    p=start;

/*
    p=new Wynik;
    p->imie=imie;
    p->liczba_punktow=punkty;
    p->nastepny = start;
    start = p;

    */
    while(p)
    {
        if(p->imie==imie)
        {

            p->liczba_punktow=p->liczba_punktow+punkty;
            p->nastepny=start;
            start = p;
        } else {
            p=new Wynik;
            p->imie=imie;
            p->liczba_punktow=punkty;
            p->nastepny = start;
            start = p;
        }
        p=p->nastepny;
    }

Z góry dzięki za odpowiedzi :D

1

Piszesz w C++ więc użyj może std::map
Latanie po całej liście aby sprawdzić czy taki jest?! Totalny bezsens, już lepiej zrób tablicę i trzymaj ją w postaci posortowanej np za pomocą heapsort, lub nawet standardowy sort - i tak będzie szybsze.
Masz za zadanie znaleźć w zeszycie Kowalskiego jeżeli jest to dopisać liczbę, jeżeli nie ma to dopisać na koniec.

  1. Co robisz, ustawiasz paluch na pierwszy zapis w zeszycie.
  2. Czy to Kowalski?
    2.1. Tak - to dopisujemy liczbę, ale nie kończymy na tym i idziemy dalej
    2.2. Nie - to nie Kowalski, dopisujemy tuż pomiędzy wierszami tego Kowalskiego, ale nie kończymy na tym i idziemy dalej
  3. Przejdź na kolejny rekord
0
_13th_Dragon napisał(a):

Piszesz w C++ więc użyj może std::map
Latanie po całej liście aby sprawdzić czy taki jest?! Totalny bezsens, już lepiej zrób tablicę i trzymaj ją w postaci posortowanej np za pomocą heapsort, lub nawet standardowy sort - i tak będzie szybsze.
Masz za zadanie znaleźć w zeszycie Kowalskiego jeżeli jest to dopisać liczbę, jeżeli nie ma to dopisać na koniec.

  1. Co robisz, ustawiasz paluch na pierwszy zapis w zeszycie.
  2. Czy to Kowalski?
    2.1. Tak - to dopisujemy liczbę, ale nie kończymy na tym i idziemy dalej
    2.2. Nie - to nie Kowalski, dopisujemy tuż pomiędzy wierszami tego Kowalskiego, ale nie kończymy na tym i idziemy dalej
  3. Przejdź na kolejny rekord

DZIĘKI WIELKIE.

 
void wyniki_pobieranie(Wynik *&start)
{
    Wynik *p;
    p=start;
    string napis;
    int wynik;
    fstream plik("Wyniki.txt");
    if(!plik.good()) cout << "Error!! B\210\245d pliku!";
    else {
        while(!plik.eof()){
            p=new Wynik;
            plik >> napis;
            plik >> wynik;
            p->imie=napis;
            p->liczba_punktow=wynik;
            p->nastepny = start;
            start = p;
            }
    }
}

Mam jeszcze problem z tą funkcją, mimo tego że w pliku są zapisane imiona i ich punkty, funkcja pobiera zawsze o jedno imie i wynik więcej. Widzi ktoś gdzieś błąd w tej funkcji ?

0
  1. Piszesz w C++ może zrób sobie konstruktor dla ułatwienia
  2. .eof() zostaje ustawiony dopiero przy próbie odczytu, więc:
while(plik>>napis>>wynik){
            p=new Wynik(napis,wynik);
...

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