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

Очереди - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
05.03.2011, 22:27     Очереди #1
Дано задание:
Разработать функции работы с приоритетной очередью. Постановка запросов в очередь выполняется по приоритету, снятие - подряд из младших адресов (начало очереди). Приоритет: мах значения числового параметра, при совпадении параметров - FIFO.

Этот код подходит? Разобраться не могу.
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using std::cin;
using std::cout;
 
 
struct list
 { int val;
   list *next;
 };
 
//----- Постановка элемента в конец очереди
// list *PH[2]; - заголовок очереди
void intoFIFO(list *ph[], int v)
{
list *p= new list;                               // создать элемент списка;
p->val = v;                                              // и заполнить его
p->next = NULL;                                // новый элемент - последний
if (ph[0] == NULL)                                    // включение в пустую
     ph[0] = ph[1] = p;                                          // очередь
else                                              // включение за последним
     {                                                         // элементом
     ph[1]->next = p;                     // следующий за последним = новый
     ph[1] = p;                                        // новый = последний
     }
}
void scan(list *ph[])
 {
 
 for(list* p=ph[0];p!=NULL;p=p->next)
 cout<<p->val<<" ";
 cout<<"\n";
 }
 
 
 
//----- Извлечение из очереди
int fromFIFO(list *ph[])
{ list *q;
if (ph[0] ==NULL) return -1;                               // очередь пуста
q = ph[0];                                            // исключение первого
ph[0] = q->next;                                                // элемента
if (ph[0] ==NULL)
     ph[1] = NULL;                                  // элемент единственный
int v = q->val;
 
return v;
}
 
void main()
{
    list A3={7,NULL}, A2={5,&A3}, A1={1,&A2};
list*  ph[2];
ph[0]=&A1, ph[1]=&A3;
scan(ph);
intoFIFO (ph,10);
intoFIFO (ph,2);
scan(ph);
int vv= fromFIFO (ph);
scan(ph);
 
 
getch();
}
Добавлено через 1 час 8 минут
Ау! Подскажите кто-нибудь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
08.03.2011, 00:06  [ТС]     Очереди #2
В общем прошу помощи. Не могу разобраться со следующими строками:
C++
1
2
3
4
5
6
  list A3={7,NULL}, A2={5,&A3}, A1={1,&A2};
list*  ph[2];
ph[0]=&A1, ph[1]=&A3;
scan(ph);
intoFIFO (ph,10);
intoFIFO (ph,2);
Не могу понять, как осуществить заполнение очереди своими элементами, т.е. у меня получается ввести свои только после заданных.
И ещё:
C++
1
2
3
4
list *q;
if (ph[0] ==NULL) return -1;                               // очередь пуста
q = ph[0];                                            // исключение первого
ph[0] = q->next;
Тут исключается первый. Как сделать, чтобы удалял вообще все?
Прошу помощи. Очень надо.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.03.2011, 06:08     Очереди #3
wiki. очередь с приоритетом

Цитата Сообщение от Sick2
Этот код подходит? Разобраться не могу.
это простой список с функцией чтения с начала
можно найти большое количество сделанных лучше

нужно в узле хранить ключ и значение
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
10.03.2011, 19:22  [ТС]     Очереди #4
Цитата Сообщение от accept Посмотреть сообщение
wiki. очередь с приоритетом


это простой список с функцией чтения с начала
можно найти большое количество сделанных лучше

нужно в узле хранить ключ и значение
Я не могу понять, как назначить сам приоритет.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.03.2011, 03:43     Очереди #5
Код
DELETE(k) — удалить пару, с ключом k;
это значит, что в такой очереди не могут храниться просто узлы последовательно без ключей
так как в таком случае такая функция не сможет отличить приоритеты 1 2 2 3 от 1 2 3 4,
когда нужно будет удалить элемент с приоритетом 3

так что храни в узле его приоритет, а вставку делай, находя подходящее место
то есть, если тебе нужно в очередь -1 2 3 7 вставить элемент с приоритетом 4,
то функция добавления должна проходить до -1 2 3 ][ 7 и вставлять туда -1 2 3 4 7
при этом функция просмотра будет возвращать первый элемент
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
13.03.2011, 16:07  [ТС]     Очереди #6
Я не то, что не могу понять, как эту очередь сделать. Я даже не могу разорбраться на примере моего кода, как вводить свои элементы
C++
1
2
3
4
5
6
 list A3={7,NULL}, A2={5,&A3}, A1={1,&A2};
list*  ph[2];
ph[0]=&A1, ph[1]=&A3;
scan(ph);
intoFIFO (ph,10);
intoFIFO (ph,2);
Что это за фигня...как свои элементы ввести..хз.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.03.2011, 02:34     Очереди #7
Цитата Сообщение от Sick2
Я даже не могу разорбраться на примере моего кода
этот код вообще что-то не то делает
C++
1
void intoFIFO(list *ph[], int v)
зачем передавать массив указателей, если это односвязный список, где элементы надо добавлять в конец, а читать с начала
в сети есть куча вариантов односвязного списка, которые написаны лучше

C++
1
list*  ph[2];
это вообще зачем ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2011, 15:34     Очереди
Еще ссылки по теме:

Объединить две очереди в одну, как создать две очереди C++
Очереди C++
C++ править код (создание очереди и удаление элемента очереди по усмотрению пользователя)

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

Или воспользуйтесь поиском по форуму:
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
14.03.2011, 15:34  [ТС]     Очереди #8
Короче я всё уже сделал, этот код вообще левый какой-то.
Yandex
Объявления
14.03.2011, 15:34     Очереди
Ответ Создать тему

Метки
атд, Очередь, очередь с приоритетом
Опции темы

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