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

回到顶部