0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 85
1

Списки. Перевернуть список

17.02.2020, 18:37. Показов 1437. Ответов 8

Здравствуйте!Помогите допилить код... 5-6-7 пункт в меню, спасиб.
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
type 
Link = ^Number; 
Number = record 
ID: integer; 
Cislo : real; 
NextRec: Link; 
end; 
var i, c,k,l,v,nnn: integer; 
a,j: real; 
Last, First, Curr, spisok, tmp ,buf: Link; 
 
procedure Add(var spis1:Link ;znach1: real); 
var 
tmp:Link; 
begin 
if spis1=nil then {Проверяем не пуст ли список, если пуст, то } 
begin 
new(spis1); {создаём его первый элемент} 
tmp:=spis1; 
end 
else {в случае если список не пуст} 
begin 
tmp:=spis1; 
while tmp^.nextrec<>nil do 
tmp:=tmp^.nextrec; {ставим tmp на последний элемент списка} 
new(tmp^.nextrec); {создаём следующий элемент} 
tmp:=tmp^.nextrec; {переносим tmp на новый элемент} 
end; 
tmp^.nextrec:=nil; {зануляем указатель} 
tmp^.cislo:=znach1; {заносим значение} 
end; 
 
procedure ShowList(first: link); 
begin 
Writeln('Список элементов:'); 
if first=nil then writeln('В списке нет элементов') 
else 
begin 
while first<>nil do 
begin 
writeln(first^.cislo); 
first:=first^.nextrec; 
end; 
end; 
end; 
 
Procedure Del(var first:link; y:real); 
Var z,x,dx:link; 
Begin 
z:=first; 
While z<>Nil do 
if z^.cislo=y then 
if z=first then 
begin 
x:=first; 
first:=first^.nextrec; 
Dispose(x); 
z:=first 
end 
else 
begin 
x:=z; 
z:=z^.nextrec; 
dx^.nextrec:=z; 
Dispose(x); 
end 
else 
begin 
dx:=z; 
z:=z^.nextrec 
end; 
End; 
 
Procedure proverka(var first:link; y:real); 
Var z,x,dx:link; 
Begin 
z:=first; 
While z<>Nil do 
if z^.cislo=y then 
begin
writeln('Такой элемент есть');
x:=first; 
first:=first^.nextrec; 
z:=nil
end 
else 
begin 
x:=first; 
z:=z^.nextrec;
z:=nil;
writeln('Такого элемента нет');  
end;  
end;
 
Procedure Del_1(var first:link; y:real); 
Var z,x,dx:link; 
Begin 
z:=first; 
While z<>Nil do 
if z^.cislo<0 then 
if z=first then 
begin 
x:=first; 
first:=first^.nextrec; 
Dispose(x); 
z:=first 
end 
else 
begin 
x:=z; 
z:=z^.nextrec; 
dx^.nextrec:=z; 
Dispose(x); 
end 
else 
begin 
dx:=z; 
z:=z^.nextrec 
end; 
End;
 
Procedure perenos(var first:link); 
Var z:link; 
Begin 
if (first<>nil) and (first^.nextrec<>nil) then
begin
  z:=first^.nextrec;
  while z^.nextrec<>nil do z:=z^.nextrec;
  z^.nextrec:=first;
  first:=first^.nextrec;
  z^.nextrec^.nextrec:=nil;
  end;
end;
 
 
 
 
begin 
Writeln('Укажите длину списка: '); 
Readln(c); 
first:=nil; 
Writeln('Введите элементы:'); 
for i:= 1 to c do 
begin 
read(a); 
add(first,a); 
end;
Writeln('1)Удалить элементы ');
Writeln('2)Проверить, если ли одинаковые элементы');
Writeln('3)Удалить все отрицательные элементы');
Writeln('4)Перенести в конец 1 элемент');
Writeln('5)Перевернуть список');
Writeln('6)Оставить один из повторяющихся элементов');
Writeln('7)Вставить новый элемент за каждым вхождением элемента');
Writeln('8)Выход.');
Writeln('9)Посмотреть список');
 
readln(v); 
case v of
      1:begin
          write('Что удалить: ');
          readln(j); 
          Del (first, j); 
          ShowList(first);
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end;
      2:begin
          write('Проверить данный элемент: ');
          readln(j);
          proverka(first, j); 
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end; 
      3:begin
          write('Без отрицательных чисел: ');
          Del_1 (first, j); 
          ShowList(first);
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end;
      4:begin
          write('Первый элемент перешел ');
          perenos(first);
          ShowList(first);
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end;
      5:begin
          end;
      6:begin
          end;
      7:begin
          end;
      8:begin
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end;
      9:begin
          ShowList(first);
          writeln('<<<PRESS ENTER>>'); 
          readln;
          end;
end;
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2020, 18:37
Ответы с готовыми решениями:

7. Написать программу, содержащую функцию, которая определяет, входит ли список М1 в список М2. Предполагается, что списки существуют
7. Написать программу, содержащую функцию, которая определяет, входит ли список М1 в список М2....

Объектно-ориентированное программирование: перевернуть список
Составить программу, которая переворачивает список L, т.е изменяет ссылки в этом списке так, чтобы...

Список: перевернуть список
Дан список А, состоящий из записей: первое поле – символ, второе – адрес следующего элемента....

Как перевернуть списки в словаре?
есть словарь, для каждого ключа в словаре есть один список нужно перевернуть эти списки для...

8
5042 / 2618 / 2343
Регистрация: 10.12.2014
Сообщений: 9,973
17.02.2020, 19:14 2
А зачем у вас „ID“?

Pascal
1
Writeln('1)Удалить элементы ');
Так все нужно удалять или равные введённому?

Pascal
1
Writeln('2)Проверить, если ли одинаковые элементы');
А у вас зачем-то ищется только определённый элемент!

Зачем в Del_1 (first, j); лишний параметр?

А самое главное:
— запускаем программу
— вводим список
— выбрали «9» его просмотр
— он вывелся в колонку
Всё! Программа завершилась…

— запускаем программу
— вводим список
— выбрали любое другое действие
— он отработал и завершил программу даже не показав результата!
1
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 85
17.02.2020, 19:14  [ТС] 3
Да, лишний, не заметил.
1 пункт работает, там получается надо удалить тот, который ты вводишь с клавиатуры.
А во 2 пункте должно работать. Там 2 одинаковых надо найти)
Любое другое действие, это т.е. больше 9 ? Условие поставить чет не подумал, но в меню же указано номер действий, которые нужно выполнить.
А насчет "ID" добавлял его для чего-то,мысли были, но не использовал, спасибо, убрал.
0
5042 / 2618 / 2343
Регистрация: 10.12.2014
Сообщений: 9,973
18.02.2020, 07:38 4
Лучший ответ Сообщение было отмечено Like a Sir как решение

Решение

Like a Sir, задание (как оно есть) в студию!

Добавлено через 2 часа 27 минут
Цитата Сообщение от Like a Sir Посмотреть сообщение
А во 2 пункте должно работать. Там 2 одинаковых надо найти)
Т.е. если список 5: 1 2 1 3 2, а будет введено 8, то результат не получится, хотя повторяются 1 и 2

Добавлено через 53 минуты
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
type
  tList = class
    N : Real;
    X : tList;
    
    constructor (N : Real);
    begin
      Self.N := N;
      Self.X := nil;
    end;
    
    function Contains(N : Real) : Boolean;
    begin
      var Cur := Self;
      Result := Self.N = N;
      if Not Result And (X <> nil) then
        Result := X.Contains(N);
    end;
    
  end;
  
procedure Add(var List : tList; N : Real); 
begin 
  if List = nil then
    List := New tList(N)
  else
    begin
      var Cur := List;
      while Cur.x <> nil do Cur := Cur.x;
      Cur.x := New tList(N);
    end;
end; 
 
function CreateList : tList;
begin
  Result := nil;
  var count := ReadLnInteger('Укажите длину списка:'); 
  WriteLn('Введите элементы:'); 
  loop count do Add(Result, ReadReal);
end;
 
procedure ShowList(List : tList);
begin
  PrintLn;
  'Список элементов:'.Print;
  if List = nil then
    'пуст.'.Print
  else
    repeat
      List.N.Print;
      List := List.x;
    until List = nil;
  PrintLn;
end; 
 
procedure действие1(var List : tList);
begin
  if List = nil then
    'Список пуст.'.Println
  else
    begin
      var d := ReadLnReal('Что удалять:');
      if List.Contains(d) then
        'Список не содержит {d}'.Println
      else
        begin
          var count := 0;
          while (List <> nil) and (List.N = d) do begin List := List.X; count += 1; end; // удаление из головы
          var Cur := List;
          while (Cur <> nil) and (Cur.X <> nil) do
            if Cur.X.N = d then
              begin Cur.X := Cur.X.X; count += 1; end // удаление из середины и конца
            else
              Cur := Cur.X;
          $'Удалено элементов {count}'.Println;
        end;
    end;
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие2(List : tList);
begin
  var Cur := List;
  var TmpList : tList := nil;
  while Cur <> nil do
    begin
      if (Cur.X <> nil) and Cur.X.Contains(Cur.N) then
        begin
          if TmpList = nil then
            'Повторяющиеся:'.Print;
          if (TmpList = nil) Or Not TmpList.Contains(Cur.N) then
            begin
              Cur.N.Print;
              Add(TmpList, Cur.N);
            end;
        end;
      Cur := Cur.X;
    end;
  if TmpList = nil then
    'Повторяющихся нет!'.Print;
  PrintLn;
  
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие3(var List : tList);
begin
  var count := 0;
  while (List <> nil) and (List.N < 0) do
    begin List := List.X; count += 1; end;
  var Cur := List;
  while (Cur <> nil) and (Cur.X <> nil) do
    if Cur.X.N < 0 then
      begin Cur.X := Cur.X.X; count += 1; end
    else
      Cur := Cur.X;
 
  if count = 0 then
    'Не найдено отрицательных!'.Println
  else
    $'Удалено отрицательных элементов {count}'.Println;
 
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие4(var List : tList);
begin
  if List = nil then
    'Список пуст.'.Println
  else if List.X = nil then
    'Список из одного элемента.'.Println
  else
    begin
      var Tmp := List;
      List := List.X;
      var Last := List;
      while Last.X <> nil do
        Last := Last.X;
      Last.X := Tmp;
      Tmp.X := nil;
      'Первый элемент перемещён в конец списка.'.Println;
    end;
 
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие5(var List : tList);
begin
  if List = nil then
    'Список пуст.'.Println
  else if List.X = nil then
    'Список из одного элемента.'.Println
  else
    begin
      var Head : tList := nil;
      repeat
        var Tmp := List;
        List := List.X;
        Tmp.X := Head;
        Head := Tmp;
      until List = nil;
      List := Head;
      'Список инвертирован.'.Println;
    end;
 
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие6(var List : tList);
begin
  if List = nil then
    'Список пуст.'.Println
  else if List.X = nil then
    'Список из одного элемента.'.Println
  else
    begin
      var (Cur, count) := (List, 0);
      repeat
        if (Cur.X <> nil) and Cur.X.Contains(Cur.N) then // есть что удалять
          begin
            var Tmp := Cur;
            while Tmp.X.N <> Cur.N do // ищем повтор
              Tmp := Tmp.X;
            Tmp.X := Tmp.X.X; // удаляем
            count += 1;
          end
        else
          Cur := Cur.X;
      until Cur = nil;
      if count = 0 then
        'Повторений не найдено'.Println
      else
        $'Удалено повторений {count}'.Println;
    end;
 
  ReadLnString('Для продолжения жми Enter');
