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

Listy jednokierunkowe nowicjusz

VPS Starter Arubacloud
0 głosów
218 wizyt
pytanie zadane 12 grudnia 2019 w C i C++ przez kaminie318 Bywalec (2,070 p.)
Witam. Mam problem ze zrozumieniem list jednokierunkowych, a konkretnie implementacji i funkcji na nich takch jak dodaj, usuń itp. Czy jesteście w stanie wytłumaczyć mi to w miarę prosty sposób albo wysłać kod do jakiegoś prostego zadania z tłumaczeniem krok po kroku z listą.

1 odpowiedź

+1 głos
odpowiedź 12 grudnia 2019 przez tangarr Mędrzec (154,780 p.)

Przygotowałem fragment kodu z komentarzami i przyjaznymi nazwami zmiennych.

struct element_listy {
    int wartosc;
    struct element_listy* nastepny;
};

struct lista {
    struct element_listy *pierwszy_element;
};

struct lista *utworz_pusta_liste() {
    struct lista *l = (struct lista*)malloc(sizeof(struct lista));
    l->pierwszy_element = NULL;
    return l;
};

void dodaj_element(struct lista* l, int wartosc) {
    struct element_listy * nowy_element = (struct element_listy*)malloc(sizeof(struct element_listy));
    nowy_element->wartosc = wartosc;
    nowy_element->nastepny = NULL;
    
    if (l->pierwszy_element == NULL) {
        /* jezeli lista jest pusta */
        /* ustawiamy nowy element jako pierwszy element listy */
        l->pierwszy_element = nowy_element;
        return;
    }
    /* szukamy ostatniego elementu listy */
    struct element_listy *element = l->pierwszy_element;
    while (element->nastepny != NULL) {
        element = element->nastepny;
    }
    /* dopisujemy nowy element na koncu listy */
    element->nastepny = nowy_element;
}

/* funkcja usuwa element z listy ale nie niszczy tego elementu */
/* funkcja zwraca 0 w przypdku sukcesu i 1 w przypadku bledu */
int usun_element(struct lista* l, struct element_listy *element_do_usuniecia) {
    if (l->pierwszy_element == NULL || element_do_usuniecia == NULL) {
        /* jezeli lista jest pusta lub przekazemy zly element to konczymy */
        return 1;
    }
    if (l->pierwszy_element == element_do_usuniecia) {
        l->pierwszy_element = l->pierwszy_element->nastepny;
        /* dla bezpieczenstwa 'odlaczamy' element_do_usuniecia od reszty listy */
        element_do_usuniecia->nastepny = NULL;
        return 0;
    }
    /* szukamy poprzedniego elementu na liscie */
    struct element_listy *element = l->pierwszy_element;
    while (element != NULL) {
        if (element->nastepny == element_do_usuniecia) {
            /* znalezlismy poprzednik naszego elementu */
            /* modyfikujemy go tak, zeby wsazywal na element po elemencie do usuniecia */
            element->nastepny = element_do_usuniecia->nastepny;
            /* dla bezpieczenstwa 'odlaczamy' element_do_usuniecia od reszty listy */
            element_do_usuniecia->nastepny = NULL;
            return 0;
        }
        element = element->nastepny;
    }
    /* nie znaleziono elementu w liscie */
    return 1;
}

Powiedz z czym masz problem to postaram ci się to wyjaśnić

komentarz 16 grudnia 2019 przez kaminie318 Bywalec (2,070 p.)
Reszta poza wywoływaniem tych konstruktorów( z którymi jeszcze nie miałem styczności) i dwukropkami tam jest dla mnie jasna i chciałbym dowiedziec sie o co z tym chodzi :)
komentarz 16 grudnia 2019 przez kaminie318 Bywalec (2,070 p.)
Jeszcze wracając do twojego kodu, to bardzo dziękuję za pomoc, jednak na uczelni jeszcze nie przerabialismy programowania obiektowego więc klasy nie wchodzą w grę :/
komentarz 16 grudnia 2019 przez kaminie318 Bywalec (2,070 p.)
Moją ostateczną prośbą byłoby przerobienie tego kodu z forum na taki, pozbawiony tych konstruktorów w strukturach, tylko zrobienie najprostszego kodu obejmującego programowanie proceduralne :)
komentarz 16 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)
A może dasz pomagającemu "strzałkę w górę" w ramach "nieostatecznej prośby"? :)
komentarz 16 grudnia 2019 przez tangarr Mędrzec (154,780 p.)

Przypisywanie 0 do wskaźnika to nic innego niż przypisanie pustego wskaźnika (NULL). Od wprowadzenia standardu C++11 zaleca się używać słowa kluczowego nullptr. Zwiększa ono czytelność kodu i pomaga niknąć pewnych błędów (pomyłek programisty).
Jeżeli nie uczyli was jeszcze programowania obiektowego to najlepiej będzie przerobić mój pierwszy kod z C na C++.

struct ElementListy {
    int wartosc;
    ElementListy* nastepny;
};
 
struct Lista {
    ElementListy *pierwszy_element;
};
 
Lista *nowa_lista() {
    Lista *l = new Lista();
    l->pierwszy_element = nullptr;
    return l;
};
 
void dodaj_element(Lista* l, int wartosc) {
    ElementListy *nowy_element = new ElementListy();
    nowy_element->wartosc = wartosc;
    nowy_element->nastepny = nullptr;
     
    if (l->pierwszy_element == nullptr) {
        /* jezeli lista jest pusta */
        /* ustawiamy nowy element jako pierwszy element listy */
        l->pierwszy_element = nowy_element;
        return;
    }
    /* szukamy ostatniego elementu listy */
    ElementListy *element = l->pierwszy_element;
    while (element->nastepny != nullptr) {
        element = element->nastepny;
    }
    /* dopisujemy nowy element na koncu listy */
    element->nastepny = nowy_element;
}
 
/* funkcja usuwa element z listy ale nie niszczy tego elementu */
/* funkcja zwraca true w przypdku sukcesu i false w przypadku bledu */
bool usun_element(Lista* l, ElementListy *element_do_usuniecia) {
    if (l->pierwszy_element == nullptr || element_do_usuniecia == nullptr) {
        /* jezeli lista jest pusta lub przekazemy zly element to konczymy */
        return false;
    }
    if (l->pierwszy_element == element_do_usuniecia) {
        l->pierwszy_element = l->pierwszy_element->nastepny;
        /* dla bezpieczenstwa 'odlaczamy' element_do_usuniecia od reszty listy */
        element_do_usuniecia->nastepny = nullptr;
        return true;
    }
    /* szukamy poprzedniego elementu na liscie */
    ElementListy *element = l->pierwszy_element;
    while (element != nullptr) {
        if (element->nastepny == element_do_usuniecia) {
            /* znalezlismy poprzednik naszego elementu */
            /* modyfikujemy go tak, zeby wsazywal na element po elemencie do usuniecia */
            element->nastepny = element_do_usuniecia->nastepny;
            /* dla bezpieczenstwa 'odlaczamy' element_do_usuniecia od reszty listy */
            element_do_usuniecia->nastepny = nullptr;
            return true;
        }
        element = element->nastepny;
    }
    /* nie znaleziono elementu w liscie */
    return false;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 252 wizyt
pytanie zadane 24 stycznia 2021 w C i C++ przez Roberto12 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 280 wizyt
pytanie zadane 27 stycznia 2019 w C i C++ przez gooster88 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 98 wizyt
pytanie zadane 31 stycznia 2018 w C i C++ przez Krystek102 Bywalec (2,440 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...