[C++]Sprawdzenie poprawności kodu.
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

[C++]Sprawdzenie poprawności kodu.

AutorWiadomość
Temat założony przez niniejszego użytkownika
[C++]Sprawdzenie poprawności kodu.
» 2018-08-15 21:56:43
Witam wszystkich,
przerabiam kurs C++ dostępny na owej witrynie i ostatnio natknąłem się na temat wskaźników, struktur i dynamicznej alokacji pamięci. Samodzielnie napisałem program implementujący stos. Zdaję sobie sprawę, że istnieją gotowe biblioteki, jednak zależy mi na zrozumieniu jak ta struktura działa. Chciałbym prosić kogoś doświadczonego o sprawdzenie poprawności kodu(przede wszystkim czy nie ma nigdzie wycieków pamięci). Nie jestem jeszcze na tyle daleko w kursie, dlatego wykorzystałem w tym celu struktury a nie klasy.

C/C++
#include "stdafx.h"
#include <iostream>
#include "conio.h"


// Deklaracja struktury

struct Stack {
   
    int m_value;
    Stack * m_next;
   
};

// Dodaj na stos

void push( Stack *& top, int value ) {
   
    Stack * temp = new Stack;
   
    temp->m_value = value;
    temp->m_next = top;
    top = temp;
   
}

// Wyświetl stos

void print( Stack * top ) {
   
    while( top != nullptr ) {
       
        std::cout << top->m_value << "\n";
        top = top->m_next;
       
    }
}

// Zdejmij ze stosu

void pop( Stack *& top ) {
   
    Stack * temp = top;
   
    if( temp ) {
       
        top = nullptr;
        top = temp->m_next;
        delete temp;
       
    }
   
    return;
   
}

// Czy pusty (tak - 1, nie - 0)

bool empty( Stack * top ) {
   
    if( top != nullptr )
         return false;
   
    return true;
}

// Zwraca wielkość stosu

int size( Stack * top ) {
   
    int i = 0;
   
    while( top != nullptr ) {
       
        top = top->m_next;
        i++;
    }
   
    return i;
}

int main() {
   
    Stack * top = nullptr; // wierzchołek
   
    std::cout << "Size: " << size( top ) << "\nEmpty: " << empty( top ) << "\n\n"; // Output: Size: 0, Empty: 1
   
    push( top, 7 );
    push( top, 22 );
    push( top, 54 );
    push( top, 81 );
   
    print( top ); // Output: 81, 54, 22, 7
   
    std::cout << "\nSize: " << size( top ) << "\nEmpty: " << empty( top ) << "\n"; // Output: Size: 4, Empty: 0
   
    pop( top ); // zdejmuję 81 ze stosu
   
    std::cout << "\n";
    print( top ); // Output: 54, 22, 7
   
    std::cout << "\nSize: " << size( top ) << "\nEmpty: " << empty( top ) << "\n"; // Output: Size: 3, Empty: 0
   
   
    /* edit
           
    podziękowania dla użytkownika pekfos
           
    */
   
    while( !empty( top ) )
         pop( top );
   
    _getch();
   
   
   
    return 0;
}
P-172117
» 2018-08-15 22:27:04
Nie ma niszczenia stosu na koniec programu, więc jest wyciek pamięci, jeśli stos nie jest wtedy pusty.
P-172118
Temat założony przez niniejszego użytkownika
» 2018-08-15 22:35:29
@up

Dziękuje za pomoc. Poprawiłem! :)
P-172119
» 2018-08-15 22:37:53
To nie jest poprawione.
P-172120
Temat założony przez niniejszego użytkownika
» 2018-08-15 22:40:33
@up

A mógłbyś mnie nakierować w jaki sposób powinienem to zrobić? Wskaźniki i dynamiczna alokacja pamięci to dość trudny dla mnie temat i właśnie staram się go opanować.
P-172121
» 2018-08-15 22:41:57
Myślisz w zupełnie złym kierunku.
C/C++
while( !empty( top ) )
     pop( top );
P-172122
Temat założony przez niniejszego użytkownika
» 2018-08-15 22:50:06
@up

Faktycznie, przeanalizowałem jeszcze raz cały program i zrozumiałem o co Panu chodziło oraz zrozumiałem swój błąd. Ponownie dziękuje.
P-172123
« 1 »
 Strona 1 z 1