Вообще советую почитать Н. Вирт "Алгоритмы и структуры данных", так она по моему называется. Их три тома читай все - настоятельно рекомендую.
Одна из Библий программера.
Ответ на вопрос 1:
[codebox]
...
type
{ описание структуры односвязный линейный список }
TList = ^List;
List = record
{ твои данные которые будешь хранить в списке}
Str : String; { например строки}
Next: TList;
end;
{ описание структуры односвязный линейный список }
procedure CreateList(var L: TList);
begin
L := nil;
end;
procedure DeleteList(var L: TList);
var
L1: TList;
begin
if L = nil then exit;
while L <> nil do
begin
L1 := L;
L := L.Next;
Dispose(L1);
end;
end;
{ Добавление в конец списка - например строк}
procedure AddToList(var L: TList; S : String);
var
L1, L2: TList;
begin
L1 := L;
if L1 = nil
then begin
new(L1);
L1.Str := S;
L := L1;
L.Next := nil;
exit;
end;
while L1.Next <> nil do
L1 := L1.Next;
new(L2);
L2.Str := S;
L2.Next := nil;
L1.Next := L2;
end;
{ Вывод списка}
procedure OutList(L: TList);
var
L1: TList;
begin
L1 := L;
while L1 <> nil do
begin
Writeln(L1.Str);
L1 := L1.Next;
end;
end;
var
ListExample: TList;
begin
CreateList(ListExample);
AddToList(ListExample,'abcdef');
AddToList(ListExample,'gh');
OutList(ListExample);
DeleteList(ListExample);
end.
[/codebox]
Проверял работает.
Ответ на вопрос 2:
[codebox]
...
type
{ Описание структуры кольцевой односвязный список}
TList = ^List;
List = record
{ твои данные которые будешь хранить в списке }
Str : String; { например строки }
Next: TList;
end;
{ Описание структуры кольцевой односвязный список}
procedure CreateList(var L: TList);
begin
L := nil;
end;
procedure DeleteList(var L: TList);
var
L1, L2: TList;
begin
if L = nil then exit;
if L.Next = L
then begin
Dispose(L);
exit;
end;
L2 := L;
L := L.Next;
while L <> L2 do
begin
L1 := L;
L := L.Next;
Dispose(L1);
end;
Dispose(L2);
end;
{ Добавление в конец списка - например строк хотя тут это звучит}
procedure AddToList(var L: TList; S : String);
var
L1, L2: TList;
begin
L1 := L;
if L1 = nil
then begin
new(L1);
L1.Str := S;
L := L1;
L.Next := L;
exit;
end;
while L1.Next <> L do
L1 := L1.Next;
new(L2);
L2.Str := S;
L2.Next := L;
L1.Next := L2;
end;
{ Вывод списка }
procedure OutList(L: TList);
var
L1: TList;
begin
if L = nil then exit;
Writeln(L.Str);
L1 := L.Next;
while L1 <> L do
begin
Writeln(L1.Str);
L1 := L1.Next;
end;
end;
var
ListExample: TList;
begin
CreateList(ListExample);
AddToList(ListExample,'asdvgsd');
AddToList(ListExample,'asda');
OutList(ListExample);
DeleteList(ListExample);
end.
[/codebox]
Еще раз рекомендую почитать Вирта.
ВСЕМ ЗАВИСТНИКАМ И НЕДОБРОЖЕЛАТЕЛЯМ

D):
По поводу прог, может быть я где и лоханул

, но я пытался показать как это делается, а не писал программы на заказ.