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: void addNew() { int liczba; ifstream plik( "liczby.txt" ); while( plik >> liczba ) { Elem * wsk; wsk = first; while( wsk->key != ' ' ) wsk = wsk->next; wsk->key = liczba; } }
Pytanie może trywialne, ale wskaźniki sprawiają mi problem, a chciałabym wiedzieć jak to zrobić. :) Bardzo proszę o pomoc. |
|
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
|
|
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ą 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. |
|
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.
|
|
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? |
|
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 |
|
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. |
|
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. |
|
« 1 » |