Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2016, 16:04   #1
ANTON255200
Пользователь
 
Регистрация: 09.12.2012
Сообщений: 15
По умолчанию Очередь на C++ через связный список

Задача в названии темы.
Возможные команды для программы:

• enqueue n Добавить в очередь число n (1 ≤ n ≤ 10^9). Программа должна вывести ok.

• dequeue Удалить из очереди последний элемент. Программа должна вывести его значение.

• front Программа должна вывести значение первого элемента, не удаляя его из очереди.

• size Программа должна вывести количество элементов в очереди.

• clear Программа должна очистить очередь и вывести ok.

Перед исполнением операций front и dequeue программа должна проверять, содержится ли в очереди хотя бы один элемент. Если во входных данных встречается операция front или dequeue, и при этом очередь пуста, то программа должна вместо числового значения вывести строку error.

Реализовать нужно именно через список.

Вот мой код.
Код:
#include <iostream>
#include <cstdlib>
#include <cstring>
 
using namespace std;
 
typedef struct node_str{
    long value;
    struct node_str *next, *prev;
} node;
 
typedef struct queue_str{
    node* first;
    node* last;
} my_queue;
 
inline bool empty_queue(my_queue*);
void enqueue(my_queue*, long);
long dequeue(my_queue*);
long front(my_queue);
size_t size(my_queue);
void clear(my_queue*);
 
int main()
{
    int n;
    my_queue q;
    q.first = NULL;
    q.last = NULL;
    cin >> n;
    for (int i = 0; i < n; i++){
        char command[15];
        cin >> command;
        if (!strcmp(command, "enqueue")){
            int v;
            cin >> v;
            enqueue(&q, v);
        }
        else if (!strcmp(command, "dequeue")){
            long p = dequeue(&q);
            if(p){
                cout << p;
            }
            else
                cout << "error";
            cout << endl;
        }
        else if (!strcmp(command, "front")){
            if (front(q))
                cout << front(q);
            else
                cout << "error";
            cout << endl;
        }
        else if (!strcmp(command, "size")){
            cout << size(q) << endl;
        }
        else if (!strcmp(command, "clear")){
            clear(&q);
        }
    }
    return 0;
}
 
void create_queue(my_queue* q){
    q->first = NULL;
    q->last = NULL;
}
 
inline bool empty_queue(my_queue q){
    return (q.first == NULL);
}
 
void enqueue(my_queue* q, long x){
    node* new_node;
    new_node = new node;
    new_node->value = x;
    new_node->next = NULL;
    new_node->prev = q->last;
    if(q->last)
        q->last->next = new_node;
    q->last = new_node;
    if (empty_queue(*q))
        q->first = q->last;
    cout << "ok" <<endl;
}
 
long dequeue(my_queue* q){
    if (empty_queue(*q))
        return 0;
    node* first_node = q->first;
    long v = first_node->value;
    q->first = first_node->next;
    if(!empty_queue(*q))
        q->first->prev = NULL;
    else
        q->last = NULL;
    delete first_node;
    return v;
}
 
long front(my_queue q){
    if (empty_queue(q)){
        return 0;
    }
    else
        return (q.first->value);
}
 
size_t size(my_queue q){
    size_t size_queue = 0;
    while (q.first){
        q.first = q.first->next;
        size_queue++;
    }
    return size_queue;
}
 
void clear(my_queue* q){
    node* prev;
    if (!empty_queue(*q)){
        while(q->first->next){
            prev = q->first;
            q->first = q->first->next;
            delete prev;
        }
        delete q->first;
        q->first = NULL;
    }
    if (q->last != NULL){
        delete q->last;
        q->last = NULL;
    }
    cout << "ok" << endl;
}
Он летит по памяти уже на 4 тесте. Что с ним не так?
Возможно тут еще что-то криво (неэффективно, и т. д.) написано, поправьте, пожалуйста, буду благодарен.
ANTON255200 вне форума Ответить с цитированием
Старый 05.12.2016, 18:24   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

В чём программируешь? Среда какая?
ura_111 вне форума Ответить с цитированием
Старый 05.12.2016, 18:51   #3
ANTON255200
Пользователь
 
Регистрация: 09.12.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
В чём программируешь? Среда какая?
Написал в названии темы. С++, среды разные есть. VS, CodeBlocks, DevC++
ANTON255200 вне форума Ответить с цитированием
Старый 05.12.2016, 19:12   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Знаешь про отладку что-нибудь?
ura_111 вне форума Ответить с цитированием
Старый 05.12.2016, 19:16   #5
ANTON255200
Пользователь
 
Регистрация: 09.12.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Знаешь про отладку что-нибудь?
знаю, что есть, но плохо умею юзать. Имхо, не такая удобная как в питоне
ANTON255200 вне форума Ответить с цитированием
Старый 05.12.2016, 19:28   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Заводи VS.
1) Поставь точку останова в предполагаемом проблемном участке. Точка останова (красненькая такая) ставиться так:

1.jpg

2.jpg


Работай с программой, пока желтая стрелка не будет на точке останова.

3.jpg


Покажи скрин-шот.
ura_111 вне форума Ответить с цитированием
Старый 05.12.2016, 19:37   #7
ANTON255200
Пользователь
 
Регистрация: 09.12.2012
Сообщений: 15
По умолчанию

Вот.
Изображения
Тип файла: jpg Снимок.jpg (100.7 Кб, 126 просмотров)
ANTON255200 вне форума Ответить с цитированием
Старый 05.12.2016, 19:43   #8
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я же сказал, в предполагаемом проблемном участке (у тебя здесь проблемы?).

1) Посмотри на значение переменной "q" (просто на неё наведи мышкой)
2) Останови отладку и удали эту точку останова

4.jpg

5.jpg


3) Поставь точку останова там где предполагаемая ошибка . Дальше работаешь с консолью как обычно (постоянно следи за точкой останова - есть ли на ней желтая стрелка). Если ошибка выскочит раньше - останови отладку и момести точку останова выше по коду.
ura_111 вне форума Ответить с цитированием
Старый 05.12.2016, 19:52   #9
ANTON255200
Пользователь
 
Регистрация: 09.12.2012
Сообщений: 15
По умолчанию

Сама программа нормально компилится и даже корректно работает. При попытке сдать в систему - лимит памяти.
ANTON255200 вне форума Ответить с цитированием
Старый 05.12.2016, 19:53   #10
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А что такое: "сдать в систему"
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связный список InKo1 Помощь студентам 0 22.12.2011 02:08
Связный список GripEnemy Visual C++ 2 08.12.2011 16:19
Связный список batman01 Общие вопросы C/C++ 1 15.10.2011 01:31
связный список xeops Visual C++ 6 30.09.2011 09:39
Связный список С++ Шёпот Общие вопросы C/C++ 2 01.04.2011 22:56