Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
1

Работа со стеком - не все нечетные элементы удаляются

26.05.2014, 20:49. Показов 1326. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех форумчан. Хочу научиться работать со стеком. Вот решил написать прогу, которая создает стек, выводит его, удаляет в нем нечетные элементы и выводит новый стек. Только что-то не все нечетные элементы удаляются, как это исправить? И еще, нет ли утечки памяти? Заранее благодарен.
Pascal
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
type TList=^List;
     List=record
     x:Integer;
     next:TList;
     end;
 
procedure add(var st:TList;value:Integer);
var ls:TList;
begin
new(ls);
ls^.x:=value;
ls^.next:=st;
st:=ls;
end;
 
procedure free(var st:TList);
var ls:TList;
begin
while st<>nil do
 begin
  ls:=st;
  st:=st^.next;
  dispose(ls);
 end;
 
end;
 
procedure delete(var st:TList);
var ls,next:TList;
begin
ls:=st;
while ls<>nil do
 begin
  next:=ls^.next;
  if next=nil then Break;
  if odd(next^.x) then 
   begin
    ls^.next:=next^.next;
    dispose(next);
   end; 
  ls:=ls^.next;
 end;
ls:=st;
if odd(ls^.x) then 
 begin
  st:=ls^.next;
  dispose(ls);
 end;
end;
 
var stack,lst:TList;
i,n:Integer;
begin
Write('n=');
Readln(n);
Writeln('Stack:');
new(stack);
Randomize;
stack^.x:=Random(100);
for i:=1 to n-1 do add(stack,Random(100));
lst:=stack;
while lst<>nil do
 begin
  Writeln(lst^.x);
  lst:=lst^.next;
 end;
delete(stack);
Writeln('New stack:');
lst:=stack;
while lst<>nil do
 begin
  Writeln(lst^.x);
  lst:=lst^.next;
 end;
free(stack);
Readln;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2014, 20:49
Ответы с готовыми решениями:

Массивы: все элементы, кратные 10, заменить 0, все нечетные элементы удвоить, а четные уменьшить в 2 раза
помогите написать программу (массивы) Дан массив целых чисел из 50 элементов. - Все элементы...

Дан массив целых чисел из 10 элементов.Все элементы кратные 10 заменить 0;Все нечетные элементы удвоить, а четные уменьшить на 2;
Дан массив целых чисел из 50 элементов. Все элементы кратные 10 заменить 0; Все нечетные...

Поставить в начало массива все четные элементы, а конец – все нечетные
Всем доброго времени суток.Помогите написать процедуру, которая ставит в начало массива все четные...

В первом массиве собрать все четные элементы исходного, а во втором – все нечетные
Дан массив из N чисел. Сформировать из него два массива: в первом собрать все четные элементы...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
26.05.2014, 23:22 2
Лучший ответ Сообщение было отмечено Новичок как решение

Решение

Цитата Сообщение от Новичок Посмотреть сообщение
Только что-то не все нечетные элементы удаляются, как это исправить?
Pascal
32
33
34
35
36
37
38
39
40
41
42
while ls<>nil do
begin
   next:=ls^.next;
   if next=nil then Break;
   if odd(next^.x) then 
   begin
      ls^.next:=next^.next;
      dispose(next);
   end
   else ls:=ls^.next;
end;
Кроме того, чтобы программа гарантированно (а не "в зависимости от положения Юпитера на небосклоне") не вылетала, надо сделать еще одно движение:

Pascal
56
57
58
Randomize;
stack^.x:=Random(100);
stack^.next := nil; // <--- Вот это
1
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
26.05.2014, 23:38  [ТС] 3
О, все понял. Спасибо большое! Как я понял утечки памяти нет? Вот исправленный код.
Pascal
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
type TList=^List;
     List=record
     x:Integer;
     next:TList;
     end;
 
procedure add(var st:TList;value:Integer);
var ls:TList;
begin
new(ls);
ls^.x:=value;
ls^.next:=st;
st:=ls;
end;
 
procedure free(var st:TList);
var ls:TList;
begin
while st<>nil do
 begin
  ls:=st;
  st:=st^.next;
  dispose(ls);
 end;
 
end;
 
procedure delete(var st:TList);
var ls,next:TList;
begin
ls:=st;
while ls<>nil do
begin
   next:=ls^.next;
   if next=nil then Break;
   if odd(next^.x) then 
   begin
      ls^.next:=next^.next;
      dispose(next);
   end
   else ls:=ls^.next;
end;
ls:=st;
if odd(ls^.x) then 
 begin
  st:=ls^.next;
  dispose(ls);
 end;
end;
 
var stack,lst:TList;
i,n:Integer;
begin
Write('n=');
Readln(n);
Writeln('Stack:');
new(stack);
Randomize;
stack^.x:=Random(100);
stack^.next:=nil;//И это буду теперь знать
for i:=1 to n-1 do add(stack,Random(100));
lst:=stack;
while lst<>nil do
 begin
  Writeln(lst^.x);
  lst:=lst^.next;
 end;
delete(stack);
Writeln('New stack:');
lst:=stack;
while lst<>nil do
 begin
  Writeln(lst^.x);
  lst:=lst^.next;
 end;
free(stack);
Readln;
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
27.05.2014, 02:53 4
Лучший ответ Сообщение было отмечено Новичок как решение

Решение

Цитата Сообщение от Новичок Посмотреть сообщение
Как я понял утечки памяти нет?
А самому проверить? В Options->Compiler->Additional compiler args вводишь -gh, жмешь Ok, и у тебя будет работать утилита heaptrc, отлавливающая утечки памяти. В твоем коде она ничего не нашла:
XML
1
2
3
4
5
6
Heap dump by heaptrc unit
10 memory blocks allocated : 80/80
10 memory blocks freed     : 80/80
0 unfreed memory blocks : 0
True heap size : 98304 (112 used in System startup)
True free heap : 98192
2
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
27.05.2014, 16:12  [ТС] 5
Попробовал, действительно удобно. Как я понял это
Цитата Сообщение от UI Посмотреть сообщение
10 memory blocks allocated :
должно быть равно этому
Цитата Сообщение от UI Посмотреть сообщение
10 memory blocks freed :
0
27.05.2014, 16:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2014, 16:12
Помогаю со студенческими работами здесь

Дан одномерный массив А. Перенести в начало массива все четные элементы, а в конец - все нечетные
Помогите пожалуйста написать программу на языке &quot;Си&quot;: Дан одномерный массив А состоящий из N...

Записать в файл все нечетные числа из [1; 99]. Затем вывести все элементы данного файла, начиная с 15
Записать в файл все нечетные числа из . Затем вывести все элементы данного файла, начиная с 15

Переформировать массив таким образом, чтобы сначала располагались все четные элементы, а потом все нечетные
Переформировать массив таким образом, чтобы сначала располагались все четные элементы, а потом все...

Создать два массива, которые будут содержать: все четные элементы двух массивов; все нечетные элементы двух массивов
Помогите, пожалуйста, с программой.. Ввести с клавиатуры два одномерных массива произвольной...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru