Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
53 / 0 / 2
Регистрация: 11.01.2014
Сообщений: 25

Описать процедуру, которая вставляет в непустой список L пару новых элементов Е1 и Е2 перед его последним элементом

12.01.2014, 11:21. Показов 4580. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описать процедуру, которая вставляет в непустой список L пару новых элементов Е1 и Е2 перед его последним элементом
Помогите пожалуйста превратить в работоспособную, самое галвно чтоб новые элементы добавлялись перед последним)
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
Program Spisok;
uses
  crt; 
type
  Tinf=integer; {тип данных, который будет храниться в элементе списка}
  List=^TList;  {Указатель на элемент типа TList}
  TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
    data:TInf;  {данные, хранимые в элементе}
    next:List;   {указатель на следующий элемент списка}
  end;
 
{Процедура добавления нового элемента в односвязный список}
procedure AddElem(var spis1:List;znach1:TInf);
var
  tmp:List;
begin
  begin
    tmp:=spis1;
    while tmp^.next<>nil do
      tmp:=tmp^.next; {ставим tmp на последний элемент списка}
    GetMem(tmp^.next,sizeof(TList)); {создаём следующий элемент}
    tmp:=tmp^.next;   {переносим tmp на новый элемент}
  end;
  tmp^.next:=nil; {зануляем указатель}
  tmp^.data:=znach1; {заносим значение}
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2014, 11:21
Ответы с готовыми решениями:

Написать процедуру, которая вставляет в непустой список L новый элемент E перед его последним элементом
Помогите пожалуйста

Вставить в непустой список L пару новых элементов E1 и E2 перед его последним элементом
Вставить в непустой список L пару новых элементов E1 и E2 перед его последним элементом.Вот программа,не знаю как вставить элементы,со...

Написать программу, которая вставляет в список L пару новых элементов F1 и F2 перед последним элементов
Создайте файл символов. Разместить элементы файла в динамической памяти. Написать программу, которая вставляет в список L пару новых...

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
12.01.2014, 16:02
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
procedure AddElem(var spis1:List;znach1:TInf);
var
  p, t : List;
begin
  new(t);
  t^.data := znach1;
 
  p := spis1;
  if (p = nil) or (p^.next = nil) then // spis1 или пустой, или состоит только из одного элемента
  begin
    // тогда надо сделать НОВЫЙ элемент первым (указать next-ом на spis1, и изменить значение spis1)
    t^.next := spis1;
    spis1 := t;
  end
  else // в списке было больше одного элемента
  begin
    // значит, идем по списку, пока не встретим ПРЕДпоследний элемент
    while p^.next^.next <> nil do p := p^.next;
    // новый элемент будет указывать на последний
    t^.next := p^.next;
    // а ПРЕДпоследний - на новый...
    p^.next := t;
  end;
end;
Собственно, это всё...
1
53 / 0 / 2
Регистрация: 11.01.2014
Сообщений: 25
12.01.2014, 16:27  [ТС]
Выдёт ошибки, пробовала на ФП и на Pascalabc.net/wde и там и там ошибки выдвигает мне.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
12.01.2014, 17:58
Цитата Сообщение от MashaZazdravnih Посмотреть сообщение
Выдёт ошибки, пробовала на ФП
Неправда. Я тестировал эту процедуру именно на FPC, там никаких ошибок нет близко:
1
53 / 0 / 2
Регистрация: 11.01.2014
Сообщений: 25
12.01.2014, 18:16  [ТС]
Можешь свой код, который запускал, залить сюда?)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
12.01.2014, 22:25
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
Program Spisok;
uses
  crt;
type
  Tinf=integer;
  List=^TList;
  TList=record
    data:TInf;
    next:List;
  end;
 
procedure AddElem(var spis1:List;znach1:TInf);
var
  p, t : List;
begin
  new(t);
  t^.data := znach1;
 
  p := spis1;
  if (p = nil) or (p^.next = nil) then
  begin
    t^.next := spis1;
    spis1 := t;
  end
  else
  begin
    while p^.next^.next <> nil do p := p^.next;
    t^.next := p^.next;
    p^.next := t;
  end;
end;
 
var
  L, q : list;
begin
  l := nil;
  addelem(l, 1);
  addelem(l, 2);
  addelem(l, 3);
  addelem(l, 4);
  addelem(l, 5);
  addelem(l, 6);
 
  q := l;
  while q <> nil do
  begin
    write(q^.data:4);
    q := q^.next;
  end;
  writeln;
  readln;
end.
2
53 / 0 / 2
Регистрация: 11.01.2014
Сообщений: 25
13.01.2014, 05:30  [ТС]
Спасибо,заработала программа)))
0
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 36
01.02.2014, 19:18
Где я привязал процедуру к своей программе неверно?
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
Uses crt;
type tinf=integer;
     uk=^rec;
     rec=record
      x:integer;
      adr:uk;
     end;
Var first, p1, p2, p3, l, q:uk;
    f:text;
 
procedure SOZD_SPIS ;
begin
assign(f,'dinspis.txt');
reset(f);
first:=nil;
while not seekeof(f) do begin
new(p1); read(f,p1^.x);
if first=nil then first:=p1
else p2^.adr:=p1;
p2:=p1;
end;
p2^.adr:=nil;
close(f);
end;
 
Procedure VIVOD(t:string) ;
begin
writeln(t);
p1:=first;
while p1<>nil do begin
write (p1^.x, ' ');
p1:=p1^.adr;
end;
writeln;
end;
 
