Pascal指针指向段错误

时间:2016-12-30 19:30:34

标签: pascal

这个树由节点组成,子节点表示为子节点指针的链接列表(=节点可以有无限数量的子节点)。但链接列表再次使用相同的节点类型表示。实际上是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)的指针作为参考,以便它可以将其更改为指向正确的第一个节点(例如,按字母顺序排在第一个节点)应该是新节点,或根本没有节点。

1 个答案:

答案 0 :(得分:1)

由于此行,您获得了SEGFAULT

current_node^ := find_or_insert_peer(current_node^, character)^.children;

find_or_insert_peer()的调用中,您可以按预期修改参数current_node^的内容(也间接地root)。但是,从所述函数返回后,您将childrennil)分配给同一current_node^,因此也分配给root

错误被触发,因为root的内容为零。