• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pomoc z listami jednokierunkowymi

Object Storage Arubacloud
0 głosów
129 wizyt
pytanie zadane 24 maja 2020 w C i C++ przez kamylmeister Nowicjusz (190 p.)

Na początku zacznę, że praktycznie nic nie wiem o listach (nie chcę po prostu mieć napisanego programu, chciałbym go zrozumieć), bo nic o nich w szkole nie mielismy. Jest tu jakis kozak, który mógłby mi pomóc?

 
Napisz listę jednokierunkową przechowującą struktury Osoba

Struktura Osoba wygląda następująco:

struct Osoba
{
string name, surname;
int wiek;
Osoba *next;
};



Program powinien posiadać następujące opcje:
1. Dodaj osobę (Użytkownik podaje imię, nazwisko oraz wiek nowej osoby. Dodajemy osobę na końcu listy)
2. Usuń osobę po numerze (Jeśli użytkownik poda np. 2 to usuwamy drugą osobę z naszej listy, jak poda 3 to trzecią osobę itd. Jeśli na liście są 4 osoby a użytkownik poda np 7, to wypisujemy komunikat np: Nie ma takiej osoby)
3. Usuń osobę o nazwisku (Użytkownik podaje z klawiatury nazwisko i program usuwa wszystkie osoby o podanym nazwisku).
4. Wypisz osoby (Wypisujemy dane wszystkich osób przechowywanych na liście)
5. Szukaj osobę o nazwisku (Użytkownik podaj nazwisko osoby którą szuka. Przeszukujemy całą listę i wypisujemy dane dla osób o szukanym nazwisku.

Program ma na początku wyświetlać menu z opisanymi wyżej opcjami. Po wybraniu danej opcji program wykonuje daną operację i ponownie wypisuje menu.

1
komentarz 25 maja 2020 przez tkz Nałogowiec (42,000 p.)
Lista jest jedną z najprostszych struktur danych, przynajmniej ta jednokierunkowa. Pierwszy lepszy link z googla wszystko by wyjaśnił. Czego dokładnie oczekujesz? Niby nie chcesz gotowca, ale nic nie masz...
komentarz 25 maja 2020 przez kamylmeister Nowicjusz (190 p.)
#include <iostream>
#include <string>

using namespace std;

int wybor;

string n_imie, n_nazwisko;
int n_wiek;

int nr_delete;

int* temp;

struct osoba {
    string imie;
    string nazwisko;
    int wiek;
    osoba* nastepna; // wskaźnik na następny element
    osoba(); // konstruktor
};

osoba* pierwsza;

void lista() {
    pierwsza = 0; // konstruktor
}

osoba::osoba() {
    nastepna = 0; // konstruktor
}

void dodaj_osobe(string imie, string nazwisko, int wiek)
{
    osoba* nowa = new osoba;    // tworzy nowy element listy

    // wypełniamy naszymi danymi
    nowa->imie = imie;
    nowa->nazwisko = nazwisko;
    nowa->wiek = wiek;

    if (pierwsza == 0) // sprawdzamy czy to pierwszy element listy
    {
        // jeżeli tak to nowy element jest teraz początkiem listy
        pierwsza = nowa;
    }
    else
    {
        // w przeciwnym wypadku wędrujemy na koniec listy
        osoba* temp = pierwsza;

        while (temp->nastepna)
        {
            // znajdujemy wskaźnik na ostatni element
            temp = temp->nastepna;
        }

        temp->nastepna = nowa;  // ostatni element wskazuje na nasz nowy
        nowa->nastepna = 0;     // ostatni nie wskazuje na nic
    }
}

void wyswietl_liste()
{
    // wskaznik na pierszy element listy
    osoba* temp = pierwsza;

    // przewijamy wskazniki na nastepne elementy
    while (temp)
    {
        cout << "imie: " << temp->imie << " nazwisko: " << temp->nazwisko << endl;
        temp = temp->nastepna;
    }
}

void usun_osobe(int nr)
{
    // jezeli to pierwszy element listy
    if (nr == 1)
    {
        osoba* temp = pierwsza;
        pierwsza = temp->nastepna; //ustawiamy poczatek na drugi element
        delete temp; // usuwamy stary pierwszy element z pamieci
    }
    // jeżeli nie jest to pierwszy element
    else if (nr >= 2)
    {
        int j = 1;

        // do usuniecia srodkowego elemetnu potrzebujemy wskaznika na osobe n-1
        // wskaznik *temp bedzie wskaznikiem na osobe poprzedzajaca osobe usuwana
        osoba* temp = pierwsza;

        while (temp)
        {
            // sprawdzamy czy wskaznik jest na osobie n-1 niz usuwana
            if ((j + 1) == nr) break;

            // jezeli nie to przewijamy petle do przodu
            temp = temp->nastepna;
            j++;
        }

        // wskaznik *temp wskazuje teraz na osobe n-1
        // nadpisujemy wkaznik n-1 z osoby n na osobe n+1
        // bezpowrotnie tracimy osobe n-ta

        // jezeli usuwamy ostatni element listy
        if (temp->nastepna->nastepna == 0) {
            delete temp->nastepna;
            temp->nastepna = 0;
        }
        // jezeli usuwamy srodkowy element
        else {
            osoba* usuwana = temp->nastepna;
            temp->nastepna = temp->nastepna->nastepna;
            delete usuwana;
        }
    }
}

int main()
{
    do
    {
        cout << "Co chcesz zrobic?" << endl;
        cout << "1. Dodać osobe" << endl;
        cout << "2. Usunac osobe po numerze" << endl;
        cout << "3. Usunac osobe po nazwisku" << endl;
        cout << "4. Wypisac wszystkich" << endl;
        cout << "5. Wyszukac osobe po nazwisku" << endl;
        cout << "6. Zakonczyc program" << endl;

        cin >> wybor;

        system("CLS");

        switch (wybor) {

        case 1:
            cout << "Podaj imie: ";
            cin >> n_imie;
            cout << "Podaj nazwisko: ";
            cin >> n_nazwisko;
            cout << "Podaj wiek: ";
            cin >> n_wiek;
            dodaj_osobe(n_imie, n_nazwisko, n_wiek);
        case 4:
            wyswietl_liste();
        case 6:
            exit;
        }
    } while (wybor != 6);
}

 

jestem totalnym noobem, narazie mam cos takiego, co tu trzeba zmienic?

1
komentarz 25 maja 2020 przez tkz Nałogowiec (42,000 p.)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 16 czerwca 2021 w C# przez Bartek12 Mądrala (5,510 p.)
+1 głos
2 odpowiedzi 259 wizyt
0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 29 stycznia 2019 w Python przez RadziSzop Nowicjusz (240 p.)

92,624 zapytań

141,480 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...