Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 78

В динамическом списке найти первый наименьший и последний наибольший элементы и удалить все элементы, расположенные между ними.

07.07.2013, 12:18. Показов 2301. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан список из целых чисел, найти первое из всех минимальных значений и последнее из всех максимальных, при этом удалить все значения между ними.
 Комментарий модератора 
Название темы уточнено.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2013, 12:18
Ответы с готовыми решениями:

Найти первый и последний положительные элементы массива и подсчитать количество элементов, заключенных между ними
Дан одномерный массив А, состоящий из N элементов. Найти первый и последний положительные элементы массива и подсчитать количество...

В одномерном массиве поменяйте местами последний наименьший и первый наибольший элементы
Задача: В одномерном целочисленном массиве поменяйте местами последний наименьший и первый наибольший элементы. Выведите исходный и...

В одномерном целочисленном массиве поменяйте местами последний наименьший и первый наибольший элементы
В одномерном целочисленном массиве поменяйте местами последний наименьший и первый наибольший элементы. Выведите исходный и изменённый...

5
Эксперт 1С
 Аватар для Joker_vad
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,922
08.07.2013, 12:15
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
var i,n,imax,imin:integer;
a:array[1..100] of real;
max,min:real;
begin
Write('Введите количество элементов:');readln(n);
for i:=1 to n do begin
a[i]:=random(50);
write(a[i]:5:2,' ');
end;
writeln;
max:=a[1];
for i:=2 to n do 
if a[i]>=max then begin
max:=a[i];
imax:=i;
end;
min:=a[n];
for i:=n-1 downto 1 do 
if a[i]<=min then begin
min:=a[i];
imin:=i;
end;
if imin>imax then begin
for i:=1 to imax do
write(a[i]:5:2,' ');
for i:=imin to n do
write(a[i]:5:2,' ');
end
else
begin
for i:=1 to imin do
write(a[i]:5:2,' ');
for i:=imax to n do
write(a[i]:5:2,' ');
end;
if imin=imax then
writeln(a[imax]:5:2,' ');
end.;
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 78
09.07.2013, 10:22  [ТС]
спасибо конечно, но тут массивы,а необходим список
0
Эксперт 1С
 Аватар для Joker_vad
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,922
09.07.2013, 10:26
в чем трудность переделки? Начни с того как будешь объявлять список, дальше я помогу
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 78
10.07.2013, 00:38  [ТС]
вот мои наработки

попытался вывести максимальный и минимальный

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
uses crt;
type
  PList = ^TList;
  TList = record
    info: integer;
    next : PList;
  end;
 
var
  head,tail,minel,maxel : PList;
 
{процедура формирует список с двумя сторожами}
procedure MakeList(Var head,tail:PList);
Var
  p,q:PList;
  n,i:integer;
begin {MakeList}
  writeln('Введите количество элементов списка');
  readln(n);
  randomize;
  new(head);
  new(tail);
  head^.next:=tail;
  p:=head;
  for i:=1 to n do
  begin
    new(q);
    q^.info:=random(50);
    q^.next:=tail;
    p^.next:=q;
    p:=q;
  end;
end;{MakeList}
 
{процедура выводит список на экран}
 procedure PrintList(head,tail:PList);
 Var
   p:PList;
 begin {PrintList}
   p:=head^.next;
   while p<>tail do
   begin
     write(p^.info:6);
     p:=p^.next;
   end;
   writeln;
 end;{PrintList}
 
function find_min:PList;
var curr, minn:PList;
x:integer;
begin
 curr:=head;
 x:=curr^.info;
 
 repeat
  if curr^.info<x then
 begin
 x:=curr^.info; minn:=curr;
 end;
 until curr^.next = nil;
 
 find_min:=minn;
end;
 
function find_max:PList;
var curr, maxx:PList;
x:integer;
begin
 curr:=head;
 x:=curr^.info;
 
 repeat
  if curr^.info<x then begin x:=curr^.info; maxx:=curr; end;
 until curr^.next = nil;
 
 find_max:=maxx;
end;
 
begin{program}
  ClrScr;
  MakeList(head,tail);
  writeln('исходный список');
  PrintList(head,tail);
  minel:=find_min;
  writeln('minimum : ',minel^.info);
  maxel:=find_max;
  writeln('maximum : ',maxel^.info);
  writeln('полученный список');
  PrintList(head,tail);
  readkey;
end.{program}
без вывода максимального, минимального попытался удалить значения между ними
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
uses crt;
type
PNode=^Node;
Node=record
 data:integer;
 next:PNode;
end;
var
Head,min,max:PNode;
i:integer;
 
procedure AddToSpis(var Head1:PNode;k:integer);
var
tmp:PNode;
begin
  if Head1=nil then
    begin
      New(Head1);
      tmp:=Head1;
    end
  else
     begin
       tmp:=Head1;
         while tmp^.next <> nil do
           tmp:=tmp^.next;
         New(tmp^.next);
         tmp:=tmp^.next;
     end;
  tmp^.next:=nil;
  tmp^.data:=k;
end;
procedure Print(Head1:PNode);
begin
   while Head1 <> nil do
     begin
       write(Head1^.data:4);
       Head1:=Head1^.next;
     end;
end;
procedure FreeSpis(var Head1:PNode);
var
tmp:PNode;
begin
  while Head1 <> nil do
     begin
       tmp:=Head1;
       Head1:=Head1^.next;
       Dispose(tmp);
     end;
end;
procedure SearchAndChange(var Head1:PNode);
var
min,max,tmp,tmp1:PNode;
k:integer;
begin
  min:=Head1;
  max:=Head1;
  tmp1:=Head1;
    while tmp1^.next <> nil do
      begin
        tmp:=tmp1^.next;
          if tmp^.data > max^.data then
             max:=tmp;
          if tmp^.data < min^.data then
             min:=tmp;
        tmp1:=tmp1^.next;
      end;
begin
tmp1:=head;
while (min^.data>max^.data) do
  begin
  tmp1:=tmp1^.next;
  end;
dispose(tmp1);
end;
 
end;
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
11.07.2013, 00:03
Vldslv, ты молодец. Во втором коде ты был близок к решению.
---
Предлагаю сделать так:
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
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
program Project1;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Указатель на элемент списка.}
  TPElem = ^TElem;
  {Элемент списка.}
  TElem = record
    Data : TData;   {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент.}
  end;
  {Список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Процедура инициализации списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка. Иначе, произойдёт утечка памяти.}
procedure Init(var aL : TDList);
begin
  aL.PFirst := nil;
  aL.PLast := nil;
end;
 
{Добавление элемента в конец списка.}
procedure Add(var aL : TDList; const aData : TData);
var
  PNew : TPElem;
begin
  New(PNew);
  PNew^.Data := aData;
  PNew^.PNext := nil;
  if aL.PFirst = nil then
    aL.PFirst := PNew
  else
    aL.PLast^.PNext := PNew;
  aL.PLast := PNew;
end;
 
{Освобождение памяти, занятой под список.}
procedure ListFree(var aL : TDList);
var
  PCur, PDel : TPElem;
begin
  PCur := aL.PFirst;
  while PCur <> nil do begin
    PDel := PCur;
    PCur := PCur^.PNext;
    Dispose(PDel);
  end;
  Init(aL);
end;
 
{Распечатка всего списка.}
procedure LWriteln(var aL : TDList);
var
  PCur : TPElem;
  i : Integer;
begin
  PCur := aL.PFirst;
  i := 0;
  while PCur <> nil do begin
    Inc(i);
    if i > 1 then Write(', ');
    Write(PCur^.Data);
    PCur := PCur^.PNext;
  end;
  if i = 0 then
    Writeln('Список пуст.')
  else
    Writeln;
end;
 
{Поиск первого наименьшего и последнего наибольшего элементов.
Процедура возвращает:
aPMin, aPMax - указатели на первый наименьший элемент и на последний
наибольший элементы.
aDir = True - если элемент aPMin расположен левее, чем aPMax.
aDir = False - если элемент aPMin расположен правее, чем aPMax.
Если в списке только один элемент, то он будет первым наименьшим
и одновременно - последним наибольшим. В этом случае aDir = True.}
procedure FindMinMax(const aL : TDList; var aPMin, aPMax : TPElem; var aDir : Boolean);
var
  PCur : TPElem;
begin
  if aL.PFirst = nil then Exit;
 
  aDir := True;
  PCur := aL.PFirst;
  aPMin := PCur;
  aPMax := PCur;
  PCur := PCur^.PNext;
  while PCur <> nil do begin
    if PCur^.Data < aPMin^.Data then begin
      aPMin := PCur;
      aDir := False;
    end;
    if PCur^.Data >= aPMax^.Data then begin
      aPMax := PCur;
      aDir := True;
    end;
    PCur := PCur^.PNext;
  end;
end;
 
