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

Добавление элемента в конец списка

03.05.2012, 23:39. Показов 6818. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
type ТЭ=...(тип элемента списка)
список=^звено;
звено:record
элем:ТЭ;
след:список;
end;
Описать и проверить процедуру которая вставляет в конец списка L новый элемент X
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2012, 23:39
Ответы с готовыми решениями:

Добавление списка в конец существующего
Добрый день, мне необходимо добавить список mas1 в конец первого списка. Подскажите, пожалуйста,...

Разработать алгоритм и программу добавления элемента в начало и в конец однонаправленного линейного списка
Разработать алгоритм и программу добавления элемента в начало и в конец однонаправленного линейного...

Добавление элемента в начало списка
Procedure AddToEnd(i:integer; var head:Tlist); //добавление элемента в конец списка i-...

Добавление минимального элемента в начало списка
Имеется список, элементами которого являются вещественные числа. Создать консольное приложение,...

7
13100 / 5881 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
04.05.2012, 11:31 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
type
  //Тип основных данных.
  TData = Integer;
  //Тип указателя на элемент списка.
  TPElem = ^TElem;
  //Тип элемента списка.
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
  //Тип, описывающий однонаправленный список.
  TList = record
    PFirst : TPElem; //Указатель на первый элемент списка.
    PLast : TPElem; //Указатель на последний элемент списка.
  end;
 
//Инициализация списка. Внимание! Эту процедуру можно выполнять только
//в отношении пустого списка. Иначе - будут утечки памяти.
procedure Init(var aList : TList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец однонаправленного списка.
procedure AddL(var aList : TList; 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 ListFree(var aList : TList);
var
  PNext, PDel : TPElem;
begin
  if aList.PFirst = nil then Exit;
 
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
//Распечатка однонаправленного списка.
function ListToStr(const aList : TList) : String;
var
  PElem : TPElem;
  i : Integer;
begin
  Result := '';
  if aList.PFirst = nil then begin
    Result := 'Список пуст.';
    Exit;
  end;
 
  PElem := aList.PFirst;
  i := 0;
  while PElem <> nil do begin
    Inc(i);
    if i > 1 then Result := Result + '; ';
    Result := Result + IntToStr(PElem^.Data);
    PElem := PElem^.PNext;
  end;
end;
0
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 8
04.05.2012, 23:09  [ТС] 3
Как решить, не употребляя запись
TList = record
PFirst : TPElem; //Указатель на первый элемент списка.
PLast : TPElem; //Указатель на последний элемент списка.
end;

Добавлено через 8 часов 22 минуты
есть какие ещё варианты по решению задачи используя процедуру?
0
13100 / 5881 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
05.05.2012, 00:01 4
Вместо записи типа TList можно использовать две отдельные переменные - указатели на начало и на конец списка. Или можно даже только один указатель использовать - на начало списка. Но при этом добавление элементов в конец будет неудобным. Тогда, для добавления нового элемента, придётся сначала перебрать все элементы списка и дойти до его конца и только потом добавить новый элемент. В общем, запись типа TList наиболее удобно представляет список.
Если всё же применить две отдельные переменные, тогда процедура добавления элемента в конец списка будет такой:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Добавление элемента в конец однонаправленного списка.
procedure AddL(var aP1, aP2 : TPElem; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aP1 = nil then
    aP1 := PElem
  else
    aP2^.PNext := PElem
  ;
  aP2 := PElem;
end;
Если пользоваться только одним указателем на начало списка, тогда так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Добавление элемента в конец однонаправленного списка.
procedure AddL(var aPList : TPElem; const aData : TData);
var
  PElem, PEnd : TPElem;
begin
  //Определяем указатель на конец списка.
  PEnd := nil;
  PElem := aPList;
  while PElem <> nil do begin
    PEnd := PElem;
    PElem := PElem^.PNext;
  end;
  //Создаём новый элемент и записываем в него данные.
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  //Добавляем элемент в конец списка.
  if PEnd = nil then
    aPList := PElem
  else
    PEnd^.PNext := PElem;
end;
0
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 8
05.05.2012, 09:36  [ТС] 5
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
type
  TData = Integer;
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
 
procedure AddL(var aPList : TPElem; const aData : TData);
var
  PElem, PEnd : TPElem;
begin
  PEnd := nil;
  PElem := aPList;
  while PElem <> nil do begin
    PEnd := PElem;
    PElem := PElem^.PNext;
  end;
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if PEnd = nil then
    aPList := PElem
  else
    PEnd^.PNext := PElem;
end;
последняя просьба можешь написать ввод вывод данных через Edit
0
13100 / 5881 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
05.05.2012, 10:59 6
Полностью код будет таким. На форму надо положить 3 кнопки и 2 Мемо. В Мемо1 вводятся элементы - каждый элемент на отдельной строке. При нажатии на кнопку Button1 элементы из Мемо1 добавляются в конец списка. При нажатии на Button2 список распечатывается в Мемо2. При нажатии на Button3 список удаляется. Если в Мемо1 на какой-то строке число будет введено не правильно, в этом случае, при добавлении в список, для этой строки будет взято значение 0 (ноль).
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  TData = Integer;
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
 
//Добавление элемента в конец списка.
procedure AddL(var aPList : TPElem; const aData : TData);
var
  PElem, PEnd : TPElem;
begin
  PEnd := nil;
  PElem := aPList;
  while PElem <> nil do begin
    PEnd := PElem;
    PElem := PElem^.PNext;
  end;
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if PEnd = nil then
    aPList := PElem
  else
    PEnd^.PNext := PElem;
end;
 
//Удаление списка из памяти.
procedure ListFree(var aPList : TPElem);
var
  PDel : TPElem;
begin
  while aPList <> nil do begin
    PDel := aPList;
    aPList := aPList^.PNext;
    Dispose(PDel);
  end;
end;
 
//Распечатка списка.
function ListToStr(aPList : TPElem) : String;
var
  i : Integer;
begin
  if aPList = nil then begin
    Result := 'Список пуст.';
    Exit;
  end;
 
  Result := '';
  i := 0;
  while aPList <> nil do begin
    Inc(i);
    if i > 1 then Result := Result + ', ';
    Result := Result + IntToStr(aPList^.Data);
    aPList := aPList^.PNext;
  end;
end;
 
var
  gPList : TPElem = nil;
 
//Кнопка "Добавить элементы в список".
procedure TForm1.Button1Click(Sender: TObject);
var
  i, Cnt : Integer;
  S : String;
begin
  //Добавление в список элементов из Мемо1.
  //Каждый элемент в Мемо1 должен быть записан на отдельной строке.
  Cnt := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    S := Memo1.Lines[i];
    if S = '' then Continue; //Пропуск пустых строк.
    Inc(Cnt);
    AddL(gPList, StrToIntDef(S, 0));
  end;
  Memo2.Lines.Add('В список добавлено ' + IntToStr(Cnt) + ' элементов.');
end;
 
//Кнопка "Распечатать список".
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo2.Lines.Add('Список:');
  Memo2.Lines.Add( ListToStr(gPList) );
end;
 
//Кнопка "Удалить список".
procedure TForm1.Button3Click(Sender: TObject);
begin
  ListFree(gPList);
  Memo2.Lines.Add('Список удалён.');
end;
 
initialization
 
finalization
  //Удаление списка при завершении работы.
  ListFree(gPList);
 
end.
Приложен архив с этим проектом.
Вложения
Тип файла: rar WorkWithDynList.rar (165.2 Кб, 72 просмотров)
0
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 8
07.05.2012, 14:47  [ТС] 7
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  TData = Integer;
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
 
 
procedure AddL(var aPList : TPElem;  aData : TData);
var
  PElem, PEnd : TPElem;
begin
  PEnd := nil;
  PElem := aPList;
  while PElem <> nil do begin
    PEnd := PElem;
    PElem := PElem^.PNext;
  end;
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if PEnd = nil then
    aPList := PElem
  else
    PEnd^.PNext := PElem;
end;
function ListToStr(aPList : TPElem) : String;
var
i : Integer;
begin
if aPList = nil then
begin
Result := 'Список пуст.';
Exit;
end;
Result := '';
i := 0;
while aPList <> nil do begin
Inc(i);
if i > 1 then Result := Result + ',';
Result := Result + IntToStr(aPList^.Data);
aPList := aPList^.PNext;
end;
end;

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
var
  gPList : TPElem = nil;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  S : String;
begin
  for i := 0 to Memo1.Lines.Count - 1 do begin
    S := Memo1.Lines[i];
    if S = '' then Continue; 
    AddL(gPList, StrToIntDef(S, 0));
  end;
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
  Edit1.Text:=ListToStr(gPList);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
  PDel : TPElem;
begin
  while gPList <> nil do begin
    PDel := gPList;
    gPList := gPList^.PNext;
    Dispose(PDel);
  end;
end;
 
end.
Как синию область превратить в процедуру или опустить в Button2click?(функцию заменить)
0
13100 / 5881 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
07.05.2012, 15:32 8
В виде функции тот код более лаконичен. В Delphi есть функции: IntToStr(), FlostToStr(), DateToStr() и мы написали функцию ListToStr().
---
В виде процедуры:
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
//Распечатка списка.
procedure ListToStr(aPList : TPElem; var aStr : String);
var
  i : Integer;
begin
  if aPList = nil then begin
    aStr := 'Список пуст.';
    Exit;
  end;
 
  aStr := '';
  i := 0;
  while aPList <> nil do begin
    Inc(i);
    if i > 1 then aStr := aStr + ', ';
    aStr := aStr + IntToStr(aPList^.Data);
    aPList := aPList^.PNext;
  end;
end;
 
//...
 
//Кнопка "Распечатать список".
procedure TForm1.Button2Click(Sender: TObject);
var
  S : String;
begin
  ListToStr(gPList, S);
  Edit1.Text := S;
end;
2
07.05.2012, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2012, 15:32
Помогаю со студенческими работами здесь

Добавление элемента в начало односвязного списка
Здравствуйте, может есть у кого то процедура, добавления элемента в начало списка(указатель стоит...

Добавление элемента списка, равного среднему арифметическому элементов
Помогите пожалуйста решить Дан список вещественных чисел. Написать следующие функции: а)...

Добавление элемента в конец списка
Решил перегрузить функцию добавления элемента, чтоб пользователь мог выбрать куда добавить новый...

Добавление элемента в конец списка
Сначала добавляет первый элемент, а далее не хочет? Посмотрите свежим глазом, а то я лагаю! void...


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

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

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