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
就不会改变。现在看起来像我前面的问题: