Pascal指向指针的指针段错误
有一棵由具有子节点的节点组成的节点表示为指向子节点的链接列表(=一个节点可以有无限数量的子节点)。但链接列表再次使用相同的节点类型表示。实际上root
节点和 它的对等体next
是另一棵树的根节点,所以它是一个森林(=更多的树)。每个节点代表一个字符,并且这些树中的每条路径都是一个字符串(输入由','分隔,输入以'。'结尾)。添加字符(节点),以便在遍历路径时,您打印的字符串将按字母顺序排列。Pascal指向指针的指针段错误
但我不能去上班了树的创建,段错误则返回在{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
)作为一个引用,以便它可以将其更改为指向正确的第一个节点(例如,按字母顺序应该是新节点,或根本没有节点)。
回答:
你得到SEGFAULT
,因为这行:
current_node^ := find_or_insert_peer(current_node^, character)^.children;
在您修改调用find_or_insert_peer()
,如预期,参数current_node^
的内容(也间接root
)。但是,从上述函数返回后,您将children
(即nil
)分配给相同的current_node^
,因此也分配给root
。
错误被触发,因为root
的内容为零。
以上是 Pascal指向指针的指针段错误 的全部内容, 来源链接: utcz.com/qa/266523.html