Поиск числа в однонаправленном списке - 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.
Объяснение кода листинга программы
- Тип данных Marker используется для хранения указателей на элементы списка.
- Тип данных Item представляет собой слово (4 байта).
- Элемент списка ElementType содержит информацию и ссылку на следующий элемент.
- Переменные PHead и PTail указывают на начало и конец списка соответственно.
- Функция AddElement добавляет новый элемент в список.
- Процедура ShowList выводит все элементы списка на экран.
- Функция Find ищет число в списке и возвращает его позицию.
- Переменные m, index и count используются в цикле поиска числа в списке.
- Файлы f1 и f2 используются для чтения и записи чисел в текстовом и бинарном форматах.
- В цикле While не eof(f1) считываются числа из файла f1 и записываются в файл f2.
- В цикле While not eof(f2) считывается очередная строка из второго файла и выводится на экран, а также добавляется в список.
- После создания списка и ввода искомого числа начинается поиск числа в списке.
- Если число найдено, то выводится его позиция в списке.
- Если число не найдено, то выводится сообщение об этом.
- Для выхода из программы вводится число -1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д