end;
 
procedure действие7(var List : tList);
begin
  if List = nil then
    'Список пуст.'.Println
  else
    begin
      var X := ReadLnReal('После чего делать встаку?');
      if Not List.Contains(X) Then
        $'Элементов со значением {X} нет!'.Println
      else
        begin
          var N := ReadLnReal('Что вставлять?');
          var (Cur, count) := (List, 0);
          repeat
            if Cur.N = X then // после него добаляем
              begin
                var Tail := Cur.X;
                Cur.X := New tList(N);
                Cur := Cur.X;
                Cur.X := Tail;
                count += 1;
              end;
            Cur := Cur.X;
          until Cur = nil;
          $'Добавлено элементов {count}'.Println;
        end;
    end;
 
  ReadLnString('Для продолжения жми Enter');
end;
 
function MainMenu : Integer;
begin
  WriteLn('~'*30);
  Writeln('1) Удалить элементы ');
  Writeln('2) Проверить, если ли одинаковые элементы');
  Writeln('3) Удалить все отрицательные элементы');
  Writeln('4) Перенести в конец первый элемент');
  Writeln('5) Перевернуть список');
  Writeln('6) Оставить один из повторяющихся элементов');
  Writeln('7) Вставить новый элемент за каждым вхождением элемента');
  Writeln('9) Выход');
  WriteLn('~'*30);
  Result := ReadLnInteger('Введите номер действия:');
  WriteLn;
end;
 
begin
  var List := CreateList;
  
  var v : Integer;
  repeat
    ShowList(List);
    v := MainMenu;
    case v of
      1 : действие1(List);
      2 : действие2(List);
      3 : действие3(List);
      4 : действие4(List);
      5 : действие5(List);
      6 : действие6(List);
      7 : действие7(List);
    end;
  until v=9;
  
end.
2
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 85
18.02.2020, 16:24  [ТС] 5
Cпасиб, все работает, но кроме 1.(Это где удаление элемента)

Добавлено через 2 минуты
Списки вот тут все задания)
0
5042 / 2618 / 2343
Регистрация: 10.12.2014
Сообщений: 9,973
18.02.2020, 16:25 6
Ну вот же:
68 строка удаляет если он в начале
72 строка — если в середине и конце
1
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 85
18.02.2020, 16:31  [ТС] 7
Но я думаю, что он должен удалить именно один из элементов введенного с клавиатуры и который есть в списке, а так не работает( Пишет нет 'Список не содержит {d}'.Println

Добавлено через 4 минуты
Да и эти задания надо было с указателями решить, ну да ладно)
0
5042 / 2618 / 2343
Регистрация: 10.12.2014
Сообщений: 9,973
18.02.2020, 16:34 8
Профиксил:
Pascal
63
64
      if Not List.Contains(d) then
        $'Список не содержит {d}'.Println
Добавлено через 1 минуту
А это и есть указатели только в PABC.NET.
Вот читайте: Связные списки - новый стиль
1
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 85
18.02.2020, 16:37  [ТС] 9
Да, тоже решил сейчас(посмотрел на 7 действие), теперь работает)
Благодать!)

Добавлено через 2 минуты
Спасибо за информацию!)
Остальные попытаюсь доделать сам)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2020, 16:37
Помогаю со студенческими работами здесь

Имеется список женихов и список невест. Объединить эти списки в список пар с учетом требований партнерам
Имеется список женихов и список невест. Каждая запись списка содержит пол, имя, возраст, рост, вес,...

Список женихов и невест. Обьеденить списки в списки пар.
Имеется список женихов и невест. каждая запись списка содержит пол, имя, возраст, рост, вес, а...

Перевернуть список
с помощью car cds и coms перевернуть список (a b (( c d) e f )g h ) Добавлено через 6 минут...

Перевернуть список
Помогите решить задание, плиз! Переставьте элементы данного списка в обратном порядке, затем...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru