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

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

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

Доброго дня. Очень хочу разобраться, как работать со списками. Дана задача: создать текстовый файл, записать не менее 15 строк с числами от 0 до 100. Считать эти данные и записать числа в бинарный файл, где на каждое число выделяется по 1 байту. После создать из этих данных ОДНОНАПРАВЛЕННЫЙ ЦИКЛИЧЕСКИЙ список с обеспечением интерактивного поиска числа. Нужна процедура поиска числа с возвратом позиции. У меня получается что в списке два одинаковых числа. Как сделать так, чтобы можно было найти все позиции введенного числа? Помогите.
Листинг программы
  1. type
  2. Marker = ^ElementType;
  3. ElementType = record
  4. info: word;
  5. next: Marker
  6. end;
  7. const
  8. PCur: Marker = nil;(*указатель на текущий элемент-при старте программы список пуст*)
  9. var
  10. PFirst: Marker;
  11. n: byte;
  12. f1:text;
  13. f2: file of byte;
  14. v, ercode, i: byte;
  15. s: string;
  16. Procedure AddElement(data: byte);
  17. var
  18. PTemp: Marker;
  19. begin
  20. if PCur = nil then begin
  21. new(PFirst);
  22. PCur:= PFirst;
  23. PCur^.next:= PFirst
  24. end else begin
  25. new(PTemp);
  26. PCur^.next := PTemp^.next;
  27. PCur^.next:= PTemp;
  28. PCur:= PTemp
  29. end;
  30. PCur^.info:= data
  31. end;
  32. function Find(data: byte):byte;
  33. var
  34. PTemp: Marker;
  35. i: byte;
  36. begin
  37. Find := 0;
  38. if PFirst <> nil then
  39. PTemp := PFirst;
  40. for i := 1 to 15 do
  41. if PTemp^.info = data then
  42. begin
  43. Find := i;
  44. exit;
  45. end else
  46. PTemp := PTemp^.next;
  47. end;
  48. begin
  49. Assign(f1, 'numbers.txt');
  50. Rewrite(f1);
  51. for i:=1 to 15 do
  52. begin
  53. str(random(101), s);
  54. writeln(f1,s);
  55. end;
  56. close(f1);
  57. Reset(f1);
  58. Assign(f2, 'numbers.bin');
  59. Rewrite(f2);
  60. While not eof(f1) do
  61. Begin
  62. Readln(f1,s);
  63. val(s, v, ercode);
  64. If ercode = 0 Then Write(f2,v);
  65. if eof(f1) then writeln('12 чисел из файла numbers.txt считаны');
  66. End;
  67. if eof(f2) then writeln('Данные сохранены в файле numbers.bin');
  68. Close(f2);
  69. close(f1);
  70. Writeln('Бинарный файл содержит числа:');
  71. Reset(f2); {открываем второй файл для чтения}
  72. While not eof(f2) do {пока не конец второго файла}
  73. Begin
  74. Read(f2,v);{считываем очередную строку из второго файла}
  75. Write(v, ' '); {выводим строку на экран}
  76. AddElement(v)
  77. End;
  78. writeln;
  79. if eof(f2) then writeln('Список создан');
  80. Close(f2);
  81. writeln('Для выхода введите строку, например stop');
  82. repeat
  83. writeln('Введите искомое число: ');
  84. read(n);
  85. if Find(n) = 0 then
  86. writeln('Числа нет в списке')
  87. else
  88. writeln('Число найдено в позиции:',Find(n))
  89. until false;
  90. end.

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