procedure AddElem(var spis1:uk;znach1:tinf);
var
  p,t:uk;
begin
  new(t);
  t^.x := znach1;
  p:=spis1;
  if (p = nil) or (p^.adr = nil) then
  begin
    t^.adr:=spis1;
    spis1:=t;
  end
  else
  begin
    while p^.adr^.adr <> nil do p:=p^.adr;
    t^.adr := p^.adr;
    p^.adr := t;
  end;
end;
 
Begin
SOZD_SPIS;
VIVOD('исходн');
  l:=nil;
  addelem(l, 1);
  q:=l;
  while q<>nil do
  begin
    write(q^.x:4);
    q:=q^.adr;
  end;
  writeln;
  readln;
VIVOD('после вставки');
readkey;
End.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
01.02.2014, 20:00
Собственно, а что неправильно? Список создается, выводится. То, что потом создается новый элемент, и печатается он один - это ж не проблема процедуры, правда?

А если сделать так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Begin
SOZD_SPIS;
VIVOD('исходн');
  l:=nil;
  addelem(l, 1);
  l^.adr := first; // <--- 
  
  q:=l;
  VIVOD('после вставки');
  while q<>nil do
  begin
    write(q^.x:4);
    q:=q^.adr;
  end;
  writeln;
  readln;
End.
, то вообще будет все прекрасно, напечатается список с добавленный первым элементом...
1
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 36
01.02.2014, 20:06
Действительно, совсем не там рылся на поиски ошибки, оказывается, спасибо.
P.S. Да, печатается, но всё-таки как теперь разместить этот новый элемент перед последним элементом?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
01.02.2014, 21:10
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Begin
  SOZD_SPIS;
  VIVOD('исходн');
  l:=nil;
  addelem(l, 1);
 
  q := first;
  while (q^.adr <> nil) and (q^.adr^.adr <> nil) do q := q^.adr; // пробегаем до предпоследнего
  l^.adr := q^.adr; // переназначаем указатели
  q^.adr := l;
 
  q:=first; // и выводим новый список...
  while q<>nil do
  begin
    write(q^.x:4);
    q:=q^.adr;
  end;
  writeln;
  readln;
End.
1
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 36
02.02.2014, 16:15
UI, а не являются ли в этой процедуре
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
procedure DOBAVLENIE(var first:uk);
var
  D:uk;
begin
  p2:=nil;
  new(D);
  writeln('Введите новый элемент');
  readln(D^.x);
  p1:=p2;
  if (p1=nil) or (p1^.adr=nil) then //список или пустой или только из одного элемента
      begin
        D^.adr:=p2; //тогда новый элемент сделаем первым
        p2:=D;
      end
  else //если же в списке больше одного элемента 
      begin
        while p1^.adr^.adr<>nil do p1:=p1^.adr; //тогда идем по списку,пока не встретим предпоследний элемент
        D^.adr:=p1^.adr; //новый элемент будет указывать на последний
        p1^.adr:=D; //а предпоследний элемент будет указывать на новый
      end;
  p3:=first;
  while (p3^.adr<>nil) and (p3^.adr^.adr<>nil) do p3:=p3^.adr; // пробегаем до предпоследнего
  p2^.adr:=p3^.adr; // переназначаем указатели
  p3^.adr:=p2;
end;
вот эти моменты дублирующими друг друга?
Pascal
1
2
3
4
  p3:=first;
  while (p3^.adr<>nil) and (p3^.adr^.adr<>nil) do p3:=p3^.adr; // пробегаем до предпоследнего
  p2^.adr:=p3^.adr; // переназначаем указатели
  p3^.adr:=p2;
Pascal
1
2
3
4
5
begin
        while p1^.adr^.adr<>nil do p1:=p1^.adr; //тогда идем по списку,пока не встретим предпоследний элемент
        D^.adr:=p1^.adr; //новый элемент будет указывать на последний
        p1^.adr:=D; //а предпоследний элемент будет указывать на новый
      end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
02.02.2014, 22:25
Являются. Можно сделать так:
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
procedure DOBAVLENIE(var first:uk);
var
  p, D:uk; // никогда (если не хочешь глюков) не работай через глобальные переменные
begin
  new(D);
  writeln('Введите новый элемент');
  readln(D^.x);
 
  p := first;
  if p = nil then // проверяем на пустой список
  begin
    D^.adr := nil;
    first := D;
  end
  else
    if p^.adr = nil then // есть только один элемент - уже можно добавить "перед ним", но надо изменять first
    begin
      D^.adr := first;
      first := d;
    end
    else // остальные случаи: элемент корректно добавится на предпоследнюю позицию
    begin
        while p^.adr^.adr<>nil do p:=p^.adr;
        D^.adr:=p^.adr;
        p^.adr:=D;
    end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2014, 22:25
Помогаю со студенческими работами здесь

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

Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением элемента Е
Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением элемента Е.

Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением элемента Е
Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением элемента Е

Процедура, которая вставляет в непустой список L пару новых элементов E1 и E2 перед его последним элементом
Здравствуйте! Подскажите пожалуйста что не так с процедурой последней, программа работает, данные записывает и выводит, но когда пользуюсь...

Вставить пару новых элементов перед последним элементом списка
Вставить пару новых элементов перед последним элементом списка......кто может помогите !


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru