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

Tworzenie i aktualizowanie elementu listy jednokierunkowej

Cloud VPS
0 głosów
394 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez Agnes Użytkownik (990 p.)

Chcę, żeby funkcja aktualizowała pole struktury o nazwie a. Kiedy chcę wyświetlić to pole po aktualizacji dostaję jakąś randomową wartość. Przy okazji powiedzcie, czy moje komentarze mają sens. Dopiero się uczę i są to takie jakby notatki, które mają pokazywać czy dobrze wszystko rozumiem.

#include <cstdio>
#include <string>
#include <iostream>

using namespace std;

//LISTA JEDNOKIERUNKOWA POWIĄZANA	

//"szablon" elementu
struct element
{
	int a;
	element* NextElement;	//CHYBA tak można, bo kompilator rozumie, że to jest tylko szablon, dlatego dopuszcza niezainicjalizowany wskaźnik?
};
//zmienna, która jest wskaźnikiem na początek listy
element* w_lista = NULL;
//funkcja, która tworzy nowy element listy
element* create(int b, element* NewElement)
{
	NewElement = new element;	//stworzenie nowego elementu i przypisanie go do wskaźnika na niego
	NewElement->a = b;
	w_lista = NewElement;				//w ten sposób element jest pierwszy na liście
	NewElement->NextElement = w_lista;	//wskaźnik na "nową" mniejszą listę
										//jakby to był NULL i trzeba byłoby dodać nowy element to nie dostanę
										//się już do tego pola, by zaktualizować je, by wskazywało na następny nowy element
										//to nie jest lista dwukierunkowa
	return w_lista;			//funkcja zwraca całą zaktualizowaną listę obiektowi, który ją wywołał
}

int main()
{
	element* zaktualizowanyElement = new element;
	create(10, zaktualizowanyElement);
	cout << zaktualizowanyElement->a;

	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 20 stycznia 2020 przez tangarr Mędrzec (155,180 p.)

Niestety nie zrozumiałeś tematu.
Na początku programu tworzysz niezainicjalizowaną zmienną zaktualizowanyElement. Składowe tej zmiennej posiadają "losowe" wartości. Następnie przy pomocy funkcji create olewasz wskaźnik przekazany z funkcji main i przypisujesz do niego nowy niezainicjalizowany element. Następnie ustawiasz pole a w nowej (lokalnej) zmiennej. W kolejnej linijce powodujesz efekt uboczny przypisując lokalną zmienną do globalnej zmiennej w_lista. Tylko dzięki temu przypisaniu nie powodujesz wycieku pamięci wychodząc z funkcji create. W kolejnej linijce dokonujesz zapętlenia listy przypisując wskaźnik na listę do zmiennej NextElement.
Po wykonaniu instrukcji z linii 33 posiadasz dwa obiekty struktury element. Oryginalny niezainicjalizowany lokalny obiekt zaktualizowanyElement oraz globalny zapętlnowy obiekt w_lista zawierający wartość 10.

Poniżej poprawiony kod realizujący listę jednokierunkową.

#include <iostream>
 
using namespace std;
 
// definicja struktury Element
// domyślny konstruktor tworzy obiekt niezainicjowany danymi
// dlatego zaleca się inicjalizację przy pomocy listy inicjalizacyjnej
// Element element{666, nullptr}
struct Element
{
    int value;
    Element* nextElement;
};

// funkcja tworząca nowy Element
Element *create(int value) {
    return new Element{value, nullptr};
}

// funkcja zwracająca ostatni Element na liście
Element *lastElement(Element *list) {
    if (list == nullptr)
        return nullptr;
    auto last = list;
    while (last->nextElement != nullptr) {
        last = last->nextElement;
    }
    return last;
}

// funkcja dodająca nowy element do końca listy
bool addNewElementToList(Element *list, int value) {
    auto last = lastElement(list);
    if (last == nullptr)
        return false;
    auto newElement = create(value);
    last->nextElement = newElement;
    return true;
}

// funkcja wypisująca listę na ekran
void printList(Element *list) {
    cout << "List:";
    auto element = list;
    while (element != nullptr) {
        cout << " " << element->value;
        element = element->nextElement;
    }
    cout << endl;
}

int main()
{
    Element *list = create(10);
    printList(list);
    addNewElementToList(list, 20);
    printList(list);
    list->value = 30;
    printList(list); 
    return 0;
}

 

Podobne pytania

+2 głosów
2 odpowiedzi 185 wizyt
0 głosów
2 odpowiedzi 850 wizyt
0 głosów
1 odpowiedź 826 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)

93,482 zapytań

142,415 odpowiedzi

322,761 komentarzy

62,895 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

Kursy INF.02 i INF.03
...