[C++] Pare pytań odnośnie list

rafal9541
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 31 sty 2012, o 20:38
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Pare pytań odnośnie list

Post autor: rafal9541 »

Bardzo proszę o pomoc z następującymi problemami:
1.Jaka wartość jest przekazywana do funkcji przy wywołaniu (wezel*glowa), a jaka przy (wezel*&glowa) w parametrach?
Do tej pory doszedłem do takiej zależności, że (wezel*glowa) jest wywolany gdy nie musimy edytować głowy, np. do wyznaczenia sumy elementów listy, a (wezel*&glowa) przy zmianie glowy np. przy wstawianiu elementów do listy.

2.Czy przy sprawdzeniu, że głowa jest pusta można stosować zamiennie wyrażeń:

Kod: Zaznacz cały

while(glowa!=NULL)
z:

Kod: Zaznacz cały

while(glowa->następny!=NULL)
Osobiście bym się skłaniał ku wersji 2, bo przy 1 sprawdzamy cały obiekt glowa razem z adresem i wartością co nie wiem czy jest poprawne...


3. Zamierzałem napisać program z kolejką i wydaje mi się, że nie rozumiem treści zadania, a dokładnie w poleceniu jest, żeby utworzyć strukturę 100 elementową, a w szablonie funkcji jest rozpoczęte tworzenie tablicy tablic, która ma się składać z 10 kolumn i wierszy. Chodzi mi o to, że nie wiem jak ma się ta struktura do tej tablicy tablic, bo jeżeli już tą macierz utworzymy to chyba nie jest nam potrzebna struktura... Oto treść zadania:


Zaimplementuj podstawowe operacje dla abstrakcyjnego typu danych kolejka mogącego przechowywać
maksymalnie 100 liczb rzeczywistych.
Kolejkę reprezentuj za pomocą struktury o nazwie Kolejka (0,5 p.), która zawiera 100-elementową tablicę o
elementach typu double.
Funkcje do napisania:

Kod: Zaznacz cały

dodajElement – umieszcza element w kolejce (1,0 p.)
wypiszElementy – wyświetla na ekranie w kolejności FIFO (first in-first out) wszystkie elementy, które
znajdują się w kolejce (0,5 p.)
tworzKolejke – tworzy nową, pustą kolejkę (0,5 p.)
usunKolejke – usuwa kolejkę i zawartą w niej tablicę z pamięci (0,5 p.)
Następnie w funkcji main() utwórz tablicę zawierającą 10 kolejek. i-ta kolejka, \(\displaystyle{ i=0,1, \ldots ,9}\), będzie służyć do
przechowywania wartości z przedziału [i,i+1). Wygeneruj kilkadziesiąt wartości rzeczywistych z przedziału [0,10),
umieść każdą z nich w odpowiedniej kolejce, a następnie wypisz zawartość każdej z kolejek na ekranie. (2,0 p.)
W celach testowych użyj następującego szablonu funkcji main():

Kod: Zaznacz cały

int main() {
Kolejka** kolejki = new Kolejka*[10];
// tworzenie poszczególnych kolejek za pomocą tworzKolejke()...
int i = 0;
for (int j=0; j<25; j++) {
i = (1+17*i)%100;
double s = i*0.1; // jakaś wartość z przedziału [0,10)
cout << "Wkladam " < s < endl;
// wloz s do odpowiedniej kolejki
}
// wypisz zawartosc kazdej kolejki...
// w postaci:
// Kolejka 0: /elementy..../
// Kolejka 1: /elementy..../
// ...
// Kolejka 9: /elementy..../
// kasowanie kolejek...
return 0;
Ostatnio zmieniony 6 sty 2013, o 17:02 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Pare pytań odnośnie list

Post autor: royas »

1. Wydaje mi się, że dobrze o tym myślisz, jednak nie jestem tego całkiem pewny. Wrzuć jakieś konkretne nagłówki.
2. 1. sprawdza czy głowa jest pusta. 2. sprawdza czy element wskazywany przez głowę ma następnik i powoduje błąd jeśli głowa jest pusta.
3. Gdzie masz napisane coś o tablicy o 10 kolumnach i wierszach? Masz napisać strukturę zawierającą tablicę 100 liczb i funkcję obsługujące tę strukturę. Jak już to zrobisz masz rozbudować funkcję main tak aby testowała te Kolejki. W tym celu tworzona jest tablica 10 wskaźników do Kolejek. Musisz dopisać kod robiący to co jest w komentarzu w linii 3, tworzący te 10 Kolejek i wpisujący wskazania na nie do tablicy "kolejki".
rafal9541
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 31 sty 2012, o 20:38
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Pare pytań odnośnie list

Post autor: rafal9541 »

Odnośnie 1 zadania przykład na wypisanie elementów:

Kod: Zaznacz cały

void wypisz(wezel* glowa)
   if(glowa==NULL)
   return 0;
   while(glowa!=NULL)
   {
   cout<<glowa->element<<endl;
   glowa=glowa->nastepny;
   }
przykład na wstawienie elem. na pocz. listy:

Kod: Zaznacz cały

void wstaw(wezel*&glowa, double x)
   {
    wezel*nowy=new wezel;
    nowy->elem=x;
    nowy->nastepny=glowa;
    glowa=nowy;
    }
Te wskaźniki dosyć mieszają w głowie, bo mają wiele różnych zastosowań. Czy ten wskaźnik jest tutaj potrzebny do operacji zmiany głowy?
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Pare pytań odnośnie list

Post autor: royas »

Tak. W obu funkcjach modyfikujesz zmienną glowa: glowa=costam.
Jednak w wypisz wskaźnik na węzeł jest przekazywany przez wartość, czyli niejako powstaje po prostu dodatkowa zmienna lokalna funkcji. Wszystkie zmiany tej zmiennej zostaną utracone w momencie zakończenia funkcji. Z tym, że dotyczy to zmian wskaźnika. Natomiast ewentualne zmiany w strukturze na którą wskazuje ten wskaźnik zostaną zachowane.

W przypadku "wstaw" przekazujesz parametr przez referencję (to właśnie oznacza &), czyli nie jest tworzona nowa zmienna lokalna, a wszystkie zmiany na glowie, tak naprawdę wykonywane są bezpośrednio na zmiennej, którą podamy jako argument w wywołaniu funkcji. Dlatego glowa=nowy zadziala tak jak nalezy.

Aha i taka mała uwaga. W wypisz linie 2 i 3 są błędne i zbędne. Nie możesz zwrócić 0 z funkcji void. W ogóle nie potrzebujesz tego sprawdzać: jeśli glowa==null to po prostu warunek w while nie będzie spełniony i pęta nie wykona się ani raz.
ODPOWIEDZ