Program realizujący Kolejkę

0

Witam.
Mam do napisania program realizujący kolejkę. Programowi mam podawać prawdopodobieństwo p, jeżeli p mniejsze od losowe liczby z zakresu 0-100 to przychodzi klient jeżeli nie to jeden odchodzi z kolejki. Napisałem program według schematu który dostałem i wskazówek lecz program wywala się nie mam pojęcia dlaczego proszę o pomoc.

 
#include <iostream>
#include <stdio.h>
#include <ctime>

using namespace std;

struct Klient 
{
	int IdOsoby;
	Klient *wsk;
};

class Kolejka 
{
private:
	Klient *pierwszy;
	Klient *ostatni;
public:
	Kolejka()
	{
		pierwszy = 0;
		ostatni = 0;
	}

	~Kolejka()
	{
		Klient *tmp;
		while(pierwszy != 0)
		{
			tmp = pierwszy;
			pierwszy = pierwszy ->wsk;
			delete tmp;
		}
	}

	bool Przyszedl(const int & ID)
	{
		Klient *nowy = new Klient();
		if(nowy == 0) 
			return 0;
		nowy->IdOsoby = ID;
		nowy->wsk = NULL;
		if(pierwszy = NULL)
			pierwszy = nowy;
		else
		{
			ostatni->wsk = nowy;
		}
		ostatni = nowy;

	printf("Klient o ID: %i staje w kolejce.", ID);

		return 1;
	}

	bool Wyszedl(/*const int & ID*/)
	{
		if(pierwszy == NULL)
			return 0;
		int ID = pierwszy->IdOsoby;
		Klient *tmp = pierwszy;
		pierwszy = pierwszy->wsk;
		delete tmp;
		if(pierwszy == NULL)
			ostatni = NULL;

		printf("Klient o ID: %i wychodzi z kolejki i udaje sie do okienka.", ID);

		return 1;
	}
};

int main()
{

	Kolejka *wsk = new Kolejka();
	srand(time(NULL));
	int p;
	int identyfikator = 1;

	do{
		scanf("%i", &p);
	}while(p>100 || p<0);

	do
	{
		if(rand() % 100 < p)
		{
			wsk->Przyszedl(identyfikator);
			identyfikator += 1;
		}
		else
		{
			wsk->Wyszedl();
		}

		_sleep(1000);
	}while(1);
	
	system("pause");
	return 0;
}
0

Odpal debugger i zobacz gdzie sie wywala ;] Zapewne robisz delete na jakimś nullu.

0

w metodzie przyszeld nie oplaca sie przekazywac tam id przez referencje, lepiej zostaw po prostu const id oraz: if(pierwszy = NULL) powinno być podwójne ==

0

Masz chorą mieszankę C z C++. Rozważ takie coś:

#include <iostream>
#include <cstdlib>
#include <ctime> 
using namespace std;
 
class Kolejka 
  {
   private:
   struct Klient
     {
      unsigned Id;
      Klient *nastepny;
      Klient(unsigned Id):Id(Id),nastepny(0) {}
      Klient *drop() { Klient *ret=nastepny; delete this; return ret; }
     }; 
   Klient *pierwszy,*ostatni;
   static unsigned SId;
   public:
   Kolejka():pierwszy(0),ostatni(0) {}
   ~Kolejka() { while(pierwszy) pierwszy=pierwszy->drop(); }
   unsigned Przyszedl() { return (ostatni=(ostatni?ostatni->nastepny:pierwszy)=new Klient(++SId))->Id; }
   unsigned Wyszedl()
    {
     if(!pierwszy) return 0;
     unsigned Id=pierwszy->Id;
     if(!(pierwszy=pierwszy->drop())) ostatni=0;
     return Id;
    }
  };
unsigned Kolejka::SId=0;
 
int main()
  {
   srand(time(0));
   Kolejka K;
   while(true)
     {
      cout<<"podaj prawdopodobenstwo w %: ";
      int p;
      if((cin>>p)&&(0<=p)&&(p<=100))
        {
         while(true)
           {
            if(rand()%100<p)
              {
               try
                 {
                  cout<<"Przyszedl: "<<K.Przyszedl()<<endl;
                 }
               catch(...) { cout<<"Brak pamieci"<<endl; break; }
              }
            else cout<<"Wyszedl: "<<K.Wyszedl()<<endl;
           }
         break;
        }
      else
        {
         cin.clear();
         cout<<"Ma byc liczba"<<endl;
        }
      cin.sync();
     }
   cin.sync();
   cin.get();
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1