0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 12
1

Однонаправленные кольцевые списки

15.05.2012, 07:45. Показов 3121. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста с кольцевыми списками!!!

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

Добавлено через 9 часов 5 минут
люди помогите!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2012, 07:45
Ответы с готовыми решениями:

Двунаправленные кольцевые списки
Здравствуйте, уважаемые форумчане! Нужна помощь в доработке Двунаправленного кольцевого списка ...

Однонаправленные линейные списки
Помогите с одноправленным линейным списком.Происходит ошибка на этапе выполения.

Кольцевые списки
Зачем нужны кольцевые односвязные и двусвязные списки? Когда они могут понадобиться? Ведь, если...

Кольцевые списки
Здравствуйте, как реализовать удаление в кольцевом списке ? Читал, что можно сделать так, чтобы при...

2
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
15.05.2012, 09:15 2
Лучший ответ Сообщение было отмечено funy как решение

Решение

На форму надо положить 2 TMemo и 1 TButton. В Мемо1 вводятся целые числа, которые будут добавлены в список. Каждое число должно быть записано на отдельной строке. Числа добавляются в конец кольцевого списка. В Мемо2 выводятся сведения о результатах работы.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
type
  //Основоные данные.
  TData = Integer;
  //Тип указателя на элемент списка.
  TPElem = ^TElem;
  //Тип элемента списка.
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
  //Для кольцевого списка не будем заводить отдельный тип.
  //Кольцевой список будет представлен указателем типа PList : TPElem.
  //Этот указатель указывает на последний элемент списка.
  //Соответственно, указателем на первый элемент списка является: PList^.PNext.
 
//Добавление элемента в конец однонаправленного кольцевого списка.
procedure AddL(var aPList, aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  if aPList = nil then
    //Единственный элемент указывает сам на себя.
    aPElem^.PNext := aPElem
  else begin
    //Добавляем новый элемент после последнего в списке.
    aPElem^.PNext := aPList^.PNext;
    aPList^.PNext := aPElem;
  end;
  //Указатель списка переводим на добавленный элемент. - Теперь он является
  //последним в списке.
  aPList := aPElem;
end;
 
//Удаление однонаправленного кольцевого списка из памяти и инициализация.
procedure ListFree(var aPList : TPElem);
var
  PLast, PDel : TPElem;
begin
  if aPList = nil then Exit;
 
  PLast := aPList;
  repeat
    PDel := aPList;
    aPList := aPList^.PNext;
    Dispose(PDel);
  until aPList = PLast;
  aPList := nil;
end;
 
//Распечатка однонаправленного списка aN раз.
function ListToStr(const aPList : TPElem; const aN : Word) : String;
var
  PElem : TPElem;
  i, Cnt : Integer;
begin
  if aPList = nil then begin
    Result := 'Список пуст.';
    Exit;
  end;
 
  Result := '';
  //Указатель на первый элемент списка.
  PElem := aPList^.PNext;
  i := 0;
  Cnt := 0; //Счётчик пройденных колец.
  while Cnt < aN do begin
    Inc(i);
    if i > 1 then Result := Result + ', ';
    Result := Result + IntToStr(PElem^.Data);
    if PElem = aPList then Inc(Cnt); //Счётчик колец.
    PElem := PElem^.PNext;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  PList, PElem : TPElem;
  i : Integer;
  S : String;
begin
  //Начальная инициализация списка. Такую инициализацию можно выполнять
  //только в отношении пустого списка. Иначе, будут утечки памяти.
  PList := nil;
 
  //Создаём кольцевой список путём добавления элементов в его конец.
  for i := 0 to Memo1.Lines.Count - 1 do begin
    S := Memo1.Lines[i];
    if S = '' then Continue; //Пропуск пустых строк.
    New(PElem);
    PElem^.Data := StrToInt(S);
    AddL(PList, PElem);
  end;
 
  //Распечатка списка.
  Memo2.Lines.Add('--------------------------------------------------');
  Memo2.Lines.Add('Создан список:');
  Memo2.Lines.Add(ListToStr(PList, 1));
 
  //Распечатка списка.
  Memo2.Lines.Add('Для демонстрации обхода кольцевого списка распечатаем его 3 раза:');
  Memo2.Lines.Add(ListToStr(PList, 3));
 
  //Удаление списка из памяти.
  ListFree(PList);
  Memo2.Lines.Add('Список удалён из памяти.');
end;
1
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 12
15.05.2012, 17:29  [ТС] 3
спасибо огромное!!!
0
15.05.2012, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 17:29
Помогаю со студенческими работами здесь

Кольцевые списки
люди добрые, написал программу, теперь надо в ней сделать эти три списка в один кольцевой, но при...

Кольцевые однонапрвленые списки
Привет, нужно написать програму, которая в кольцевом однонаправленом списке заменит все числа...

Кольцевые списки на базе двунаправленных списков
Всем привет! Помогите решить задачу: Пусть L обозначает кольцевой двунаправленный список с...

Однонаправленные списки
Сформировать два однонаправленных списка S1 и S2, сформировать список S3, куда войдут только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru