Pointers 为nill指针赋值

Pointers 为nill指针赋值,pointers,linked-list,pascal,freepascal,Pointers,Linked List,Pascal,Freepascal,我目前正在尝试使用pascal实现单向链表,但我有点迷路了,下面我尝试在添加节点之前创建一个列表,然后将nil分配给最后一个节点,但是当我尝试添加新节点时,我无法访问它(运行时错误216),或者由于一些我不理解的原因,我获取了最后一个指针值 Program test; type TNodePtr = ^TNode; TNode = record number:Integer; next:TNodePtr; end; var

我目前正在尝试使用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.
程序测试;
类型
TNodePtr=^TNode;
TNode=记录
数字:整数;
下一步:TNodePtr;
结束;
变量
头部、尾部、温度:TNodePtr;
节点:TNode;
i:整数;
程序清单;
开始
水头:=零;
尾:=头;
结束;
开始
//初始化列表
初始列表;
新(首长);;
新(尾);
//创建列表
//第一节点
节点编号:=1;
新建(node.next);
头^:=节点;
尾^:=节点;
//第二节点
节点号:=2;
新建(node.next);
tail^.next^:=节点;
尾^:=节点;
//第三节点
节点编号:=3;
node.next:=nil;
tail^.next^:=节点;
尾^:=节点;
//添加节点(第四个节点)
节点编号:=4;
新建(node.next);
新的(尾^下一个);
tail^.next^:=节点;
尾^:=节点;
//打印列表
温度:=水头;
对于i:=1到4 do
开始
writeln(临时编号);
如果温度为下一个零,则
开始
温度:=temp^.next;
//这是测试用的
//未打印最后一个节点
//但是我得到的是3,这是之前的节点值
writeln('done')
结束
结束
结束。

我的问题在于我使用的
节点:Tnode
,正如评论部分的某人所建议的(他删除了他的评论),我尝试不使用该方法,分配空间并将节点直接分配到列表中,而无需中间层,下面是它对我的作用:(Ps:非常感谢未知英雄)


我的问题是我使用的
节点:Tnode
,正如评论部分的某个人所建议的(他删除了他的评论),我尝试不使用这种方法,分配空间并将节点直接分配到列表中,而不使用中间节点,下面是它对我的作用:(Ps:非常感谢未知英雄)


您应该能够找到无数单链表的FPC示例,因为这是一个基本的编程练习。如果你做不到,就自己用调试器来识别问题——你会学到比别人告诉你答案多得多的东西。Iac,你总是可以“在纸上”调试链表问题,也就是说,只需画出代码执行的步骤。@MartynA感谢它提供的真正有用的建议。.你应该能够找到无数单链表的FPC示例,因为这是一个基本的编程练习。如果你做不到,就自己用调试器来识别问题——你会学到比别人告诉你答案多得多的东西。Iac,你总是可以“在纸上”调试链表问题,也就是说,只要画出代码执行的步骤。@MartynA感谢你的建议,它真的很有帮助。。
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.