Mierzenie czasu dodania elementu do listy C++

jaco_88
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 22 mar 2009, o 23:59
Płeć: Mężczyzna

Mierzenie czasu dodania elementu do listy C++

Post autor: jaco_88 »

Mam problem:) Program mierzy czas dodania pojedyńczego węzła do listy jednokierunkowej - 10000 list i każdej dopisuje jednen węzeł. Dlaczego program działa poprawnie dla 50 elementow, a przy wprowadzeniu 60 elementowych list wszystko się 'sypie'. Jedyne moje przypuszczenie to brak RAMu - ale nie jestem o tym przekonany...

Plik naglowek.h

Kod: Zaznacz cały

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
const int ILOSC = 10000;

class Node
{
      private:
         int liczba;
         Node *next;
      public:
         Node(int i) { liczba = i; next = NULL; }
         int Liczba() { return liczba; }
         Node * Next() { return next; }
         void changeNext(Node * n) { next = n; }
};

class List
{
      private:
         Node * L;
      public:
         List() { L = NULL; }
         ~List() { removeallNode (); }
         void addNode(Node * n); //dodaje wezel n na początek listy
         void printNode(); //drukuje listę
         void removeallNode(); //usuwa całą listę
         Node * locateNode(int i); //zwraca wskaźnik do wezla zawierającego wartość i
};
plik modul.cpp

Kod: Zaznacz cały

#include "naglowek.h"
using namespace std;

// metody klasy Listy
void List::addNode(Node * n)   //dodaje wezel n na początek listy
{
     n->changeNext (L);
     L = n;
}

void List::printNode() //drukuje listę
{
     Node *q;
     q = L;
     while (q != NULL)
     {
        cout << q -> Liczba() << endl;
        q = q -> Next();
     }
}

void List::removeallNode()   //usuwa całą listę
{
     Node * q;
     while (L != NULL)
     {
        q = L;
        L = L->Next();
        delete q;
     }
}

Node * List::locateNode(int i)   //zwraca wskaźnik do wezla zawierającego wartość i
{
     Node *q;
     q = L;
     while ((q != NULL) && (q -> Liczba() != i)) 
        q = q -> Next ();
return q;
}

// funkcja interfejsu uzytkownika
void menu()
{
 cout << "****************************\n"
      << "* Lista pojedynczo wiazana *\n"
      << "****************************\n"
      << "\n\n1 - dodawanie liczby na poczatek listy\n"
      << "0 - wyjscie z programu\n"
      << "Twoj wybor?\t";
}
Plik main.cpp

Kod: Zaznacz cały

#include "naglowek.h"
using namespace std;
void menu();

int main()
{
    ofstream Wy;
    Wy.open("czasy.txt");
    Wy << "Dodaje element na poczatek listy:\n";
    Wy << "Ilosc elementow:               Czas trwania pojedynczej operacji:\n";
    
    int wybor, liczba;
    List lista[ILOSC];
    clock_t time1, time2;
    
    do
    {
      menu();
      cin >> wybor;
    
      if (wybor == 1)
      {
         cout << "\n\nPodaj ilosc elementow listy:\t";
         cin >> liczba;
         Node * q[ILOSC][liczba];
         for (int j = 0; j < ILOSC; ++j)
             for (int i = 0; i < liczba; ++i)
             {
                 q[j][i] = new Node(i);
                 lista[j].addNode(q[j][i]);
             }
         
         Node * dodaj[ILOSC];
         
         time1 = clock();
         for (int i = 0; i < ILOSC; ++i)
         {
             dodaj[i] = new Node(1000);
             lista[i].addNode(dodaj[i]);
         }
         time2 = clock();
         
         double czas = double ((time2-time1)/CLOCKS_PER_SEC);
         cout << "Czas wykonania operacji dodania elementu dla " << ILOSC << " list: " << czas  << endl;
         cout << "Czas wykonania pojedynczej operacji dodania: " << czas / ILOSC << endl; 
         Wy << liczba << "                          " << czas / ILOSC << endl;
        
         for (int i = 0; i < ILOSC; ++i)
            lista[i].removeallNode();
      }
   cin.get();
   cin.get(); 
   system ("CLS");
   }
   while (wybor != 0);
   
   cout << "Program zakonczony.\n";
   return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Mierzenie czasu dodania elementu do listy C++

Post autor: soku11 »

Powiem szczerze - kod bardzo dziwny i w dodatku jak dla mnie brzydko napisany :/
Po pierwsze - radze uzywac debuggera. On przewaznie rozwiazuje wszystkie problemy.
Po drugie - nie uzywaj lepiej funkcji system. Zalezy ona jak sama nazwa wskazuje od systemu na ktorym jest uzywana.
Po trzecie - po co uzywasz std::endl skoro jest zwykle "\n", ktore ne wypycha danych do strumienia?
Po czwarte - uzywasz tablic o zmiennych rozmiarach, co nie jest zgodne z ISO C++. O tutaj:

Kod: Zaznacz cały

Node * q[ILOSC][liczba];
I nie mam pojecia wogole po co taka konstrukcja tutaj... Nie wystarczy zrobic tak:

Kod: Zaznacz cały

Node* q=NULL;
for(int j=0;j<ILOSC;++j)
             for(int i=0;i<liczba;++i)
             {
               q=new Node(i);
               lista[j].addNode(q);
             }
?
Po piate - twoje 'sypie sie' moze oznaczac bardzo duzo. Program przestaje odpowiadac? Dostajesz segfaulta? Pojawia sie jakis assert/inny komunikat?

Pozdrawiam.
ODPOWIEDZ