Pointers 为nill指针赋值
我目前正在尝试使用pascal实现单向链表,但我有点迷路了,下面我尝试在添加节点之前创建一个列表,然后将nil分配给最后一个节点,但是当我尝试添加新节点时,我无法访问它(运行时错误216),或者由于一些我不理解的原因,我获取了最后一个指针值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
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.