{Удаление из списка элементов, которые расположены между элементами aP1 и aP2.}
function Del(var aP1, aP2 : TPElem; const aDir : Boolean) : Integer;
var
  PCur, PDel, P1, P2 : TPElem;
  Cnt : Integer;
begin
  Cnt := 0; {Количество удалённых элементов.}
  if aP1 = aP2 then begin
    Del := 0;
    Exit;
  end;
  {Определяем указатели P1 и P2 таким образом, чтобы указатель P1 указывал
  на элемент, который расположен левее элемента, на который указывает
  указатель P2.
  Если aDir = True, значит aP1 расположен левее, чем aP2.
  Если aDir = False, значит aP1 расположен правее, чем aP2.}
  if aDir then Begin
    P1 := aP1;
    P2 := aP2;
  end else begin
    P1 := aP2;
    P2 := aP1;
  end;
  {Удаляем элементы, которые расположены между элементами P1 и P2.}
  PCur := P1^.PNext;
  while PCur <> P2 do begin
    PDel := PCur;
    PCur := PCur^.PNext;
    Dispose(PDel);
    Inc(Cnt);
  end;
  {Связываем элементы P1 и P2.}
  P1^.PNext := P2;
  Del := Cnt;
end;
 
{Добавление элементов в список.}
procedure WorkAdd(var aL : TDList);
var
  S : String;
  Data : TData;
  Code : Integer;
begin
  Writeln('Добавление элементов в список.');
  Writeln('Ввод каждого значения завершайте нажатием Enter.');
  Writeln('Чтобы прекратить ввод, оставьте пустую строку и нажмите Enter.');
  repeat
    Write('Элемент: ');
    Readln(S);
    if S <> '' then begin
      Val(S, Data, Code);
      if Code = 0 then
        Add(aL, Data)
      else
        Writeln('Неверный ввод. Повторите.');
    end;
  until S = '';
  Writeln('Ввод элементов списка завершён.');
end;
 
var
  L : TDList;
  PMin, PMax : TPElem;
  Dir : Boolean;
  Cmd, Cnt : Integer;
begin
  {Начальная инициализация списка.}
  Init(L);
 
  repeat
    {Меню.}
    Writeln('---Выберите действие:');
    Writeln('1: Добавление элементов в список.');
    Writeln('2: Распечатка всего списка.');
    Writeln('3: Удаление элементов между первым наименьшим и последним наибольшим.');
    Writeln('4: Очистка списка.');
    Writeln('5: Выход.');
    Write('---Введите команду: ');
    Readln(Cmd);
    case Cmd of
      1: WorkAdd(L);
      2:
      begin
        Writeln('Содержимое списка:');
        LWriteln(L);
      end;
      3:
        if L.PFirst <> nil then begin
          FindMinMax(L, PMin, PMax, Dir);
          Cnt := Del(PMin, PMax, Dir);
          Writeln('Первый наименьший элемент: ', PMin^.Data);
          Writeln('Последний наибольший элемент: ', PMax^.Data);
          Writeln('Удалено элементов: ', Cnt);
          Writeln('Список после обработки:');
          LWriteln(L);
        end else begin
          Writeln('Список пуст. Действие отменено.');
        end;
      4, 5:
      begin
        ListFree(L);
        Writeln('Память, выделенная для списка, освобождена (список очищен).');
      end;
      else
        Writeln('Незарегистрированная команда. Повторите ввод.');
    end;
  until Cmd = 5;
 
  Writeln('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2013, 00:03
Помогаю со студенческими работами здесь

В одномерном целочисленном массиве поменяйте местами последний наименьший и первый наибольший элементы
В одномерном целочисленном массиве поменяйте местами последний наименьший и первый наибольший элементы. Выведите исходный и изменённый...

В произвольном массиве найти номер первого положительного и последнего отрицательного элемента и все элементы расположенные между ними
Подскажите условие для вывода на экран в массиве первый положительный элемент и последний отрицательный и то что между ними! заранее...

В одномерном массиве найти два максимальных элемента и удалить все элементы между ними
Дана задача : В одномерном массиве найти два максимальных элемента и удалить все элементы между ними. Массив задается случайным образом. ...

В одномерном массиве найти два максимальных элемента и удалить все элементы между ними
Есть задача: В одномерном массиве найти два максимальных элемента и удалить все элементы между ними. Массив у меня задается случайным...

Поменять местами: наибольший и наименьший; наибольший и последний элементы последовательности
Здравствуйте, пожалуйста помогите со следующей задачей.... Даны действительные числа a_1,a_2,....a_n (все попарно различные). Поменять в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru