Nowe posty

Autor Wątek: Lista  (Przeczytany 2812 razy)

Edzio123

  • Gość
Lista
« dnia: 2014-02-11, 09:09:24 »
Oto moje pierwsze podejscie do listy.
#include
using namespace std;

class List{

    struct Node{
        int data;
        Node *next;
    };

    Node *head;

    public:
        List(){
            head = NULL;
        }

        ~List(){
            while(head != NULL){
                Node *n = head -> next;
                delete head;
                head = n;
            }
        }

        void add(int value){
            Node *n = new Node;
            n->data = value;
            n->next = head;
            head = n;
        }


        void show_list(){
            Node *temp = head;
                for (int i = 0; i < 2; i++){
                cout << temp -> data << endl;
            }
        }

};

int main(){
    List First;
    First.add(4);
    First.add(5);
    First.show_list();
}
Zastanawiam sie jak mam wyświelic cala listłę. Majac 2 elementy otrzymuje efekt: 5 5.
Czy mogę procić o jakieś wskazówki?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3059
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Lista
« Odpowiedź #1 dnia: 2014-02-11, 09:40:05 »
W show list nie przestawiasz temp na następny element. Dodatkowo FOR nie bardzo pasuje w tej postaci do list.

Lepiej tak:
void show_list(){
            Node *temp = head;
            while(temp != NULL){
                cout << temp -> data << endl;
                temp = temp->next;
            }
        }
Pamiętaj, że lista w tej postaci działa jak stos (wciskasz nowy na początek), więc wyświetli elementy w kolejności odwrotnej do wstawiania.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Edzio123

  • Gość
Lista
« Odpowiedź #2 dnia: 2014-02-11, 12:56:49 »
Wielkie dzięki za wskazanie błędu. Próbuje zmienić funkcję dodawania, tak by mój program wrzucał element na koniec listy:
void add(int value){
            Node *temp1 = head;    
            while(temp1->next!=NULL) //go to the last node
                temp1 = temp1->next;
       
            Node *temp;
            temp->data = value;
            temp->next = NULL;
            temp1->next = temp;
        }
Jednakże wyskakuje problem z pamięcią. Coś wychodzi poza zakres, ale niestety nie widzę co.
Jeszcze takie techniczne pytanie, czy dla temp i temp1 powwina być dyanmicznie zaalokowana pamięć?

snajper_8383

  • Gość
Lista
« Odpowiedź #3 dnia: 2014-02-11, 14:14:42 »
Zmiennej temp przydziel pamięć. W poprzedniej funkcji add to robiłeś, dlaczego tu tego nie robisz? temp jest pustym wskaźnikiem.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3059
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Lista
« Odpowiedź #4 dnia: 2014-02-11, 22:22:10 »
Tak jak pisze kolega Snajper, zgubiłeś malloca.

Dodatkowo takie wstawianie jest O(n). Jak sobie zapamiętasz w klasie wskaźnik na ostatni element i będziesz poprawiał po każdym wstawieniu,  to wstawianie będziesz miał O(1). Dodajesz tylko ten jeden wskaźnik, nie zmieniasz struktury węzła, nie robisz listy podwójnie wiązanej.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy