Приветствую Вас Гость | RSS

Delphi заготовки

Пятница, 10.05.2024, 12:24
Главная » 2012 » Апрель » 27 » Однонаправленные списки Pascal / Delphi
06:56
Однонаправленные списки Pascal / Delphi

Линейный (однонаправленный) список является динамической структурой данных, данные
в которую могут включаться и изыматься в произвольно выбранное место. Построим модель
списка при помощи определенной структуры данных, состоящей из динамических переменных.
Каждый элемент списка представим записью языка Pascal, которая состоит из двух полей:
информационного поля или поля данных, которое в общем случае может содержать произвольное (фиксированное для данного типа элемента) количество полей разных типов;   
ссылки на следующий элемент списка.

    Каждую такую пару будем называть звеном, а ссылки, содержащиеся в каждом из звеньев, будем использовать для соединения звеньев в цепочку. Такой способ представления упорядоченной последовательности элементов называется сцеплением.

    Каждая компонента списка определяется ключом. Обычно ключ - это либо число, либо строка символов. Ключ располагается в поле данных компоненты, он может занимать как отдельное поле записи, так и быть частью информационного поля записи.

 

    Рассмотрим схематичное изображение однонаправленного списка: 

Рис.1. Схематичное изображение однонаправленного списка без заглавного звена


Над списками выполняются следующие операции:

  • начальное формирование списка (запись первой компоненты);
  • добавление компоненты в конец списка;
  • определение первого элемента в линейном списке;
  • чтение компоненты с заданным ключом; с заданным свойством;
  • вставка компоненты в заданное место списка (обычно до компоненты с заданным ключом или после неё);
  • исключение компоненты с заданным ключом из списка.
  • упорядочивание узлов линейного списка в определенном порядке.

    Описание компоненты однонаправленного списка дадим следующим образом:

Type
    TElement = record
       pole1:string;  {поле 1 }
       pole2:string;  {поле 2 }
       pole3:string;  {поле 3 }
    end;
   PRec = ^Rec;
       Rec = Record
             Element : TElement;   {Информационное поле}
             pNext   : PRec;          {Ссылка на следующую компоненту}
             endelement:boolean; {признак последнего элемента}
         End;

var    Fl1:prec;


  Function CreateFirstElement(Value:TElement):PRec; {Создаем первый элемент динамической структуры }
  Procedure AddElement(FirstElement_Value:prec;Value:TElement); {добавление компоненты в конец списка;}
  Function FillListElement(FirstElement:PRec):TstringList; // Процедура вывода элементов на экран
  Procedure DeleteElement(Index:integer;var FirstElement:PRec); {Удалить элемент}
  Function GetElementCount(FirstElement_Value:PRec):integer;{Кол-во элементов в динамической структуре где главный элемент FirstElement_Value }
  Procedure InsertToElement(var FirstElement:PRec; const index:integer; const Value:Telement);
  Procedure DeleteALl(var FirstElement:PRec);{Удалить все элементы }
  Procedure ChangeIndexElement(index1,index2:integer;FirstElement:PRec);
  Function GetElementValue(Index:integer;FirstElement:PRec):Telement; {Получить элемент номер  Index  из структуры где главный элемент FirstElement}
  Function GetMinElementFromMassiv(FirstElement:PRec):integer;
  Procedure SortElementValue2(FirstElement:PRec);
  Procedure SortElementValue(FirstElement:PRec);
  Function GetMaxElementFromMassiv(FirstElement:PRec):integer;



  Function CreateFirstElement(Value:TElement):PRec; {Создаем первый элемент динамической структуры }
  var NewElement:PRec;
  begin
      New(NewElement); {выделяем память под дополнительный элемент}
      NewElement^.Element := value; {заполняем его поле Info}
      result:=NewElement;
  end;

  Function GetLastElement(FirstElement_Value:PRec):PRec; {получить последний элемент }
  var i:integer;
    Cur:PRec; {временная переменная}
  begin
  i:=0;
  Cur:=FirstElement_Value;
    while Cur<>nil do
    begin
        i:=i+1;
        if Cur.endelement then
        break;
        Cur:=Cur^.pNext;
    end;
    result:=Cur;
  end;

  // добавление компоненты в конец списка;
  Procedure AddElement(FirstElement_Value:prec;Value:TElement);
  var NewElement:PRec;
      CurrentElemnet:PRec;
  begin
      CurrentElemnet:=GetLastElement(FirstElement_Value);
      if CurrentElemnet=nil then CurrentElemnet:=FirstElement_Value;
      New(NewElement); {выделяем память под дополнительный элемент}
      NewElement^.Element := value; {заполняем его поле Info}
      CurrentElemnet.pNext:=NewElement; {вставляем элемент в список}
      CurrentElemnet.endelement:=false;
      CurrentElemnet:= NewElement;
      CurrentElemnet.endelement:=true;

  end;



Просмотров: 6614 | Добавил: NetSoftWare | Рейтинг: 4.0/1
Всего комментариев: 2
2 NetSoftWare  
0
Пример разбивки строки на слова через динамические структуры
{
Описать функцию, подсчитывающую количество слов списка L, которые
начинаются с той же литеры, что и следующее слово.

}

procedure TForm1.Button1Click(Sender: TObject);
var L:unit2.PRec;
poleTexT:TElement;
s:string;
x,len:integer;
s2:string;
WordListCount:integer;
w2:integer;
begin

s:=form1.Memo1.Lines.Text;
len:=length(s);
l:=nil;
for X:=1 to len do begin
if (s[x] in ['А'..'Я','а'..'я','A'..'Z','a'..'z','0'..'9','-']) or (x=len) then begin // если это слово

if (x=len) and (s[x] in ['А'..'Я','а'..'я','A'..'Z','a'..'z','0'..'9','-']) then
else if x<>len then s2:=s2+s[x];

end else
begin
if s2<>'' then begin
poleTexT.pole1:=s2; // задаем значение динамической структуры
if l=nil then l:=CreateFirstElement(poleTexT)
else unit2.AddElement(l,poleTexT);
end;
s2:='';
end
end;
WordListCount:=GetElementCount(l);
form1.ListBox1.Items.Clear;
w2:=0;
s:=GetElementValue(0,l).pole1;
for x:=1 to WordListCount-1 do begin
s2:=GetElementValue(x,l).pole1;
if s[1]=s2[1] then begin form1.ListBox1.Items.Add(s2); w2:=w2+1; end; // если первая буква совпадает то выводим и добавляем

s:=s2;
end;
Showmessage('количество слов списка L, которые начинаются с той же литеры, что и следующее слово = '+inttostr(w2));
end;

1 NetSoftWare  
0

Имя *:
Email *:
Код *: