Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 95, средняя оценка - 4.92
kirya
-9 / 2 / 5
Регистрация: 01.06.2012
Сообщений: 87
#1

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

25.06.2012, 11:06. Просмотров 17957. Ответов 12
Метки нет (Все метки)

Друзья, подскажите, почему не правильно работает программа, ругается на функцию EmptyQ
программу надо запускать в консольном приложении в VS 2008
http://www.cyberforum.ru/cpp-beginners/thread866880.html


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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2012, 11:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программная реализация очереди (C++):

Программная реализация древесной сортировки
Программная реализация древесной сортировки Указания: - использовать...

Программная реализация алгоритма Khufu
Люди,не могу найти программную реализацию по алгоритму khufu мб знает кто как...

Программная реализация асимметричного алгоритма RSA
Помогите в написании программной реализации асимметричного алгоритма RSA в...

Программная реализация алгоритмов решения нелинейных уравнений
Помогите пожалуйста с 9 вариантом.

Программная реализация динамического списка динамических списков
Обучаюсь удаленно через интернет. И тут такая штука. Случайно нажал кнопку...

12
neske
1526 / 893 / 191
Регистрация: 26.03.2010
Сообщений: 3,073
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;
}
2
darkknight2008
62 / 62 / 11
Регистрация: 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 тоже должен измениться.
0
kirya
-9 / 2 / 5
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:17  [ТС] #4
а как нужно тогда?
0
darkknight2008
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:19 #5
Да и еще проблема, по идее так как под указатель last не выделена память, то обращение (*last)->next=tmp; тоже должно приводить к ошибке.
0
neske
1526 / 893 / 191
Регистрация: 26.03.2010
Сообщений: 3,073
25.06.2012, 11:19 #6
darkknight2008, да вы правы, я просто только на функцию EmptyQ и посмотрел )
0
kirya
-9 / 2 / 5
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:19  [ТС] #7
помоги пожалуйста сделать как нужно, а то я вообще не понимаю, много очень ошибок(
0
darkknight2008
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:24 #8
Во первых т.к. ты вроде стараешься писать на C++, то код должен соответствовать языку.
Во вторых, в начале запуска программы список у тебя пуст, т.е. ото надо отобразить через указатели first и last. Напирмер дай им начальное значение NULL. При добавлении нового элемента: Если у тебя список пуст, то треубется изменить указатель на первый элемент и на последний, если список не пуст, то изменяется только на последний. При проверке пуст ли список - достаточно проверить укзаатель на первый элемент, если first==NULL, то значит список пуст. Во всех остальных функциях подобные ошибки.
0
kirya
-9 / 2 / 5
Регистрация: 01.06.2012
Сообщений: 87
25.06.2012, 11:29  [ТС] #9
darkknight 2008, можно тебя попросить самому у меня испраивть, а то я очь плохо разбираюсь в этом, а такое задание дали, чуть чуть там же подправить, сможешь помочь???
0
darkknight2008
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
25.06.2012, 11:34 #10
Чуть-чуть сводится к переписыванию каждой функции. А тем более я совершенно не дружу с языком C. Но не у тебя одного возникали траблы с очередью, так что если ты прошуршиш раздел по языку C, то найдешь то что требуется.
0
DRUNY195
3 / 3 / 3
Регистрация: 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();
}
0
Левый_Програмер
1 / 1 / 0
Регистрация: 23.08.2011
Сообщений: 22
08.04.2014, 23:52 #12
Почему все без классов делают? С++ ведь, а не С...
Вот ссылочка на реализацию очереди и описание её структуры.
Может кому поможет.
1
Коханный
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 1
01.12.2015, 13:25 #13
афаа
0
01.12.2015, 13:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2015, 13:25
Привет! Вот еще темы с решениями:

Программная реализация простого бесприоритетного планировщика потоков
Программная реализация простого бесприоритетного планировщика потоков. ...

Организация кольцевого буфера. Программная реализация монитора
Ребят помогите решить задание по параллельному программированию, завтра уже...

Программная реализация диспетчера процессов с использованием системного таймера
Помогите выполнить задание : Выбрать стратегию диспетчеризации процессов....

Программная реализация дизассемблирования арифметических команд intel 8086
Здравствуйте,вот такая тема для курсовой работы - программная реализация...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru