1

Тема: Черга і одосвязний список

class Client
{
private:
    char *firstname;
    char *name;
    int number;
    int year;
    int money;
public:
    Client ();
    Client & operator= (const Client & other);
    void setFirstName ();
    void setMoney ();
    void setName ();
    void setNumber ();
    void setYearsInBank ();
    int getPutMoney ();
    int getRemovedMoney ();
    void showClientInfo ();
    ~Client ();
};
Client::Client ()
{
    this->firstname=new char [100];
    this->name=new char [100];
    this->number=this->year=this->money=0;
}
Client &Client::operator= (const Client &cl)
{
     {
        if (this != &cl)
        {
           strcpy(firstname, cl.firstname);
           strcpy(name, cl.name);
           number = cl.number;
           year = cl.year;
        }
        return *this;
    }
}
void Client::setFirstName ()
{
    cout<<"Firstname: ";
    cin>>this->firstname;
}
void Client::setMoney ()
{
    this->money=rand ()%1000-200;
    if (this->money>0)
        putMoney+=this->money;
    else
        removedMoney-=this->money;
}
int Client::getPutMoney ()
{
    return putMoney;
}
int Client::getRemovedMoney ()
{
    return removedMoney;
}
void Client::setName ()
{
    cout<<"Name: ";
    cin>>this->name;
}
void Client::setNumber ()
{
    static int _number=1;
    this->number=_number;
    _number++;
}
void Client::setYearsInBank ()
{
    this->year=rand()%12;
}
void Client::showClientInfo ()
{
    cout<<"--------------------------------"<<endl;
    cout<<"Firstname: ";
    cout<<this->firstname<<endl;
    cout<<"Name: ";
    cout<<this->name<<endl;
    cout<<"Number: ";
    cout<<this->number<<endl;
    cout<<"Years in bank: ";
    cout<<this->year<<endl;
    cout<<"Money: ";
    cout<<this->money<<endl;
}
Client::~Client ()
{
    delete this->firstname;
    delete this->name;
}
class Queue
{
private:
    Client *obj;
    int maxSize;
    int currentSize;
    int priority;
public:
    Queue ();
    bool full();
    bool empty();
    int getSize ();
    void push (const Client &cl);
    void show();
    void pop();
    void submitted ();
    void removed ();
    void top();
    ~Queue ();
};
Queue::Queue()
{
    this->maxSize = 10;
    this->obj = new Client[this->maxSize];
    this->currentSize = 0;
}
bool Queue::full()
{
    return this->currentSize == this->maxSize;
}
bool Queue::empty()
{
    return this->currentSize == 0;
}
int Queue::getSize ()
{
    return this->currentSize;
}
void Queue::push(const Client &cl)
{
    this->obj[currentSize] = cl;
    currentSize++;
}
void Queue::show()
{
    for(int i = 0; i < currentSize; i++)
        obj[i].showClientInfo() ;
}
void Queue::pop()
{
    if (!empty()){
        for (int i = 1;i<this->currentSize;i++)
            obj[i - 1] = obj[i];
        this->currentSize--;
    }
}
void Queue::top()
{
    obj[currentSize-1].showClientInfo ();
}
Queue::~Queue ()
{
    delete [] obj;
}
 
struct Listitem
{
    Client *obj;
    Listitem *pNext;
};
class List
{
private:
    Listitem *head;
    Listitem *tail;
    int count;
public:
    List ();
    void add (const Client &cl);
    void clearList ();
    void showList ();
    ~List ();
};

Мені потрібно якось зробити щоб після виклику методу pop (); Клієнт потрапив у однозв'язний список , у мене не виходить написати метод add (); Допоможіть будь ласка.

2

Re: Черга і одосвязний список

Ваш код не компілюється. І хто викликає add чи pop?

void Queue::pop()
{
    if (!empty()){
        for (int i = 1;i<this->currentSize;i++)
            obj[i - 1] = obj[i];
        this->currentSize--;
    }
}
void Queue::top()
{
    obj[currentSize-1].showClientInfo ();
}

Не можу зрозуміти зв'язки цих двох методів, адже top має видавати той елемент який викидає pop. А у вас pop викидає нульовий елемент, а top показує, я так розумію, останній?

3 Востаннє редагувалося roman-skeba (09.01.2016 15:05:28)

Re: Черга і одосвязний список

На метод

void Queue::top()
{
    obj[currentSize-1].showClientInfo ();
}

не звертайте увагу, я у void main, викликаю метод pop (); Він повинен видалити першого клієнта в черзі і добавити його в односвязний список, а я не розумію як це зробити, дуже багато коду перепробував і в мене не получилося. Потім якщо я ще раз викличу метод pop (); він видалить другого клієнта і запишить в список і так дальше.

4 Востаннє редагувалося Yola (09.01.2016 17:09:51)

Re: Черга і одосвязний список

Якщо проблема полягає в реалізації метода List::add, то він може виглядати так:

void List::add(const Client &cl)
{
    Client *new_cl = new Client;
    *new_cl = cl;
    tail = new Listitem{ new_cl, nullptr };
}
Прихований текст
roman-skeba написав:

На метод Queue::top() не звертайте увагу

Якщо ви програмуєте стек, то ви повинні дотримуватись логічних правил стека, інакше все пропало, без жартів.

5 Востаннє редагувалося Дмитро-Чебурашка (09.01.2016 17:48:46)

Re: Черга і одосвязний список

Вітання! Я початківець, я побіжно та вкрай неповно знайомий з мовою. Багато чого я не торкнувся, дечого торкнувся побіжно, де-не-де, може, припустився неясності у вивченні Я навряд чи чимось то допоможу. Якщо тобі особисто не в лом, повідповидай мені на запитання, якщо забажаєш

Мене якось трохи плутає obj
obj це покажчик на об'єкт, сама назва говорить про це, так? Я чомусь чекав побачити конкретне надання значення
по цьому покажчику, наприклад може obj = &Client або

char *buffer = new char[sizeof (Client)]; // виділяєм пам'ять пів об' єкт
Client *cl _ p = new (buffer) Client (); // розміщуємо у виділеному буфері об' єкт


/ * ... * /
cl_p-> ~ Client (); // явно віклікаємо деструктор об'єкту
delete [] buffer; // вивільнюємо виділену раніше пам'ять



Поясни мені що таке Клієнт потрапив у однозв'язний список, якщо це можна пояснювати у рамках форуму та нашого спілкування, звичайно.
Мені буде приємно якщо ти викладеш увесь код, я спробую з ним працювати!

Після перебою зі світлом закрилося близько тридцяти вкладинк відкритих у нотепаді. Фантастично незручно,  я тепер три години не можу нічого знайти.
У мене на робочому столі та й не тільки сила силена тек, де та що взагали незрозумило, все як то корова язиком злизнула, ничого не в змозі відшукати.

6 Востаннє редагувалося Yola (10.01.2016 09:24:34)

Re: Черга і одосвязний список

Якщо ви про це

tail = new Listitem{ new_cl, nullptr };

то це те саме, що й

tail = new Listitem;
tail->obj = new_cl;
tail->pNext = nullptr;
Прихований текст
Дмитро-Чебурашка написав:

char *buffer = new char[sizeof (Client)]; // виділяєм пам'ять пів об' єкт
Client *cl _ p = new (buffer) Client (); // розміщуємо у виділеному буфері об' єкт


/ * ... * /
cl_p-> ~ Client (); // явно віклікаємо деструктор об'єкту
delete [] buffer; // вивільнюємо виділену раніше пам'ять

Навіщо ви це робите, чому не зробити просто

Client *cl _ p = new Client();
...
delete cl_p;

Тобто так як ви теж можна, але так роблять дуже рідко, наприклад, коли потрібно виділити пам'ять, але не ініціалізовувати її одразу, так робить std::vector.