textual
Листинг программы
  1. type
  2.   Marker = ^ElementType;
  3.   Item = word;
  4.   ElementType =
  5.   record
  6.     info: Item;
  7.     next: Marker
  8.   end;
  9.  
  10. var
  11.   PHead : Marker = nil;
  12.   PTail : Marker = nil;
  13.  
  14. var
  15.   n: integer;
  16.   f1:text;
  17.   f2: file of byte;
  18.   v, ercode, i: byte;
  19.   s: string;
  20.  
  21. procedure AddElement(data : Item);
  22. var p : Marker;
  23. begin
  24.   new (p);
  25.   p^.info := data;
  26.   if not Assigned(PHead) then // список пуст
  27.   begin
  28.     p^.next := p; // Первый элемент указывает сам на себя
  29.     PHead := p; // это будет "голова" списка, отсюда начинается обход
  30.   end
  31.   else
  32.   begin
  33.     p^.next := PHead; // новый элемент указывает на "голову"
  34.     PTail^.next := p;
  35.     //PTail := p;
  36.   end;
  37.   PTail := p; // это будет элемент, после которого добавляются новые элементы
  38. end;
  39.  
  40. procedure ShowList;
  41. var p : Marker;
  42. begin
  43.   if Assigned(PHead) then
  44.   begin
  45.     p := PHead;
  46.     repeat
  47.       write(p^.info:4);
  48.       p := p^.next;
  49.     until p = PHead;
  50.     writeln;
  51.   end
  52.   else writeln('Пусто');
  53. end;
  54.  
  55. function Find(var From: Marker; data: byte):byte;
  56. var
  57.   P: Marker;
  58.   i: byte;
  59. begin
  60.   Find := 0; i := 0;
  61.   if PHead <> nil then
  62.   begin
  63.     P := PTail;
  64.     repeat
  65.       inc(i);
  66.       p := p^.next;
  67.     until p = From;
  68.   end;
  69.   repeat
  70.     if p^.info = data then
  71.     begin
  72.       Find := i;
  73.       From := p^.next;
  74.       exit;
  75.     end
  76.     else
  77.     begin
  78.       p := p^.next;
  79.       inc(i);
  80.     end;
  81.   until p = pHead;
  82. end;
  83.  
  84. var
  85.   m : Marker;
  86.   index, count : byte;
  87. begin
  88.   Assign(f1, 'D:\__Volvo\Programs\pascal\numbers.txt');
  89.   Rewrite(f1);
  90.   for i:=1 to 15 do
  91.   begin
  92.     str(random(101), s);
  93.     writeln(f1,s);
  94.   end;
  95.   close(f1);
  96.  
  97.   Reset(f1);
  98.   Assign(f2, 'D:\__Volvo\Programs\pascal\numbers.bin');
  99.   Rewrite(f2);
  100.   While not eof(f1) do
  101.   Begin
  102.     Readln(f1,s);
  103.     val(s, v, ercode);
  104.     If ercode = 0 Then Write(f2,v);
  105.     if eof(f1) then writeln('12 чисел из файла numbers.txt считаны');
  106.   End;
  107.   if eof(f2) then writeln('Данные сохранены в файле numbers.bin');
  108.   Close(f2);
  109.   close(f1);
  110.  
  111.   Writeln('Бинарный файл содержит числа:');
  112.   Reset(f2); {открываем второй файл для чтения}
  113.   While not eof(f2) do {пока не конец второго файла}
  114.   Begin
  115.     Read(f2,v);{считываем очередную строку из второго файла}
  116.     Write(v, ' '); {выводим строку на экран}
  117.     AddElement(v)
  118.   End;
  119.   writeln;
  120.  
  121.   writeln('Список создан: ');
  122.   ShowList;
  123.   writeln('Поиск (для выхода введите -1) :');
  124.   repeat
  125.     writeln('Введите искомое число: ');
  126.     read(n);
  127.     m := PHead; count := 0;
  128.     repeat
  129.       index := Find(m, n);
  130.       if index <> 0 then
  131.       begin
  132.         writeln('Число найдено в позиции:', index);
  133.         inc(count);
  134.       end;
  135.     until (index = 0) or (m = PHead);
  136.     if count = 0 then writeln('Числа нет в списке')
  137.   until n = -1;
  138. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы