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

Односвязные списки (очередь) - C++

Восстановить пароль Регистрация
 
gerk0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
10.05.2013, 16:31     Односвязные списки (очередь) #1
Задание.Удалить с очереди все элементы, расположенные до минимального элемента очереди.

Пример создания контейнера "очередь" с использованием структур:
Определение структуры очереди:
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
struct tstk
{ 
int inf;
tstk *a; 
} sp;
Функция добавления элемента в очередь
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;
}
Начало использования очереди:
sp=spk=NULL;
AddOch(&sp, &spk, информация);
Функция считывания элемента с удалением:
toch *ReadOchD(toch *sp, int &inf)
{
if (sp == NULL) 
return NULL;
inf= sp->inf;
toch *spt = sp;
sp = sp->a;
delete spt;
return sp;
}
Функция удаления элемента после поточного:
void DelOchAfter(toch *sp)
{
if (sp->a == NULL) 
return;
toch *spt = sp->a;
sp->a = sp->a->a;
delete spt;
}Функция удаления всей очереди:
void DelOchAll(toch **sp, toch **spk)
{
toch *spt; int inf;
while(*sp != NULL)
{
spt = *sp;
inf= (*sp)->inf;
cout << inf << endl;
*sp = (*sp)->a;
delete spt;
}
*spk=NULL;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2013, 16:31     Односвязные списки (очередь)
Посмотрите здесь:

односвязные списки C++
C++ Односвязные списки
Односвязные списки C++
Односвязные списки C++
C++ Односвязные списки С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
10.05.2013, 19:59     Односвязные списки (очередь) #2
gerk0, ох и код скажу я вам ... Писал по аналогии ... Функции представленные вами не трогал.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
struct toch
{
   int inf;
   toch* a;
};
 
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;
   }
}
 
toch* ReadOchD(toch* sp, int& inf)
{
   if (sp == NULL)
   {
      return NULL;
   }
   inf = sp->inf;
   toch* spt = sp;
   sp = sp->a;
   delete spt;
   return sp;
}
 
void DelOchAfter(toch* sp)
{
   if (sp->a == NULL)
   {
      return;
   }
   toch* spt = sp->a;
   sp->a = sp->a->a;
   delete spt;
}
 
void DelOchBefore(toch** sp, toch* node)
{
   int inf;
   while (*sp != node)
   {
      *sp = ReadOchD(*sp, inf);
   }
}
 
void DelOchAll(toch** sp, toch** spk)
{
   toch* spt;
   int inf;
   while (*sp != NULL)
   {
      spt = *sp;
      inf = (*sp)->inf;
      cout << inf << endl;
      *sp = (*sp)->a;
      delete spt;
   }
   *spk = NULL;
}
 
toch* FindMin(toch* sp)
{
   toch* min = sp;
 
   for (; sp; sp = sp->a)
   {
      if (sp->inf < min->inf)
      {
         min = sp;
      }
   }
 
   return min;
}
 
void PrintOch(const toch* sp)
{
   for (; sp; sp = sp->a)
   {
      cout << sp->inf << " ";
   }
   cout << endl;
}
 
int main()
{
   srand(time(NULL));
 
   struct
   {
      toch* head;
      toch* tail;
   }  queue = {NULL, NULL};
 
   for (int i = 0; i < 10; ++i)
   {
      AddOch(&queue.head, &queue.tail, rand() % 100);
   }
 
   cout << "source: ";
   PrintOch(queue.head);
 
   toch* min = FindMin(queue.head);
 
   cout << "min = " << min->inf << endl;
 
   DelOchBefore(&queue.head, min);
 
   cout << "result: ";
   PrintOch(queue.head);
 
   // DelOchAll(&queue.head, &queue.tail);
 
   return 0;
}
Односвязные списки (очередь)
gerk0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
10.05.2013, 20:41  [ТС]     Односвязные списки (очередь) #3
Спасибо большое за предоставленную помощь!
Да уж, что касается объема - не завидная картина
Если Вам не трудно, как бы Вы упростили на моём месте?
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
10.05.2013, 20:53     Односвязные списки (очередь) #4
Цитата Сообщение от gerk0 Посмотреть сообщение
Если Вам не трудно, как бы Вы упростили на моём месте?
Убрал не используемые функции: ReadOchD и DelOchAfter. А функцию DelOchAll упростил. Получилось бы примерно так:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
struct toch
{
   int inf;
   toch* a;
};
 
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;
   }
}
 
void DelOchBefore(toch** sp, toch* node)
{
   toch* spt;
   while (*sp != node)
   {
      spt = *sp;
      *sp = (*sp)->a;
      delete spt;
   }
}
 
void DelOchAll(toch** sp, toch** spk)
{
   DelOchBefore(sp, NULL);
 
   *spk = NULL;
}
 
toch* FindMin(toch* sp)
{
   toch* min = sp;
 
   for (; sp; sp = sp->a)
   {
      if (sp->inf < min->inf)
      {
         min = sp;
      }
   }
 
   return min;
}
 
void PrintOch(const toch* sp)
{
   for (; sp; sp = sp->a)
   {
      cout << sp->inf << " ";
   }
   cout << endl;
}
 
int main()
{
   srand(time(NULL));
 
   struct
   {
      toch* head;
      toch* tail;
   }  queue = {NULL, NULL};
 
   for (int i = 0; i < 10; ++i)
   {
      AddOch(&queue.head, &queue.tail, rand() % 100);
   }
 
   cout << "source: ";
   PrintOch(queue.head);
 
   toch* min = FindMin(queue.head);
 
   cout << "min = " << min->inf << endl;
 
   DelOchBefore(&queue.head, min);
 
   cout << "result: ";
   PrintOch(queue.head);
 
   DelOchAll(&queue.head, &queue.tail);
 
   return 0;
}
gerk0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
10.05.2013, 20:56  [ТС]     Односвязные списки (очередь) #5
И ещё раз благодарен, так код поинтересней выглядит
Yandex
Объявления
10.05.2013, 20:56     Односвязные списки (очередь)
Ответ Создать тему
Опции темы

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