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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.59
NAG
8 / 8 / 1
Регистрация: 15.03.2009
Сообщений: 267
#1

Список типа "ОЧЕРЕДЬ" - C++

22.09.2009, 02:06. Просмотров 2687. Ответов 6
Метки нет (Все метки)

Вопрос №1:
Что такое "список типа очередь"? // нужно сформировать массив
Где-то слишал, что это массив из элементов, предидущий елемент котрого включает в себя адрес следующего // думаю, что создать масив записей, с двумя полями "число" и "адрес"
Если мое предположение правильное, то
Вопрос №2:
как работать с адресами, определять и.т.д. С помощью указателей? Коль да, то КАК?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2009, 02:06     Список типа "ОЧЕРЕДЬ"
Посмотрите здесь:

C++ Контейнерный класс типа "Список" без использования STL
C++ Списки типа "ОЧЕРЕДЬ"
класс Lqueue, структура типа "очередь" C++
C++ значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
C++ Однонаправленный список типа "Очередь". Поменять элементы местами
C++ Игра "Однорукий бандит". Кольцевая очередь. Двусвязный список
C++ Аргумент типа "const char*" несовместим с параметром типа "LPCWSTR"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.09.2009, 05:14     Список типа "ОЧЕРЕДЬ" #2
элементы добавляются только в конец, а читаются только с начала
насчёт удаления не знаю, вообще, прочитанные должны удаляться

есть операция взятия адреса &
и операция получения объекта по адресу *
если в объекте данные представляют из себя адрес, можно дальше проходить **

C
1
    int n;
так как n - объект, то она имеет адрес, его можно узнать, выполнив операцию & с n

C
1
    printf("%p" "\n", &n);
n - имя объекта, поэтому, даже потеряв имя, можно обращаться к объекту и дальше, через его адрес
при динамическом выделении памяти, имени у выделенного блока вообще нет

операцию & можно перепутать с & в C++, которая имеет ещё одно назначение для работы с переменными, кроме взятия адреса (создаёт алиас для имени переменной, то есть как бы у одного объекта появляются два, три и тд имени)

это для С++ пример, как выглядят объявления ссылок

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
 
#include <iostream>
 
using namespace std;
 
int main(void)
{
    int n = 5;
    int &q1 = n;
    int &q2 = q1;
    int &q3 = q2;
    
    cout << q1
         << q2
         << q3
         << endl;
    
    n = 1;
    
    cout << q1
         << q2
         << q3
         << endl;
        
    return 0;
}


вывод

Код
[guest@station tmp]$ ./test
555
111
[guest@station tmp]$
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
22.09.2009, 06:54     Список типа "ОЧЕРЕДЬ" #3
Цитата Сообщение от NAG Посмотреть сообщение
Вопрос №1:
Что такое "список типа очередь"? // нужно сформировать массив
Где-то слишал, что это массив из элементов, предидущий елемент котрого включает в себя адрес следующего // думаю, что создать масив записей, с двумя полями "число" и "адрес"
Если мое предположение правильное, то
Вопрос №2:
как работать с адресами, определять и.т.д. С помощью указателей? Коль да, то КАК?
Есть 2 варианта организации очереди.
1й - Статический массив, максимального размера nMax
Элементами класса являются:
собственно массив[nMax],
число nCur(0).//текущее количество элементов в очереди
Методы класса:
положить элемент в очередь: если nCur<nMax то добавить.
взять элемент из очереди: функция возвращает первый положенный элемент, и удаляет его из очереди.
Для статического массива придется делать сдвиги массива, после каждого удаления.

2й - Динамическая очередь
Элементом класса являются:
указатель на начало очереди( можно так же добавить указатель на конец очереди),
собственно класс "элемент очереди", поля этого класса - указатель на следующий эл.(иногда и на предыдущий), и собтвенно само значени.(напр. int a).
Методы класса:
положить элемент в очередь: доходим до последнего эл. выделяем место под еще 1 элемент, делаем связку адресов, задаем значение элемента.
взять элемент из очереди: функция возвращает первый положенный элемент, и удаляет его из очереди.//тут аккуратней с адресами


Ну вот и все %)
Динамическая очередь примерно выглядит так:

C++
1
2
3
4
5
6
7
8
9
class el_o4{
       el_o4 *next;
       int el;
}
 
class o4{
        el_o4 *beg = NULL;
//ну и методы
}
NAG
8 / 8 / 1
Регистрация: 15.03.2009
Сообщений: 267
22.09.2009, 10:35  [ТС]     Список типа "ОЧЕРЕДЬ" #4
Цитата Сообщение от R0mm Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class el_o4{  
       el_o4 *next;
       int el;
}
 
