Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
7 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 139

Написать программу, которая вставляет в список L новый элемент F за каждым вхождением элемента E (2)

07.02.2014, 16:15. Показов 1891. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, помогите разобраться с кодом программы.
Надо Написать программу, которая вставляет в список L новый элемент F за каждым вхождением элемента E. Другими словами, код программы есть, но он работает не корректно. После запуска, в CRT надо вводить элементы списка и это продолжается бесконечно. Помогите поправить код. Работаю на PascalABC.
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
program Project1;
uses crt;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип указателя на элемент списка.}
  TPElem = ^TElem;
  {Тип элемента списка.}
  TElem = record
    Data : TData; {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент списка.}
  end;
  {Тип, описывающий однонаправленный список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка! Иначе - будут утечки памяти.}
procedure Init(var aList : TDList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
{Добавление элемента в конец однонаправленного списка.}
procedure Add(var aList : TDList; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
end;
 
{Особождение памяти, занятой под список.}
procedure Free(var aList : TDList);
var
  PNext, PDel : TPElem;
begin
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
{Распечатка однонаправленного списка.}
procedure WriteList(const aList : TDList);
var
  PElem : TPElem;
begin
  if aList.PFirst = nil then begin
    Write('Список пуст.');
    Exit;
  end;
 
  PElem := aList.PFirst;
  while PElem <> nil do begin
    if PElem <> aList.PFirst then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
end;
 
var
  L : TDList;
  PElem, PPrev, PNew : TPElem;
  Data, E, F : TData;
  i, Code : Integer;
  S : String;
begin
  {Начальная инициализация списка.}
  Init(L);
 
  repeat
    //Создание списока.
    Writeln('Создание списка.');
    Writeln('Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Val(S, Data, Code);
        if Code = 0 then begin
          Inc(i);
          Add(L, Data);
        end else
          Writeln('Неверный ввод. Повторите.');
      end;
    until S = '';
    Writeln('Составлен список:');
    WriteList(L);
    Writeln;
 
    repeat
      Write('Задайте значение искомого элемента (E): ');
      Readln(S);
      Val(S, E, Code);
      if Code <> 0 then
        Writeln('Неверный ввод. Повторите.');
    until Code = 0;
    repeat
      Write('Задайте значение вставляемого элемента (F): ');
      Readln(S);
      Val(S, F, Code);
      if Code <> 0 then
        Writeln('Неверный ввод. Повторите.');
    until Code = 0;
 
    {Ищем первый элемент со значением E и в случае его обнаружения
    вставляем перед ним элемент со значением F.
    Чтобы вставить перед элементом новый элемент мы должны знать указатель
    на предыдущий элемент. Для этого заведена переменная PPrev.}
    PPrev := nil; {Указатель на предыдущий элемент списка.}
    PElem := L.PFirst; {Указатель на текущий элемент списка.}
    PNew := nil; {Указатель на новый элемент.}
    while (PElem <> nil) and (PNew = nil) do
      if PElem^.Data = E then begin
        {Выделяем память для нового элемента и получаем указатель на неё.}
        New(PNew);
        {Записываем данные.}
        PNew^.Data := F;
        {К новому элементу прикрепляем ту часть списка, которая идёт после элемента PPrev.}
        PNew^.PNext := PElem;
        {К элелменту PPrev прикрепляем элемент PNew. (А к PNew уже прикреплена остальная часть списка.)}
        if PPrev = nil then
          L.PFirst := PNew
        else
          PPrev^.PNext := PNew;
      end else begin {Переходим к следующей паре элементов.}
        PPrev := PElem;
        PElem := PElem^.PNext; {Получаем указатель на следующий элемент списка.}
      end;
 
    if PNew <> nil then begin
      Writeln('Новый элемент F вставлен в список.');
      Writeln('Список после вставки:');
      WriteList(L);
      Writeln;
    end else
      Writeln('Элемента Е нет в списке. Новый элемент F в список не вставлен.');
 
    {Освобождение памяти, занятой под список.}
    Free(L);
    Writeln('Память, занятая под список, освобождена. Работа завершена.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2014, 16:15
Ответы с готовыми решениями:

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

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

Описать Процедуру, которая вставляет в список L новый эле-мент Е1 за каждым вхождением элемента Е
Описать процедуру, которая вставляет в список L новый элемент Е1 за каждым вхождением элемента Е Кто может объяснить алгоритм выполнения?

2
 Аватар для dimabubyakin
161 / 122 / 85
Регистрация: 16.10.2013
Сообщений: 1,738
07.02.2014, 17:31
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
program Project1;
uses crt;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип указателя на элемент списка.}
  TPElem = ^TElem;
  {Тип элемента списка.}
  TElem = record
    Data : TData; {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент списка.}
  end;
  {Тип, описывающий однонаправленный список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка! Иначе - будут утечки памяти.}
procedure Init(var aList : TDList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
{Добавление элемента в конец однонаправленного списка.}
procedure Add(var aList : TDList; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
end;
 
{Особождение памяти, занятой под список.}
procedure Free(var aList : TDList);
var
  PNext, PDel : TPElem;
begin
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
{Распечатка однонаправленного списка.}
procedure WriteList(const aList : TDList);
var
  PElem : TPElem;
begin
  if aList.PFirst = nil then begin
    Write('Список пуст.');
    Exit;
  end;
 
  PElem := aList.PFirst;
  while PElem <> nil do begin
    if PElem <> aList.PFirst then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
end;
 
var
  L : TDList;
  PElem, PPrev, PNew : TPElem;
  Data, E, F : TData;
  i, Code,k,j : Integer;
  S : String;
begin
  {Начальная инициализация списка.}
  Init(L);
 
  repeat
    //Создание списока.
    Writeln('Создание списка.');
    Writeln('Введите кол-во записей ');
    readln(k);
    i := 0;
    for j:=1 to k do
    begin
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Val(S, Data, Code);
        if Code = 0 then begin
          Inc(i);
          Add(L, Data);
        end else
          Writeln('Неверный ввод. Повторите.');
      end;
    end;
    Writeln('Составлен список:');
    WriteList(L);
    Writeln;
 
    repeat
      Write('Задайте значение искомого элемента (E): ');
      Readln(S);
      Val(S, E, Code);
      if Code <> 0 then
        Writeln('Неверный ввод. Повторите.');
    until Code = 0;
    repeat
      Write('Задайте значение вставляемого элемента (F): ');
      Readln(S);
      Val(S, F, Code);
      if Code <> 0 then
        Writeln('Неверный ввод. Повторите.');
    until Code = 0;
 
    {Ищем первый элемент со значением E и в случае его обнаружения
    вставляем перед ним элемент со значением F.
    Чтобы вставить перед элементом новый элемент мы должны знать указатель
    на предыдущий элемент. Для этого заведена переменная PPrev.}
    PPrev := nil; {Указатель на предыдущий элемент списка.}
    PElem := L.PFirst; {Указатель на текущий элемент списка.}
    PNew := nil; {Указатель на новый элемент.}
    while (PElem <> nil) and (PNew = nil) do
      if PElem^.Data = E then begin
        {Выделяем память для нового элемента и получаем указатель на неё.}
        New(PNew);
        {Записываем данные.}
        PNew^.Data := F;
        {К новому элементу прикрепляем ту часть списка, которая идёт после элемента PPrev.}
        PNew^.PNext := PElem;
        {К элелменту PPrev прикрепляем элемент PNew. (А к PNew уже прикреплена остальная часть списка.)}
        if PPrev = nil then
          L.PFirst := PNew
        else
          PPrev^.PNext := PNew;
      end else begin {Переходим к следующей паре элементов.}
        PPrev := PElem;
        PElem := PElem^.PNext; {Получаем указатель на следующий элемент списка.}
      end;
 
    if PNew <> nil then begin
      Writeln('Новый элемент F вставлен в список.');
      Writeln('Список после вставки:');
      WriteList(L);
      Writeln;
    end else
      Writeln('Элемента Е нет в списке. Новый элемент F в список не вставлен.');
 
    {Освобождение памяти, занятой под список.}
    Free(L);
    Writeln('Память, занятая под список, освобождена. Работа завершена.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Добавлено через 1 минуту
87, 88 и 102 строки изменил, цикл поставил другой, вводишь кол-во записей и все, но программа плохо работает в ABC , я использую turbo pascal

Добавлено через 1 минуту
Можно все сделать через процедуры, будет более удачней, но сейчас увы нет времени(
0
7 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 139
07.02.2014, 17:55  [ТС]
Цитата Сообщение от dimabubyakin Посмотреть сообщение
Можно все сделать через процедуры, будет более удачней, но сейчас увы нет времени(
Спасибо, сейчас попробую. Но, если все таки найдется время, можешь помочь переделать код? Буду ну очень благодарен тебе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2014, 17:55
Помогаю со студенческими работами здесь

Составить программу, которая вставляет в список L новый элемент F за каждым вхождением элемента E
помогите пож.

Составить программу, которая вставляет в список L новый элемент F перед первым вхождением элемента Е
на с++. Составить программу, которая вставляет в список L но¬вый элемент F перед первым вхождением элемента Е, если Е входит в L.

Вставить в список L новый элемент F за каждым вхождением элемента E
Здравствуйте, выручите студента недоучку =))) работу надо сдать уже завтра. Задача стоит такая Все работает правильно за одним только...

Вставить в список L новый элемент E1 за каждым вхождением заданного элемента E
Помогите написать эту часть программы(Вставить в список L новый элемент E1 за каждым вхождением заданного элемента E) на c++ или Visual...

Вставить в список L новый элемент E1 за каждым вхождением заданного элемента E
Помоги те пожалуйста дополнить программу, ( Вставить в список L новый элемент E1 за каждым вхождением заданного элемента E) using System;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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
/ * Дана цепь постоянного тока с 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/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru