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)作为一个引用,以便它可以将其更改为指向正确的第一个节点(例如,按字母顺序应该是新节点,或根本没有节点)。

+0

“find_or_insert_peer”的'node'参数是一个'var'参数的想法是什么? – JohnB

+0

@JohnB我只是发布它,但互联网连接中断 – Adam

+0

我也想不到没有双指针的优雅解决方案。所以你可以让我知道是否有一个。但我仍然想知道为什么这不起作用。 – Adam

你得到SEGFAULT,因为这行:

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

在您修改调用find_or_insert_peer(),如预期,参数current_node^的内容(也间接root)。但是,从上述函数返回后,您将children(即nil)分配给相同的current_node^,因此也分配给root

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

+0

谢谢,那么我怎么让'current_node'直接指向下面的指针:'find_or_insert_peer(current_node ^,character)^。children'。所以'root'不会改变。现在它看起来像我以前的问题:http://*.com/questions/41399595/pascal-pointer-to-pointer-syntaxerror-and-incompatible-types – Adam

+0

没关系我已经解决了它 – Adam