• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль, односвязный список

  • Автор темы Автор темы Never
  • Дата начала Дата начала

Never

Ученик
Регистрация
21 Окт 2015
Сообщения
2
Реакции
0
Баллы
0
Имеется введенный вручную односвязный список.
Необходимо ввести с клавиатуры число X и вернуть указатель на элемент под номером X. Если такого элемента нет, добавить X к списку и вернуть на него указатель.

Заранее спасибо.

Собственно проблем с составлением вручную списка нет, с добавлением значения тоже. Единственное что не могу понять - как сделать среднюю часть с выводом указателя по введенному числу. Если кто-то может помочь написать этот кусочек кода,буду очень благодарен.
 
По моему просто задача поставлена не совсем корректно, указатель - это адрес в памяти, ни какой конкретной "видимой" информации он не несет, можно конечно например преобразовать его к десятичному или шестнадцатиричному виду и вывести на экран при помощи writeln, но нужно ли это ?
 
Моя ошибка,не так сформулировал. Нужно вывести элемент списка,на который будет указывать указатель (тавтология,но щито поделать), а номер для указателя надо ввести самому.

А может я вообще все не так понял. Потому дословный текст задачи: "Напишите программу,воспринимающую указатель L на список целых чисел и целое число Х и возвращающую указатель на элемент Х,если он существует,а в противном случае добавляющую Х к L, если он не найден, и всегда возвращающую указатель на элемент,содержащий Х".
 
ну я бы написал примерно так, правда условия задания для меня все равно остались загадкой,
особенно фраза "программу,воспринимающую указатель L на список целых чисел" :)) чем и как программа должна воспринимать УКАЗАТЕЛЬ на список ...
Код:
program ProjectTehnari;

{$APPTYPE CONSOLE}

type
     TPRecordList=^TRecordList;

     TRecordList = record
     Next:  TPRecordList;
     Value: Integer;
     end;


var StartElement,FoundElement:TPRecordList;
    i,x:Integer;

procedure AddElement(var AList:TPRecordList;AValue:Integer);
var
  Element:TPRecordList;
begin
  if AList = nil then
     begin
     New(Element);
     Element.Next:=nil;
     Element.Value:=AValue;
     AList := Element;
     FoundElement:=AList;
     end
  else
     addElement(AList.Next,AValue);

end;

procedure FreeList;
var
Next,CurList: TPRecordList;
begin
  CurList:=StartElement;
  while CurList<>nil do
    begin
        Next:=CurList.Next;
        Dispose(CurList);
        CurList:=Next;
    end;
   StartElement:=nil;
end;

function FindElement(AValue:Integer):TPRecordList;
var
CurList: TPRecordList;
begin
  FindElement:=nil;
  CurList:=StartElement;
  while CurList<>nil do
    begin
      if CurList.Value=AValue then
      begin
        FindElement:=CurList;
        exit;
      end;
      CurList:=CurList.Next;
    end;
end;

procedure outList;
var cnt:Integer;
CurList: TPRecordList;
begin
  cnt:=1;
  CurList:=StartElement;
  writeln('---------------------------------------------');
  while CurList<>nil do
    begin
        writeln('Элемент списка #' ,cnt,' Значение : ',CurList.Value);
        cnt:=cnt+1;
        CurList:=CurList.Next;
    end;
end;

procedure outElement(AElement:TPRecordList);
begin
  writeln('---------------------------------------------');
  writeln('Элемент списка имеет значение : ',AElement.Value);
end;



begin
   StartElement:=nil;
{* Формируем список *}
   Randomize;
   for i:=1 to 20 do
     AddElement(StartElement,Random(100));
{* Вывод списка *}
   outList;
   write('Введите значение (целое число) X: ');  readln(x);
{* Ищем в списке *}
   FoundElement:=FindElement(x);
{* Если не нашли то добавляем элемент в список *}
   if FoundElement=nil then
       addElement(StartElement,x);
{* Выводим элемент *}
   outElement(FoundElement);
{* Вывод списка - для проверки, что элемент добавлен*}
   outList;
{* Удаляем список *}
   FreeList;
   readln;
end.
 
Назад
Сверху