首页 > 解决方案 > 为空指针赋值

问题描述

我目前正在尝试使用 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.

标签: pointerslinked-listpascalfreepascal

解决方案


我的问题出在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.


推荐阅读