pointers - 为空指针赋值
问题描述
我目前正在尝试使用 pascal 实现单向链表,但我有点迷失了,下面我尝试在添加节点之前创建一个列表,然后将 nil 分配给最后一个节点,但是当我尝试添加一个新节点时我无法访问它(运行时错误 216),或者由于某些我不明白的原因我得到了最后一个指针值。
Program test;
type
TNodePtr = ^TNode;
TNode = record
number:Integer;
next:TNodePtr;
end;
var
head, tail, temp : TNodePtr;
node : TNode;
i : INTEGER;
procedure InitLists;
begin
head := nil ;
tail := head ;
end;
begin
//Initializing the list
InitLists;
new(head);
new(tail);
//creating the list
//first node
node.number := 1 ;
new(node.next);
head^ := node ;
tail^ := node ;
//second node
node.number := 2 ;
new(node.next);
tail^.next^ := node;
tail^ := node ;
//third node
node.number := 3 ;
node.next := nil;
tail^.next^ := node;
tail^ := node ;
//adding a node (forth node)
node.number := 4 ;
new(node.next);
new(tail^.next);
tail^.next^ := node ;
tail^ := node ;
//printing the list
temp := head ;
for i:=1 to 4 do
begin
writeln(temp^.number);
if temp^.next <> nil then
begin
temp := temp^.next ;
//this is for testing
//The final node is not being printed
//but instead i'm getting 3 which is the previous node value
writeln('done')
end
end
end.
解决方案
我的问题出在node : Tnode
我使用的那个上,正如评论部分的某个人所建议的那样(他删除了他的评论),我尝试不使用该方法并分配空间并将节点直接分配到列表中,而无需中间,这里它如何为我工作:(Ps:非常感谢不知名的英雄)
Program test;
type
TNodePtr = ^TNode;
TNode = record
number:Integer;
next:TNodePtr;
end;
var
head, tail, node : TNodePtr;
procedure InitLists;
begin
head := nil ;
tail := head ;
end;
begin
//Initializing the list
InitLists;
//creating the list
//first node
writeln('=======================');
new(node);
node^.number := 1 ;
node^.next := nil ;
head := node ;
tail := node ;
writeln(tail^.number);
writeln(head^.number);
writeln('=======================');
//second node
//this is where my issue is
writeln('=======================');
new(node);
node^.number := 2 ;
node^.next := nil ;
tail^.next := node ;
tail := node ;
writeln(tail^.number);
writeln(head^.number);
//exactly here
writeln(head^.next^.number);
writeln('=======================');
//third node
writeln('=======================');
new(node);
node^.number := 3 ;
node^.next := nil ;
tail^.next := node ;
tail := node ;
writeln(tail^.number);
writeln(head^.number);
writeln(head^.next^.number);
writeln(head^.next^.next^.number);
writeln('=======================');
//adding a node (forth node)
writeln('=======================');
new(node);
node^.number := 4 ;
node^.next := nil ;
tail^.next := node ;
tail := node ;
writeln(tail^.number);
writeln(head^.number);
writeln(head^.next^.number);
writeln(head^.next^.next^.number);
writeln(head^.next^.next^.next^.number);
writeln('=======================');
end.