Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 18:38   #1
JonnyFletcher
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 13
По умолчанию Динамические структуры данных в Delphi.Список.

Помогите пожалуйста решить задачу. Разработать программу, которая создает списки L1 и L2, элементами которых являются целые числа (элементы в L1 списке упорядочены по неубывания, а в списке L2 размещены произвольно). Вставляет элементы списка L2 в L1 так, чтобы L1 остался упорядоченным. Выводит модифицированный список L1.
JonnyFletcher вне форума Ответить с цитированием
Старый 19.05.2013, 19:04   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Используй TList<T>
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.05.2013, 19:11   #3
JonnyFletcher
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 13
По умолчанию

Как? Вставить элементы списка L2 в L1 так, чтобы L1 остался упорядоченным?
JonnyFletcher вне форума Ответить с цитированием
Старый 19.05.2013, 19:41   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Дженерик списка имеет метод Insert, который вставит элемент в ту часть списка в какую нужно. А посчитать индекс в L1 можно просто сравнивая числа. Иными словами число из L2, должно встать между двумя элементами L1, первый которого должен быть меньше элемента из L2, а второй больше или равен.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.05.2013, 00:57   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Помогите пожалуйста решить задачу. Разработать программу, которая создает списки L1 и L2, элементами которых являются целые числа (элементы в L1 списке упорядочены по неубывания, а в списке L2 размещены произвольно). Вставляет элементы списка L2 в L1 так, чтобы L1 остался упорядоченным. Выводит модифицированный список L1.
Напишите программу. Те части (функции, фрагменты кода и т.д.), которые Вы не знаете, как написать кодом - напишите вместо них комментарии вида "тут должен быть код, делающий то-то и то-то".
Abstraction вне форума Ответить с цитированием
Старый 20.05.2013, 02:35   #6
JonnyFletcher
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 13
По умолчанию

Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип указателя на элемент списка.}
  TPElem = ^TElem;
  {Тип элемента списка.}
  TElem = record
    Data : TData; {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент списка.}
  end;
  {Тип, описывающий однонаправленный список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка! Иначе, будут утечки памяти.}
procedure Init(var aList : TDList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
{Добавление элемента в конец однонаправленного списка.}
procedure Add(var aList : TDList; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
end;
 
{Особождение памяти, занятой под список.}
procedure Free(var aList : TDList);
var
  PNext, PDel : TPElem;
begin
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
{Распечатка однонаправленного списка.}
procedure LWriteln(const aList : TDList);
var
  PElem : TPElem;
begin
  if aList.PFirst = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
 
  PElem := aList.PFirst;
  while PElem <> nil do begin
    if PElem <> aList.PFirst then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  Writeln;
end;
 
const
  M = 7;
var
  L1, L2 : TDList;
  PElem1, PNext1, PElem2, PPrev2 : TPElem;
  i : Integer;
  S : String;
begin
  {Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  Если после переключения русские буквы показываются неверно,
  следует открыть системное меню консольного окна - щелчком мыши в левом
  верхнем углу окна консоли и выбрать:
  Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".}
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  {Начальная инициализация списков.}
  Init(L1);
  Init(L2);
 
  repeat
    {Создание списка.}
    {
    Writeln('Создание списка.');
    Writeln('Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Val(S, Data, Code);
        if Code = 0 then begin
          Inc(i);
          Add(L, Data);
        end else
          Writeln('Неверный ввод. Повторите.');
      end;
    until S = '';
    Writeln('Составлен список:');
    LWriteln(L);
    }
 
    {Создание неупорядоченного списка.}
    for i := 1 to M do Add(L1, Random(M + 5));
    Writeln('Составлен неупорядоченный список:');
    LWriteln(L1);
    {Создание списка, упорядоченного по неубыванию.}
    for i := 1 to M do Add(L2, i);
    Writeln('Составлен упорядоченный по неубыванию список:');
    LWriteln(L2);
 
    {Решение задачи.
    Последовательно берём элементы из неупорядоченного списка (L1), ищем место
    вставки в упорядоченном списке и выполняем вставку.}
    PElem1 := L1.PFirst;
    while PElem1 <> nil do begin
      PNext1 := PElem1^.PNext;
 
      {Ищем в упорядоченном списке указатель на элемент PPrev2, после которого
      следует вставить очередной элемент из неупорядоченного списка.}
      PPrev2 := nil;
      PElem2 := L2.PFirst;
      while (PElem2 <> nil) and (PElem2^.Data < PElem1^.Data) do begin
        PPrev2 := PElem2;
        PElem2 := PElem2^.PNext;
      end;
 
      {Вставляем элемент в упорядоченный список.}
      PElem1^.PNext := PElem2;
      if PPrev2 = nil then
        L2.PFirst := PElem1
      else
        PPrev2^.PNext := PElem1;
      if PPrev2 = L2.PLast then
        L2.PLast := PElem1;
 
      {Переходим к следующему элементу в неупорядоченном списке.}
      PElem1 := PNext1;
    end;
 
    Init(L1);
 
    {Ответ.}
    Writeln('Упорядоченный список после слияния:');
    LWriteln(L2);
 
    {Освобождение памяти, занятую под списки.}
    Free(L1);
    Free(L2);
    Writeln('Память, занятая под списки, освобождена.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Нужно типа того только не в консоле.



Код нужно форматировать тегами!!
Модератор

Последний раз редактировалось Serge_Bliznykov; 20.05.2013 в 11:59.
JonnyFletcher вне форума Ответить с цитированием
Старый 20.05.2013, 11:51   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Нужно типа того только не в консоле.
Данный код вполне отвечает на Ваш вопрос
Цитата:
Как? Вставить элементы списка L2 в L1 так, чтобы L1 остался упорядоченным?
Что обозначает сразу три обстоятельства. Первое: о том, что нужно не консольное приложение, мы узнаём только из этого поста. Раньше этой проблемы у Вас не было. Второе: если Вы написали этот код самостоятельно, то для нынешнего вопроса примеров по этой ссылке должно хватить. К сожалению, формат текстового форума плохо подходит для описания процесса создания форм.
Третье: если Вы написали этот код самостоятельно, то вопросы, поднятые в прочих Ваших темах, выглядят как минимум странно. Вероятно, следует в них также привести примеры кода, чтобы желающие ответить лучше поняли, какого рода помощь Вам нужна.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Список (динамические структуры), выведение на экран molekyla Паскаль, Turbo Pascal, PascalABC.NET 4 21.03.2011 09:14
Динамические структуры данных Gigatrest Помощь студентам 3 21.06.2009 14:32
Динамические структуры (линейный список). Си Zaya007 Помощь студентам 4 12.03.2009 18:14