回 帖 发 新 帖 刷新版面

主题:一个指针问题

偶对这个关于指针链表程序看不懂,谁能为我解释一下:
type
point=^node;
node=record
       date:real;
       link:point;
     end;
var
  head,last,next:point;
  x:real;
begin
  read(x);
  write(x:6:1);
  new(head);
  head^.date:=x;
  last:=head;
  read(x);
  write(x:6:1);
  while x>=0 do
    begin
    new(next);
    next^.date:=x;
    last^.link:=next;
    last:=next;
    read(x);
    write(x:6:1)
  end;
  writeln;
  last^.link:=nil;
  next:=head;
  while next<>nil do
    begin
      write(next^.date:6:1);
      next:=next^.link
    end;
    writeln
  end.

回复列表 (共6个回复)

沙发

看来又要偶出手了```如果有问题欢迎指正```
type{定义指针}
point=^node;{你可能认为这里和下面的LINK:POINT很奇怪,不过偶也忘了怎么解释了,反正记住应该这样``诶,好象是废话呢``}
node=record
       date:real;{这是数据域}
       link:point;{这是指针域,就是指向下一个指针的地方}
     end;
var{这部分没什么好说的}
  head,last,next:point;{将他们定义为指针类型啦`}
  x:real;
begin
  read(x);
  write(x:6:1);
  new(head);{指针的特有操作,就是在内存中申请一个独立的内存空间用来存放该指针中的内容}
  head^.date:=x;{将读如的数据写入头指针(head)的数据域中`}
  last:=head;{将头指针(head)赋给尾指针(last)}
  read(x);
  write(x:6:1);
  while x>=0 do
    begin
    new(next);{同前,为NEXT开辟内存空间}
    next^.date:=x;{将X写入其数据域}
    last^.link:=next;{将尾指针(last)的下一个指向next}
    last:=next;{将next的值赋给尾指针(last)注意其中包括数据域和指针域,把这几步连起来看看,如果想不明白可以画图试试(一个指针包括2个格子,一个代表数据域,一个代表指针域,然后在指针域那一格连出一箭头指向其他指针结点),耐心点就能想明白的.}
    read(x);
    write(x:6:1)
  end;
  writeln;
  last^.link:=nil;{经过前面的建表过程后将最后一个结点的指针域赋值为空}
  next:=head;{将头指针赋给当前的next}
  while next<>nil do{这里是打印链表内容,即指针域不为空就打印}
    begin
      write(next^.date:6:1);
      next:=next^.link{每打印完一个就指向下一个}
    end;
    writeln
  end.
表忘了加分哦```:)

板凳

还有一点不明:既已将尾指针(last)的下一个指向next},为何还要将next的值赋给尾指针(last)?
指向和赋值有什么不同?

3 楼


普通类型存储的是值,而指针类型存储的是内存地址

你把哪个变量的地址赋值给指针,那么指针就会存储着那个变量的地址,当你修改指针的值时(要带^号),实际上改的是那个变量的值.
  如:
     var
       i:integer;
       k:^integer;
     begin
      i:=1;
      k:=@i
      k^:=2;
      writeln(i);
     end.
输出的将会是2而不是1;
所以赋值是直接复制其内容,而指向则是取其内存地址;

程序中last是表中最后一个元素;
现用vi来表示第i个元素 "->" 表示指向

head=v1;v1.link->v2;v2.link->v3;......->vn=last

在vn后插入一个元素变成了:
head=v1;v1.link->v2;v2.link->v3;......->vn=last;vn.link->next

last未改前vn.link即是last.link

last.link=next实际上是使vn.link=next

然后使last=next,变成了

head=v1;v1.link->v2;.....->vn;vn.link->next=last
于是last便总是指向最后一个元素了.

4 楼

对咯``谢谢楼上的为我补充,谢谢`!

5 楼

能否再解释以下:last^.link:=next;
    last:=next;
少了其中一步会怎样?

6 楼

习惯上的用法,就是让LAST代表最后一个指针
但是如果没有那一句,那链表里就永远只有那一个元素了,就建不成表了``

我来回复

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