Форум программистов, компьютерный форум CyberForum.ru

Программная реализация очереди - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 95, средняя оценка - 4.92
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:06     Программная реализация очереди #1
Друзья, подскажите, почему не правильно работает программа, ругается на функцию EmptyQ
программу надо запускать в консольном приложении в VS 2008


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include "locale.h"
 
struct QUEUE //структура очередь
{
    int info;
    QUEUE *next;
}
 
int EmptyQ(QUEUE *first) //проверка пустоты очереди
{
    if (first->next==NULL)
    return 1;
    else
    return 0;
}
 
void AddQ(QUEUE **last) //добавление элемента
{
    QUEUE *tmp = new QUEUE;
    tmp->info=rand()%100;
    tmp->next=NULL;
    (*last)->next=tmp;
    *last=tmp;
}
 
void DelQ(QUEUE *first, QUEUE **last) //удаление из очереди
{
    QUEUE *tmp=first->next;
    if(first->next==NULL)
    *last=first;
    delete tmp;
}
 
void ShowQ(QUEUE *first) //просмотр очереди
{
    QUEUE *tmp=first->next;
    while(tmp!=NULL)
    {
        printf("%d ", tmp->info);
        tmp=tmp->next;
    }
}
 
void ClearQ(QUEUE **first, QUEUE **last) //очистка очереди
{
    QUEUE *tmp;
    while(first->next!=NULL)
    {
        tmp=first->next;
        first->next = first->tmp;
        delete tmp;
    }
    *last=first;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    QUEUE *first, *last;
    int n;
    char d;
    do
    {
        printf("1. Добавление элементов в конец очереди \n");
        printf("2. Удаление элемента из начала очереди \n");
        printf("3. Вывод элементов \n");
        printf("0. Выход \n");
        printf("Выбранное действие: ");
        scanf("%s", &d);
        switch(d)
        {
            case '1':
            AddQ(&last);
            printf("\nЭлемент добавлен в конец очереди \n");
            break;
 
            case '2':
            if (EmptyQ(first)==1)
            printf("\nОчередь пустая \n");
            else
            {
                DelQ(first,&last);
                printf("\nЭлемент удален из очереди \n");
            }
            break;
 
            case '3':
            if (EmptyQ(first)==1)
            printf("\nОчередь пустая \n");
            else
            {
                printf("\nЭлементы очереди: ");
                ShowQ(first);
                printf("\n");
            }
            break;
 
            case '0':
            ClearQ(first,&last);
            break;
            default: printf("\nОшибка!\n"); break;
        }while(d!='0');
    _getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
25.06.2012, 11:12     Программная реализация очереди #2
C++
1
2
3
4
5
6
7
int EmptyQ(QUEUE **first) //проверка пустоты очереди
{
    if ((*first)==NULL)
    return 1;
    else
    return 0;
}
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:16     Программная реализация очереди #3
Еще один пример реализации кода на языке C на языке C++?
А ошибка наверно из-за того, что, когда добавляется новый элемент, то указатель last меняется, но не меняется first. Т.е. first - неправильный указатель и при обращении first->next возникает ошибка.

Добавлено через 3 минуты
В функции DelQ(QUEUE *first, QUEUE **last). Второй параметр - это двойной указатель, но почему первый не тоже? Понятное дело, что если будет удаляться первый элемент списка, то указатель first в main тоже должен измениться.
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:17  [ТС]     Программная реализация очереди #4
а как нужно тогда?
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:19     Программная реализация очереди #5
Да и еще проблема, по идее так как под указатель last не выделена память, то обращение (*last)->next=tmp; тоже должно приводить к ошибке.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
25.06.2012, 11:19     Программная реализация очереди #6
darkknight2008, да вы правы, я просто только на функцию EmptyQ и посмотрел )
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:19  [ТС]     Программная реализация очереди #7
помоги пожалуйста сделать как нужно, а то я вообще не понимаю, много очень ошибок(
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:24     Программная реализация очереди #8
Во первых т.к. ты вроде стараешься писать на C++, то код должен соответствовать языку.
Во вторых, в начале запуска программы список у тебя пуст, т.е. ото надо отобразить через указатели first и last. Напирмер дай им начальное значение NULL. При добавлении нового элемента: Если у тебя список пуст, то треубется изменить указатель на первый элемент и на последний, если список не пуст, то изменяется только на последний. При проверке пуст ли список - достаточно проверить укзаатель на первый элемент, если first==NULL, то значит список пуст. Во всех остальных функциях подобные ошибки.
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:29  [ТС]     Программная реализация очереди #9
darkknight 2008, можно тебя попросить самому у меня испраивть, а то я очь плохо разбираюсь в этом, а такое задание дали, чуть чуть там же подправить, сможешь помочь???
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:34     Программная реализация очереди #10
Чуть-чуть сводится к переписыванию каждой функции. А тем более я совершенно не дружу с языком C. Но не у тебя одного возникали траблы с очередью, так что если ты прошуршиш раздел по языку C, то найдешь то что требуется.
DRUNY195
2 / 2 / 0
Регистрация: 04.04.2013
Сообщений: 247
03.06.2013, 21:57     Программная реализация очереди #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <conio.h>
#include <iostream>
#include <locale.h>
 using namespace std;
struct QUEUE //структура очередь
{
    int info;
    QUEUE *next;
};
 
int EmptyQ(QUEUE *first) //проверка пустоты очереди
{
    if ((first)==NULL)
    return 1;
    else
    return 0;
}
 
void AddQ(QUEUE ** last) //добавление элемента 
{
    QUEUE *tmp = new QUEUE;
    tmp->info=rand()%100;
    tmp->next=NULL;
    (*last)->next=tmp;
    *last=tmp;
}
 
void DelQ(QUEUE *first, QUEUE ** last) //удаление из очереди 
{
    QUEUE *tmp=first->next;
    if(first->next==NULL)
    *last=first;
    delete tmp;
}
 
void ShowQ(QUEUE *first) //просмотр очереди
{
    QUEUE *tmp=first->next;
    while(tmp!=NULL)
    {
        cin>>tmp->info;
        tmp=tmp->next;
    }
}
 
void ClearQ(QUEUE *first, QUEUE ** last) //очистка очереди 
{
    QUEUE *tmp;
    while(first->next!=NULL)
    {
        tmp=first->next;
        first->next = tmp;
        delete tmp;
    }
   * last=first;
}
 
int main()
{
    setlocale(0, "rus");
    QUEUE *first, *last;
    int n;
    char d;
    do
    {
        cout<<"1. Добавление элементов в конец очереди \n"<<endl;
        cout<<"2. Удаление элемента из начала очереди \n"<<endl;
        cout<<"3. Вывод элементов \n"<<endl;
        cout<<"0. Выход \n"<<endl;
        cout<<"Выбранное действие: "<<endl;
        cin>> d;
        switch(d)
        {
            case 1:
            AddQ(&last);
            cout<<"\nЭлемент добавлен в конец очереди \n"<<endl;
            break;
 
            case 2:
            if (EmptyQ(first)==1)
            cout<<"\nОчередь пустая \n";
            else
            {
                DelQ(first,&last);
                cout<<"\nЭлемент удален из очереди \n"<<endl;
            }
            break;
 
            case 3:
            if (EmptyQ(first)==1)
            cout<<"\nОчередь пустая \n"<<endl;
            else
            {
               cout<<"\nЭлементы очереди: "<<endl;
                ShowQ(first);
                cout<<"\n";
            }
            break;
 
            case 0:
            ClearQ(first,&last);
            break;
            default: cout<<"\nОшибка!\n"<<endl; break;
          }
       }while(d!=0);
    _getch();
}
Левый_Програмер
 Аватар для Левый_Програмер
1 / 1 / 0
Регистрация: 23.08.2011
Сообщений: 22
08.04.2014, 23:52     Программная реализация очереди #12
Почему все без классов делают? С++ ведь, а не С...
Вот ссылочка на реализацию очереди и описание её структуры.
Может кому поможет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2015, 13:25     Программная реализация очереди
Еще ссылки по теме:

C++ Программная реализация покадрового просмотра файла для ОС семейства Unix
Программная реализация алгоритма Khufu C++
C++ Программная реализация асимметричного алгоритма RSA

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Коханный
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 1
01.12.2015, 13:25     Программная реализация очереди #13
афаа
Yandex
Объявления
01.12.2015, 13:25     Программная реализация очереди
Ответ Создать тему
Опции темы

Текущее время: 00:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru