回 帖 发 新 帖 刷新版面

主题:建立先进先出链表中的问题?

program aa;            {建立先进先出链表}
type
  point=^rec;
  rec=record
        num:integer;
        link:point;
      end;
var
  p,q,h:point;
  n,t:integer;
begin
  new(h);              {建立头节点}
  new(p);              {有没有此句程序结果都一样,为什么呢?}
  h^.num:=1;
  p:=h;
  t:=2;
  read(n);
  while n<>9999 do     {建立后面的节点,以输入9999结束}
    begin
      new(q);
      q^.num:=n;
      p^.link:=q;
      p:=q;
      read(n);
    end;
  p:=h;
  writeln;writeln;
  while p^.num<>9999 do  {输出链表数据,以p^.num<>9999作为判断条件会出错,为什么?}
    begin
      write(p^.num:5);
      p:=p^.link;
    end;
end.

回复列表 (共3个回复)

沙发

[quote]new(p);[/quote][quote]p:=h;[/quote]
第二句就把第一句给作废了。
第一句申请了一个心的空间,第二句就改变了指向。
删除与否只是差一个存储空间。

板凳

感谢小田甜回答,你的解释让我有豁然开朗的感觉,还有第二个问题(倒数第6行),可以说说你的看法吗?
我看书上的例子是要给最后一个节点的 ".link" 域赋 "nil" 的,判断的时候用的是 "p<>nil"(如下,中括号中是能正确执行的程序)。程序就可以正常执行了。
  [p^.link:=nil;]
  p:=h;
  writeln;writeln;
  while p^.num<>9999 do [while p<>nil do] {输出链表数据,以p^.num<>9999作为判断条件会出错,为什么?}
    begin
      write(p^.num:5);
      p:=p^.link;
    end;
end.

3 楼

应该是用nil来标记结束,你的程序不知道是不是用的9999来标记结束。
我认为用nil标记结束更为合适。

我来回复

您尚未登录,请登录后再回复。点此登录或注册