Pascal指针到指针故障
这个树由节点组成,子节点表示为指向子节点的指针的链接列表(=一个节点可以有无限数量的子节点)。但链表将再次使用相同的节点类型表示。实际上,Pascal指针到指针故障,pascal,Pascal,这个树由节点组成,子节点表示为指向子节点的指针的链接列表(=一个节点可以有无限数量的子节点)。但链表将再次使用相同的节点类型表示。实际上,根节点和 它在next的对等节点是另一棵树的根节点,因此它相当于一个林(=更多树)。每个节点表示一个字符,这些树中的每个路径都是一个字符串(在输入中以“,”分隔,输入以“.”结束)。添加字符(节点),以便在遍历路径时,打印的字符串将按字母顺序排序 但是我无法创建树,segfault在{HERE segfault}返回: type PNode = ^TNod
根节点和
它在next
的对等节点是另一棵树的根节点,因此它相当于一个林(=更多树)。每个节点表示一个字符,这些树中的每个路径都是一个字符串(在输入中以“,”分隔,输入以“.”结束)。添加字符(节点),以便在遍历路径时,打印的字符串将按字母顺序排序
但是我无法创建树,segfault在{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.
类型
PNode=^TNode;
TNode=记录
char:char;
下一步:PNode;
儿童:PNode;
结束;
PPNode=^PNode;
变量
字符:char;
根:PNode;
当前_节点:PPNode;
函数add_before(节点:PNode;字符:char):PNode;
开始
新的(在之前添加);
在^之前添加_。字符:=字符;
在^之前添加_。下一步:=节点;
在^之前添加_。子项:=nil;
结束;
函数find_或insert_peer(变量节点:PNode;字符:char):PNode;
变量last,temp:PNode;
开始
最后:=零;
温度:=节点;
而(temp nil)和(temp^.char
输入aa,vv.
请注意,find\u或\u insert\u peer
接受指向TNode
(首先是根
)的指针作为引用,以便它可以将其更改为指向正确的第一个节点(例如,按字母顺序排列的第一个节点应该是新节点,或者根本没有节点)。由于这一行,您得到了SEGFAULT
:
current_node^ := find_or_insert_peer(current_node^, character)^.children;
在调用find_或\u insert_peer()
的过程中,您可以根据需要修改参数current_node^
(也可以间接地修改root
)的内容。但是,从所述函数返回后,您将子节点
(即nil
)分配给相同的当前节点^
,因此也分配给根节点
触发错误的原因是root
的内容为零。查找或插入对等节点的节点的参数是var
参数的想法是什么?@JohnB我刚刚发布了它,但是互联网连接被切断了,如果没有双指针,我想不出一个优雅的解决方案。如果有,你可以告诉我。但是我仍然想知道为什么这不起作用。谢谢,那么我如何使当前\u节点
直接指向以下指针:查找\u或插入\u对等点(当前\u节点^,字符)^。子节点
。这样root
就不会改变。现在看起来像我前面的问题: