Представление последовательности строк в виде линейного списка - PascalABC.NET
Формулировка задачи:
Задача.
Используйте представление последовательности строк в виде линейного списка и опишите процедуру ДОБАВИТЬ (L , i , j), добавляющую после i-ой строки списка L копию j-й строки.
Решение задачи: «Представление последовательности строк в виде линейного списка»
textual
Листинг программы
type
tList = class
S : String;
Next : tList;
constructor (insS : String; pNext : tList);
begin
S := insS;
Next := pNext;
end;
procedure Печать(msg : String := '');
begin
if msg <> '' then WriteLn(msg);
var Cur := Self;
var N := 0;
while Cur <> nil do
begin
N += 1;
WriteLn(N, ' : ', Cur.S);
Cur := Cur.Next;
end;
if N = 0 then
WriteLn('< Список пуст >');
end;
function Count : Integer;
begin
Result := 0;
if Self <> nil then
begin
var Cur := Self;
repeat
Result += 1;
Cur := Cur.Next;
until Cur = nil;
end;
end;
function Получить(N : Integer) : String;
begin
Result := '';
if Self <> nil then
begin
var Cur := Self;
repeat
N -= 1;
if N = 0 then
begin
Result := Cur.S;
Exit;
end;
Cur := Cur.Next;
until Cur = nil;
end;
end;
end;
function ReadToList : tList;
begin
var First : tList := nil;
var R : String;
repeat
var S := ReadLnString('строка =');
if First = nil then
First := New tList(S, nil)
else
begin
var Cur := First;
while Cur.Next <> nil do
Cur := Cur.Next;
Cur.Next := New tList(S, nil);
end;
R := ReadLnString('Продолжить ввод? (Y или Yes означает ответ «да») :');
until NOT((R.Length > 0) and (UpperCase(R)[1] = 'Y'));
Result := First;
end;
//function ReadTextToList(fName : String) : tList;
//begin
// var First : tList := nil;
// WriteLn('Читаем файл в список: ', fName);
// foreach var S in System.IO.File.ReadLines(fName) do
// begin
// if First = nil then
// First := New tList(S, nil)
// else
// begin
// var Cur := First;
// while Cur.Next <> nil do
// Cur := Cur.Next;
// Cur.Next := New tList(S, nil);
// end;
// end;
// Result := First;
//end;
procedure Добавить(var List : tList; i, j : Integer);
begin
if (i < 1) or (j < 1) or (i > List.Count) or (j > List.Count) then
WriteLn('Индекс не входит в размер списка.')
else
begin
var S := List.Получить(j);
if List <> nil then
begin
var Cur := List;
while i > 1 do
begin
Cur := Cur.Next;
i -= 1;
end;
Cur.Next := New tList(S, Cur.Next);
end;
end;
end;
begin
var List := ReadToList;
//var List := ReadTextToList('12345.txt');
List.Печать('Список из файла:');
Добавить(List, ReadLnInteger('После строки № '), ReadLnInteger('Добавить копию строки № '));
List.Печать('Список после добавления:');
end.
Объяснение кода листинга программы
- Объявлен тип данных tList, который представляет собой линейный список строк.
- В функции ReadToList создается новый экземпляр списка при каждой итерации цикла и добавляется в конец списка.
- В функции ReadTextToList читаются строки из файла и добавляются в список.
- В процедуре Добавить проверяется корректность индексов и создается новый экземпляр списка с указанным содержимым.
- В основной функции создается экземпляр списка, считывается его содержимое, печатается на экране, добавляется строка в список и снова печатается его содержимое.