Listy Jednokierunkowe

0

Witam!

Napisałem taki program na zasadzie trochę nierozumnego kopiowania części fragmentów ale działa lecz chciałbym zrozumieć od poszewki zasadę jego działania krok po kroku głównie pod kątem właśnie listy jednokierunkowej i wskaźników w niej zawartej. Mniej więcej wiem jak to działa ale prosiłbym o przejrzyste wytłumaczenie (nie w 2 zdaniach). O to kod:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

struct osoba
{
    int id;
    char imie [20];
    char nazwisko [20];
    osoba * nastepny;
};

void dodaj(osoba *&pierwszy, int &licznik)
{
	osoba *nowy, *pozycja;

	nowy = new osoba;
	nowy->id = licznik;
	cout<<"Podaj imie"<<endl;
	cin>>nowy->imie;
	cout<<"Podaj nazwisko"<<endl;
	cin>>nowy->nazwisko;

	nowy->nastepny = NULL;

	if (pierwszy == NULL)
	{
		pierwszy = nowy;
	}
	else
	{
		pozycja = pierwszy;

		while (pozycja->nastepny != NULL)
        pozycja = pozycja->nastepny;
		pozycja->nastepny = nowy;
	}
licznik++;

}

void wyswietl (osoba *&pierwszy)
{
	osoba *pozycja = pierwszy;
	if (pozycja == NULL)
		cout << endl << "Lista jest pusta." << endl;
	else
		while (pozycja != NULL)
		{

		    cout<<pozycja->id<<endl;
			cout<<pozycja->imie<<endl;
			cout<<pozycja->nazwisko<<endl;

			cout<<" \n\n";
			pozycja = pozycja->nastepny;
		}
}

int main()
{
int licznik = 1;
int wybor;
osoba * pierwszy = NULL;
do
{

cout<<"1 - Dodaj nowy \n";
cout<<"2 - Wyswietl \n";
cout<<"0 - Exit \n";


cin>>wybor;
switch(wybor)
{

    case 1:
        dodaj(pierwszy, licznik);
        system ("cls");
        break;
    case 2:
        system ("cls");
        wyswietl (pierwszy);
        break;
        getchar();
    case 3:
        return 0;


}

}
while (wybor!=0);


    return 0;
}

 

Z góry dzięki

0

Chcesz zrozumieć - narysuj to sobie. zrób kilka rysunków:

  1. pusta lista
  2. z jednym elementem
  3. z dwoma elementami
    Po czym uzupełnij to rysunkami przejściowymi, wg kodu.
0

Właśnie chodzi o to , że nawet nie bardzo wiem jak zacząć

0

zapoznaj się z narzędziem debugger. Linijka po linijce Cie przeprowadzi przez program. A Ty sobie to rysuj (tak, te kroki i te powiązania wszystkie). Nikt Ci nie będzie tego tłumaczył krok po kroczku.

0

Nie chcesz to nie pomagaj myślisz że od tak skopiowałem coś i wkleiłem ? Od paru godzin czytam o tym. Każdy chyba zaczynał od takiego poziomu a z tego co wiem to forum jest żeby pomóc a nie grać kozaka.

Chodzi mi tylko o te wskaźniki a nie o cały kod linijka po linijce.

0

Z miłą chęcią bym narysował gdybym wiedział od czego zacząć

0

osoba *&pierwszy

Co ja właśnie zobaczyłem?

0

Sorry nie zauważyłem, klas jeszcze w ogóle nie przerabiałem. W teorii mniej więcej wiem jak to działa, że każdy element listy pokazuje na następny. Nie wiem do końca w tym miejscu:

 pozycja = pozycja->nastepny;
 pozycja->nastepny = nowy;

jak to przebiega.

0

To widać teraz jak bardzo ten kod jest twój :3

jednakże oświeć mnie (człowiek całe życie się uczy), czemu służy tu w kodzie "*&" ?

0

Bo na mój chłopski rozum zwykłe "*" by wystarczyło.

0

Referencja

// @UM nie spamuj jak nie masz zamiaru pomóc

0

Lecz raz jeszcze mówię, zwykłe "*" tutaj wystarczy. "&" Używa się do zwykłych zmiennych.

Tak więc ich połączenie robi jakąś magię (poza zamętem) ?

0

To jest referencja na wskaźnik, referencja nie musi by tylko na zwykłe zmienne.
Samej gwiazdki by nie wystarczyło, zaś ** (podwójna gwiazdka) owszem może to zastąpić, ale o wiele łatwiej i czytelniej posługiwać się referencją.

0

Wracając do tego co pisałem wcześniej

pozycja = pozycja->nastepny;
pozycja->nastepny = nowy;

nie do końca rozumie w tym momencie

0

Tą pętla przy dodawaniu jakoś mi się nie podoba. Powinno być

while(pozycja->nastepny != NULL) pozycja = pozycja->następny;
pozycja-> nastepny = nowy;

Co oznacza że najpierw przechodzimy przez listę do końca, tam gdzie nastepny jest NULL i w to miejsce wstawiamy nowy element.

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