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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Олег@tor
9 / 9 / 1
Регистрация: 22.10.2009
Сообщений: 24
05.04.2010, 21:02     Списки типа "ОЧЕРЕДЬ" #1
Задание:
Создать однонаправленную очередь с числами в диапазоне от –50 до +50.
После создания очереди выполнить индивидуальное задание. В конце работы все
очереди должны быть удалены.

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

Программа работает чётко, только не могу разобраться, в главной функции main()
(помогите разобраться комментариями)

P.S.
Подскажите, что означает %100-50 в генераторе псевдослучайных чисел (inf=rand()%100-50; )

Прога:
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
#include <iostream.h>  
#include <stdlib.h> 
 
 
struct toch{     //создаём структуру
    int inf;  
    toch *a;
 } *sp,*spk; 
 
void AddOch(toch **sp,toch **spk, int inf)    //добавление элемента в очередь    
{  
    toch *spt=new toch; 
  spt->inf = inf; 
  spt->a = NULL; 
  if (*spk == NULL) 
   *sp=*spk=spt; 
    else 
  {   (*spk)->a = spt;    *spk = spt;   } 
  return; 
} 
 
 
toch *ReadOch(toch *spt, int &inf)      //чтение элемента с удалением 
 {  
    if(spt==NULL) 
    {
        cout<<"Ochered' pusta\n";
        return NULL ;
    }
    while(spt!=NULL) 
  { 
    inf= spt->inf; 
    cout<<inf<<"  "; 
     spt = spt->a; 
   } 
    cout<<endl;
 return spt; 
} 
 
 
void DelOchAll(toch **sp, toch **spk)     //удаление всей очереди 
{  
   toch *spt; 
  while(*sp != NULL) 
  { 
    spt = *sp; 
    *sp = (*sp)->a; 
   delete spt;  
  } 
 *spk=NULL; 
} 
 
 
 
void DelDoMin(toch **spn, toch **spk)    //удаление из очереди всех элементов, расположенных до min 
{
    toch *spd=*spn;
    toch *spmin,*spm;
 
    int min; 
    if(*spn==NULL)  return ;
      min=(*spn)->inf;
      spmin=*spn;
    while ((*spn)->a!=NULL)
      {
        if((*spn)->a->inf<min)
        {
            min=(*spn)->a->inf;
        spmin=(*spn)->a;
        }
    *spn=(*spn)->a;
    }
    cout<<"MIN: "<<min<<endl;
    *spn=spd;
while (*spn!=spmin)
{   
    spm=*spn;
    *spn=(*spn)->a;
    delete spm;
}
}
 
 
int main()
{
    sp=spk=NULL;
    toch *spt=NULL;
    int inf,n;  
    cout<<" Vvedite 4islo elementov"<<endl;
 cin>>n;
 for (int i=0;i<n;i++)       //создание очереди
 {
  inf=rand()%100-50;        //генерируем псевдослучайные числа(от -50 до 50)    
  AddOch(&sp,&spk,inf);
 }
cout<<"vvedennaja ochered':\n";
ReadOch(sp, inf); 
DelDoMin(&sp,&spk);
cout<<"New ochered':\n";
ReadOch(sp, inf); 
DelOchAll(&sp, &spk);
if(sp==NULL)
cout<<"Ochered' udalena\n";
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2010, 21:02     Списки типа "ОЧЕРЕДЬ"
Посмотрите здесь:

C++ Список типа "ОЧЕРЕДЬ"
абстрактные типы данных "СТЕК" и "ОЧЕРЕДЬ" C++
класс Lqueue, структура типа "очередь" C++
C++ значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
C++ Однонаправленный список типа "Очередь". Поменять элементы местами
Аргумент типа "char *" несовместим с параметром типа "LPCWSTR" C++
Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? C++
ткните мордой плз на описание конструкций типа defect?"brak":"goden" C++
Аргумент типа "LPCWSTR" несовместим с параметром типа "LPCSTR" C++
C++ Аргумент типа "const char*" несовместим с параметром типа "LPCWSTR"
Работа с памятью: можно ли в массив объектов с полем типа "Родитель", вписать объекты с полем типа "Потомок" C++
Значение типа "char *" нельзя присвоить сущности типа "LPWSTR" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
06.04.2010, 01:43     Списки типа "ОЧЕРЕДЬ" #2
C
1
inf=rand()%100-50;
http://www.cplusplus.com/reference/c.../cstdlib/rand/

%100 - дает генерацию псевдослучайного числа в диапазоне 0..99, а вычитая 50, ты смещаешь его как раз на -50..49

PS Может быть правильнее сделать
C
1
inf=rand()%101-50;
Олег@tor
9 / 9 / 1
Регистрация: 22.10.2009
Сообщений: 24
06.04.2010, 09:05  [ТС]     Списки типа "ОЧЕРЕДЬ" #3
Я, конечно, извинянюсь, т. к. в функции int main() мне как раз таки всё более менее понятно. Я не понимю, как поисходит поиск и удаление из очереди всех элементов, расположенных до min в функции void DelDoMin(toch **spn, toch **spk).
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
06.04.2010, 11:52     Списки типа "ОЧЕРЕДЬ" #4
C++
1
2
3
4
5
6
7
8
9
      while ((*spn)->a!=NULL)
          {
                if((*spn)->a->inf<min)
                {
                        min=(*spn)->a->inf;
                spmin=(*spn)->a;
                }
        *spn=(*spn)->a;
        }
Этот цикл перебирает все элементы очереди и ищет минимальный из них

C++
1
2
3
4
5
6
while (*spn!=spmin)
{   
        spm=*spn;
        *spn=(*spn)->a;
        delete spm;
}
А этот удаляет все последующие элементы очереди (то есть те, которые были внесены в эту очередь раньше минимального)
Или построчно комментарии расставить?
Олег@tor
9 / 9 / 1
Регистрация: 22.10.2009
Сообщений: 24
06.04.2010, 18:58  [ТС]     Списки типа "ОЧЕРЕДЬ" #5
Был бы искренне благодарен, если всё-таки построчно (никак не могу понять какой указатель в этой функции на что указывает).
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
07.04.2010, 01:45     Списки типа "ОЧЕРЕДЬ" #6
C++
1
2
3
4
5
6
7
8
9
while ((*spn)->a!=NULL) //пока не будет достигнут последний элемент
{
    if((*spn)->a->inf<min)//проверяем, меньше минимума хранимая в структуре информация или нет
    {
        min=(*spn)->a->inf; //если да - заменяем заменяем минимум
        spmin=(*spn)->a; //и указатель на элемент очереди, который его хранит
    }
    *spn=(*spn)->a;//переходим у следующему элементу очереди
}
C++
1
2
3
4
5
6
while (*spn!=spmin) //пока не достигнем элемента, содержащего минимум
{   
        spm=*spn;//сохраняем указатель на первый элемент очереди
        *spn=(*spn)->a;//перезаписываем его указателем на следующий элемент очереди
        delete spm;//удаляем первый элемент
}
Yandex
Объявления
07.04.2010, 01:45     Списки типа "ОЧЕРЕДЬ"
Ответ Создать тему
Опции темы

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