class o4{
        el_o4 *beg = NULL;
 
}
[/SPOILER]
C
1
el_o4 *next;
это адрес следующего елемента?
C
1
 int el;
это сам елемент?
а что такое
C
1
el_o4 *beg = NULL;
??
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.09.2009, 12:14     Список типа "ОЧЕРЕДЬ" #5
Цитата Сообщение от R0mm Посмотреть сообщение
Для статического массива придется делать сдвиги массива, после каждого удаления.
ни в коем разе! имеется два указателя: на хвост и на нос. начало и размер буфера тоже известны. этого достаточно.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
22.09.2009, 15:10     Список типа "ОЧЕРЕДЬ" #6
Пример дэка
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
struct Dec
{
 int el;
 Dec *next;
};
 
struct BE
{
 Dec *beg;
 Dec *end;
};
 
 
void AddR(BE *pbe,int ii)
{
 void in(BE*,int);
 void erin();
 if (initbool)
 {
  if (pbe->beg == NULL)
  {
   in(pbe,ii);
  }
  else
  {
   pbe->end->next = new Dec;
   pbe->end = pbe->end->next;
   pbe->end->el = ii;
   pbe->end->next = NULL;
  }
  del = 1;
  printf("Addition on the right................................. [OK]");
 }
 else erin();
};
 
void AddL(BE *pbe, int ii)
{
 void in(BE*,int);
 void erin();
 if (initbool)
 {
  if (pbe->beg == NULL)
  {
   in(pbe,ii);
  }
  else
  {
   Dec *p = new Dec;
   p->next = pbe->beg;
   pbe->beg = p;
   pbe->beg->el = ii;
  }
  del = 1;
  printf("Addition on the left.................................. [OK]");
 }
 else erin();
};
 
void in(BE *pbe, int ii)
{
 pbe->beg = new Dec;
 pbe->end = pbe->beg;
 pbe->beg->next = NULL;
 pbe->beg->el = ii;
};
 
 
int *DelR(BE *pbe)
{
 void erdel();
 void erin();
 int n;
 Dec *p;
 if (initbool)
  if (del)
  {
   if (pbe->beg == pbe->end)
   {
    p = pbe->beg;
    pbe->beg = NULL;
    pbe->end = NULL;
    del = 0;
   }
   else
   {
    p = pbe->beg;
    while (p->next!=pbe->end)
    {
     p = p->next;
    }
    pbe->end = p;
    pbe->end->next = NULL;
    p = p->next;
   }
   n=p->el;
   delete p;
   printf("Delete on the left.................................... [OK]");
   return &n;
  }
  else {erdel(); return NULL;}
  else {erin(); return NULL;}
};
 
int *DelL(BE *pbe)
{
 void erin();
 void erdel();
 Dec *p;
 int n;
 if (initbool)
 if (del)
 {
  if (pbe->beg == pbe->end)
  {
   p = pbe->beg;
   pbe->beg = NULL;
   pbe->end = NULL;
   del = 0;
  }
  else
  {
   p = pbe->beg;
   pbe->beg = pbe->beg->next;
  }
  n=p->el;
  delete p;
  printf("Delete on the right................................... [OK]");
  return &n;
 }
 else {erdel(); return NULL;}
 else {erin(); return NULL;}
};
 
void DelAll(BE *pbe)
{
 Dec *p;
 
 while(pbe->beg!=pbe->end)
 {
  p = pbe->beg;
  while(p->next!=pbe->end)
  {
   p = p->next;
  }
  pbe->end = p;
  delete p;
 }
 del = 0;
 printf("Delete All............................................ [OK]\n");
};

писал давно, используя структуры, но думаю суть поймешь.
Дэк - это список, добавлять, и удалять можно с любой стороны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2009, 21:07     Список типа "ОЧЕРЕДЬ"
Еще ссылки по теме:

Ошибка аргумент типа "char" несовместим с параметром типа "LPCSTR" C++
АТД "Однонаправленный список" с элементами типа char C++
C++ Создать класс "Список объектов любого типа"
Создать класс "Список объектов любого типа" C++
Значение типа "char *" нельзя присвоить сущности типа "LPWSTR" C++

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

Или воспользуйтесь поиском по форуму:
NAG
8 / 8 / 1
Регистрация: 15.03.2009
Сообщений: 267
22.09.2009, 21:07  [ТС]     Список типа "ОЧЕРЕДЬ" #7
в общем программа понятная..с функциями разобрался, но вопросик, что за функция
C++
1
void in(BE *pbe, int ii)
я пока только Си учил, и некоторые елементи Си++ мне не понятни. опиши что эта функцыя делает!
Yandex
Объявления
22.09.2009, 21:07     Список типа "ОЧЕРЕДЬ"
Ответ Создать тему
Опции темы

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