Поиск числа в однонаправленном списке - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Доброго дня. Очень хочу разобраться, как работать со списками. Дана задача: создать текстовый файл, записать не менее 15 строк с числами от 0 до 100. Считать эти данные и записать числа в бинарный файл, где на каждое число выделяется по 1 байту. После создать из этих данных ОДНОНАПРАВЛЕННЫЙ ЦИКЛИЧЕСКИЙ список с обеспечением интерактивного поиска числа. Нужна процедура поиска числа с возвратом позиции. У меня получается что в списке два одинаковых числа. Как сделать так, чтобы можно было найти все позиции введенного числа? Помогите.
type 
Marker = ^ElementType; 
ElementType = record 
info: word; 
next: Marker 
end; 
const 
PCur: Marker = nil;(*указатель на текущий элемент-при старте программы список пуст*) 
var 
PFirst: Marker; 
n: byte; 
f1:text; 
f2: file of byte; 
v, ercode, i: byte; 
s: string; 
Procedure AddElement(data: byte); 
var 
PTemp: Marker; 
begin 
if PCur = nil then begin 
new(PFirst); 
PCur:= PFirst; 
PCur^.next:= PFirst 
end else begin 
new(PTemp); 
PCur^.next := PTemp^.next; 
PCur^.next:= PTemp; 
PCur:= PTemp 
end; 
PCur^.info:= data 
end; 
 
function Find(data: byte):byte; 
var 
PTemp: Marker; 
i: byte; 
begin 
Find := 0; 
if PFirst <> nil then 
PTemp := PFirst; 
for i := 1 to 15 do 
if PTemp^.info = data then 
begin 
Find := i; 
exit; 
end else 
PTemp := PTemp^.next; 
end; 
 
begin 
Assign(f1, 'numbers.txt'); 
Rewrite(f1); 
for i:=1 to 15 do 
begin 
str(random(101), s); 
writeln(f1,s); 
end; 
close(f1); 
 
Reset(f1); 
Assign(f2, 'numbers.bin'); 
Rewrite(f2); 
While not eof(f1) do 
Begin 
Readln(f1,s); 
val(s, v, ercode); 
If ercode = 0 Then Write(f2,v); 
if eof(f1) then writeln('12 чисел из файла numbers.txt считаны'); 
End; 
if eof(f2) then writeln('Данные сохранены в файле numbers.bin'); 
Close(f2); 
close(f1); 
 
Writeln('Бинарный файл содержит числа:'); 
Reset(f2); {открываем второй файл для чтения} 
While not eof(f2) do {пока не конец второго файла} 
Begin 
Read(f2,v);{считываем очередную строку из второго файла} 
Write(v, ' '); {выводим строку на экран} 
AddElement(v) 
End; 
writeln; 
if eof(f2) then writeln('Список создан'); 
Close(f2); 
writeln('Для выхода введите строку, например stop'); 
repeat 
writeln('Введите искомое число: '); 
read(n); 
if Find(n) = 0 then 
writeln('Числа нет в списке') 
else 
writeln('Число найдено в позиции:',Find(n)) 
until false; 
end.

Решение задачи: «Поиск числа в однонаправленном списке»

textual
Листинг программы
type
  Marker = ^ElementType;
  Item = word;
  ElementType =
  record
    info: Item;
    next: Marker
  end;
 
var
  PHead : Marker = nil;
  PTail : Marker = nil;
 
var
  n: integer;
  f1:text;
  f2: file of byte;
  v, ercode, i: byte;
  s: string;
 
procedure AddElement(data : Item);
var p : Marker;
begin
  new (p);
  p^.info := data;
  if not Assigned(PHead) then // список пуст
  begin
    p^.next := p; // Первый элемент указывает сам на себя
    PHead := p; // это будет "голова" списка, отсюда начинается обход
  end
  else
  begin
    p^.next := PHead; // новый элемент указывает на "голову"
    PTail^.next := p;
    //PTail := p;
  end;
  PTail := p; // это будет элемент, после которого добавляются новые элементы
end;
 
procedure ShowList;
var p : Marker;
begin
  if Assigned(PHead) then
  begin
    p := PHead;
    repeat
      write(p^.info:4);
      p := p^.next;
    until p = PHead;
    writeln;
  end
  else writeln('Пусто');
end;
 
function Find(var From: Marker; data: byte):byte;
var
  P: Marker;
  i: byte;
begin
  Find := 0; i := 0;
  if PHead <> nil then
  begin
    P := PTail;
    repeat
      inc(i);
      p := p^.next;
    until p = From;
  end;
  repeat
    if p^.info = data then
    begin
      Find := i;
      From := p^.next;
      exit;
    end
    else
    begin
      p := p^.next;
      inc(i);
    end;
  until p = pHead;
end;
 
var
  m : Marker;
  index, count : byte;
begin
  Assign(f1, 'D:\__Volvo\Programs\pascal\numbers.txt');
  Rewrite(f1);
  for i:=1 to 15 do
  begin
    str(random(101), s);
    writeln(f1,s);
  end;
  close(f1);
  
  Reset(f1);
  Assign(f2, 'D:\__Volvo\Programs\pascal\numbers.bin');
  Rewrite(f2);
  While not eof(f1) do
  Begin
    Readln(f1,s);
    val(s, v, ercode);
    If ercode = 0 Then Write(f2,v);
    if eof(f1) then writeln('12 чисел из файла numbers.txt считаны');
  End;
  if eof(f2) then writeln('Данные сохранены в файле numbers.bin');
  Close(f2);
  close(f1);
  
  Writeln('Бинарный файл содержит числа:');
  Reset(f2); {открываем второй файл для чтения}
  While not eof(f2) do {пока не конец второго файла}
  Begin
    Read(f2,v);{считываем очередную строку из второго файла}
    Write(v, ' '); {выводим строку на экран}
    AddElement(v)
  End;
  writeln;
  
  writeln('Список создан: ');
  ShowList;
  writeln('Поиск (для выхода введите -1) :');
  repeat
    writeln('Введите искомое число: ');
    read(n);
    m := PHead; count := 0;
    repeat
      index := Find(m, n);
      if index <> 0 then
      begin
        writeln('Число найдено в позиции:', index);
        inc(count);
      end;
    until (index = 0) or (m = PHead);
    if count = 0 then writeln('Числа нет в списке')
  until n = -1;
end.

Объяснение кода листинга программы

  1. Тип данных Marker используется для хранения указателей на элементы списка.
  2. Тип данных Item представляет собой слово (4 байта).
  3. Элемент списка ElementType содержит информацию и ссылку на следующий элемент.
  4. Переменные PHead и PTail указывают на начало и конец списка соответственно.
  5. Функция AddElement добавляет новый элемент в список.
  6. Процедура ShowList выводит все элементы списка на экран.
  7. Функция Find ищет число в списке и возвращает его позицию.
  8. Переменные m, index и count используются в цикле поиска числа в списке.
  9. Файлы f1 и f2 используются для чтения и записи чисел в текстовом и бинарном форматах.
  10. В цикле While не eof(f1) считываются числа из файла f1 и записываются в файл f2.
  11. В цикле While not eof(f2) считывается очередная строка из второго файла и выводится на экран, а также добавляется в список.
  12. После создания списка и ввода искомого числа начинается поиск числа в списке.
  13. Если число найдено, то выводится его позиция в списке.
  14. Если число не найдено, то выводится сообщение об этом.
  15. Для выхода из программы вводится число -1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы