Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wypisywanie elementów listy cyklicznej jednokierunkowej

Ostatnio zmodyfikowano 2014-04-04 21:58
Autor Wiadomość
Malina94
Temat założony przez niniejszego użytkownika
[C++] Wypisywanie elementów listy cyklicznej jednokierunkowej
» 2014-04-03 17:38:31
Mam listę cykliczną jednokierunkową, a do niej wskaźniki first, last.
Za pomocą jednej funkcji, tworzę puste elementy w tej liście (miejsca). Kolejną funkcją, wypełniam część tych miejsc liczbami, np. robię 10 miejsc, wypełniam 7 z nich.
Na koniec robię wypisanie elementów (wpisanych liczb) funkcji (funkcja wypisująca była z góry zaimplementowana) i tu pojawia się problem:
Po 1. Wypisywanie odbywa się bez przerwy, w nieskończoność.
Po 2. W puste miejsca kompilator wstawia jakieś liczby i je wyświetla.

Jak mogę ustawić wskaźnik last, abym pokazywała nim na ostatnią wpisaną do listy liczbę (a nie puste miejsce w liście)?

Moja funkcja, którą wpisuję liczby w puste miejsca:
C/C++
void addNew()
{
    int liczba;
    ifstream plik( "liczby.txt" );
   
    while( plik >> liczba ) {
        Elem * wsk;
        wsk = first; //1) ustawiam sie na pierwszy element w liscie
        while( wsk->key != ' ' ) wsk = wsk->next; // 2) przeszukuje liste poki nie znajde pustego elem
       
        wsk->key = liczba; // 3) temu pustemu elementowi przypisuje liczbe
    }
}

Pytanie może trywialne, ale wskaźniki sprawiają mi problem, a chciałabym wiedzieć jak to zrobić. :)

Bardzo proszę o pomoc.
P-107651
bombatom69
» 2014-04-04 19:14:30
Może zajrzyj do jakiejść książki, gdzie wyjaśniona jest budowa listy.
Wskaźnik do last nie jest Ci do niczego potrzebny w jej przeglądaniu.

Warunkiem końcowym w przeglądaniu pętli jest
temp->next==null
Jeśli ten warunek jest spełniony, to oznacza, że temp wskazuje na element ostatni.
temp to oczywiście tymczasowy wskaźnik

P-107701
Malina94
Temat założony przez niniejszego użytkownika
» 2014-04-04 19:32:02
Wiem, że last nie jest konieczny. Wcześniej już coś próbowałam robić na listach i nie używałam go. Teraz muszę, bo ta funkcja którą tworzę, jest uzupełnieniem narzuconego mi z góry kodu. I w tym właśnie kodzie mam funkcję wypisującą

C/C++
void printAll() {
    if( !first || isEmptyQueue ) printf( "-\n" );
    else {
        Elem * tmp = first;
        while( tmp != last ) {
            printf( "%d->", tmp->key );
            tmp = tmp->next;
        }
        printf( "%d\n", last->key );
    }
}

która jak widać używa tego wskaźnika.
P-107703
bombatom69
» 2014-04-04 20:04:03
Cała masa dziwnych rzeczy w tej Twojej funkcji dodającej :)

0. Liczbę deklarujesz jako int, w zmiennej key sprawdzasz zmienną char, która jest pewnie jednobajtowa. Jeśli przypiszesz tam wartość 32 to będzie problem, bo taki kod ma właśnie spacja :)
1. last musi wskazywać na ostatni element. Zmieniasz go gdy dodajesz na koniec listy
2. Ty nie dodajesz elementów lecz je modyfikujesz. Nie masz więc podstaw do modyfikacji last.
3. Przyjrzałbym sie raczej warunkowi pętli zewnętrznej. Nie pamiętam już fstream ale wydaje mi się, że sprawdzanie czy nie napotakaliśmy na eof(koniec pliku), jest konieczne.

P-107705
Malina94
Temat założony przez niniejszego użytkownika
» 2014-04-04 20:20:07
Jestem świadoma tego, że czasem wstawiam do kodu dziwne rzeczy. :P Ale właśnie przy tym zapętlaniu się, w pustych spacjach wypisuje mi właśnie 32.

fstream wrzuciłam tylko na potrzeby sprawdzania czy wszystko działa. Później zmieniam na cin>> i wrzucam to na serwer, na testy.

Czyli nie mam nic robić z tym last?
P-107706
bombatom69
» 2014-04-04 20:32:34
i wrzucam to na serwer, na testy. Brzmi strasznie :)

Czyli nie mam nic robić z tym last? No chyba nie
P-107708
Malina94
Temat założony przez niniejszego użytkownika
» 2014-04-04 20:53:40
Jest to straszne, wystarczy drobna różnica między moim wyjściem, a w teście i już dalej nie sprawdza.

Co więc mogę zrobić, by na wyjściu nie wypisywało mi w nieskończoność wpisanych liczb i 32 na spacjach? :) Biorąc pod uwagę, to, że potem już nie będę mieć wczytywania z pliku.
P-107709
bombatom69
» 2014-04-04 21:58:46
Klasę masz narzuconą, funkcję printAll, jak zrozumiałem również. Wypisuje ona elementy bezwarunkowo.
Nic się nie da zrobić aby nie wypisywała wartości, które Ty uważasz za "puste".
Zmienna nigdy nie jest pusta, może zawierać "śmieci" lub wartość ustaloną jako brak wartości. Jednak to w niczym nie pomoże dopóki nie ma żadnych warunków w funkcji printAll.

Ustalenie takiej wartości i modyfikacja printAll to jest jakieś rozwiązanie, jednak najlepszym byłaby zmiana zmiennej key (w definicji klasy) na wskaźnik key. Wówczas taki wskaźnik przy dodawaniu "pustego" węzła, ustalony na null, dawałby informację, że węzeł jest pusty faktycznie. W takim rozwiązaniu, każda wartość z zakresu akceptowanego przez typ zmiennej mogłaby być reprezentowana.
P-107717
« 1 »
  Strona 1 z 1