Lazarus. Имеется реализация списка.
Pascal |
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
| unit classlist;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type list_data = record
data: integer;
next: ^list_data;
end;
type
list = class
private
first, last, newNode: ^list_data;
public
constructor Create;
procedure addHead(value: integer);
procedure addTail(value: integer);
function removeHead(var value: integer): boolean;
function removeTail(var value: integer): boolean;
function isEmpty(): boolean;
procedure print();
end;
implementation
constructor list.Create;
begin
inherited Create;
first:=nil;
last:=nil;
end;
procedure list.addHead(value: integer);
var newdata: ^list_data;
begin
new(newdata);
newdata^.data:=value;
writeln(newdata^.data);
newdata^.next:=nil;
if isEmpty() then begin first:=newdata; last:=newdata end
else begin newdata^.next:=first; first:=newdata; end;
end;
procedure list.addTail(value: integer);
var newdata: ^list_data;
begin
new(newdata);
newdata^.data:=value;
newdata^.next:=nil;
if isEmpty() then begin first:=newdata; last:=newdata end
else begin last^.next:=newdata; last:=newdata; end;
end;
function list.removeHead(var value: integer): boolean;
var temp: ^list_data;
begin
new(temp);
if isEmpty()=true then removeHead:=false
else begin
temp:=first;
if first=last then begin first:=nil; last:=nil end else first:=first^.next;
value:=temp^.data;
Dispose(temp);
removeHead:=true;
end;
end;
function list.removeTail(var value: integer): boolean;
var temp, curr: ^list_data;
begin
new(temp);
new(curr);
if isEmpty()=true then removeTail:=false
else begin
temp:=last;
if first=last then begin first:=nil; last:=nil end else
begin
curr:=first;
while curr^.next<>last do curr:=curr^.next;
last:=curr;
curr^.next:=nil;
end;
value:=temp^.data;
Dispose(temp);
Dispose(curr);
end;
removeTail:=true;
end;
function list.isEmpty(): boolean;
begin
if first=nil
then isEmpty:=true
else isEmpty:=false;
end;
procedure list.print();
var curr: ^list_data;
begin
if isEmpty() then begin writeln('List is empty!'); exit; end;
new(curr);
curr:=first;
writeln('List:');
while curr<>nil do begin
writeln(curr^.data);
curr:=curr^.next;
end;
writeln();
end;
end. |
|
Пытался запустить так
Pascal |
1
2
3
4
5
6
7
8
9
10
11
| program listtask;
uses classlist;
var ff: list;
begin
ff.Create();
writeln('Created');
ff.addHead(5);
writeln('Added');
ff.print();
end. |
|
Конструктор создает объект, но после этого любая попытка обратиться к first заканчивается вылетом с External SIGSEGV. В этом виде ошибка вылетает в момент, когда в методе addHead обращаюсь к isEmpty, при попытке сравнить first с nil. Пытался вставить операции с first в разные места метода addHead для теста, всегда один и тот же результат, при сравнении, присваивании, попытке распечатать адрес. Почитал на форуме темы с этой ошибкой, решения не нашел. пытался в конструкторе сделать так
Pascal |
1
2
3
4
5
6
7
8
| constructor list.Create;
var: a: ^list_data;
begin
new(a)
first:=a;
last:=nil;
inherited Create;
end; |
|
но результат не изменился.
P.S. Про необходимость организовать деструктор знаю, просто пока не сделал, не могу сдвинуться с этой проблемы.