这个树由节点组成,子节点表示为子节点指针的链接列表(=节点可以有无限数量的子节点)。但链接列表再次使用相同的节点类型表示。实际上是root
节点和
next
的同伴是另一棵树的根节点,所以它更像是森林(=更多树)。每个节点代表一个字符,这些树中的每个路径都是一个字符串(输入由','分隔,输入以'。'结尾)。添加字符(节点),以便在遍历路径时,您打印的字符串将按字母顺序排序。
但是我无法开始创建树,在{HERE SEGFAULT}
返回了段错误:
type
PNode = ^TNode;
TNode = record
char: char;
next: PNode;
children: PNode;
end;
PPNode = ^PNode;
var
character: char;
root: PNode;
current_node: PPNode;
function add_before(node: PNode; character: char): PNode;
begin
new(add_before);
add_before^.char := character;
add_before^.next := node;
add_before^.children := nil;
end;
function find_or_insert_peer(var node: PNode; character: char): PNode;
var last, temp: PNode;
begin
last := nil;
temp := node;
while (temp <> nil) and (temp^.char < character) do
begin
last := temp;
temp := temp^.next;
end;
if (temp <> nil) and (temp^.char = character) then
begin
find_or_insert_peer := temp;
end else begin
find_or_insert_peer := add_before(temp, character);
if last = nil then
begin
node := find_or_insert_peer;
end else begin
last^.next := find_or_insert_peer;
end;
end;
end;
begin
root := nil;
read(character);
while character <> '.' do
begin
current_node := @root;
while (character <> ',') and (character <> '.') do
begin
current_node^ := find_or_insert_peer(current_node^, character)^.children;
writeln(root^.char); {HERE SEGFAULT}
read(character);
end;
if character = ',' then
read(character);
end;
end.
输入aa,vv.
请注意,find_or_insert_peer
接受指向TNode
(首先是root
)的指针作为参考,以便它可以将其更改为指向正确的第一个节点(例如,按字母顺序排在第一个节点)应该是新节点,或根本没有节点。
答案 0 :(得分:1)
由于此行,您获得了SEGFAULT
:
current_node^ := find_or_insert_peer(current_node^, character)^.children;
在find_or_insert_peer()
的调用中,您可以按预期修改参数current_node^
的内容(也间接地root
)。但是,从所述函数返回后,您将children
(nil
)分配给同一current_node^
,因此也分配给root
。
错误被触发,因为root
的内容为零。