主题:一个指针问题
绿步甲
[专家分:1610] 发布于 2005-08-06 11:48:00
偶对这个关于指针链表程序看不懂,谁能为我解释一下:
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个回复)
沙发
MagicG [专家分:650] 发布于 2005-08-06 13:41:00
看来又要偶出手了```如果有问题欢迎指正```
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.
表忘了加分哦```:)
板凳
绿步甲 [专家分:1610] 发布于 2005-08-07 13:31:00
还有一点不明:既已将尾指针(last)的下一个指向next},为何还要将next的值赋给尾指针(last)?
指向和赋值有什么不同?
3 楼
cylixstar [专家分:60] 发布于 2005-08-07 14:44:00
普通类型存储的是值,而指针类型存储的是内存地址
你把哪个变量的地址赋值给指针,那么指针就会存储着那个变量的地址,当你修改指针的值时(要带^号),实际上改的是那个变量的值.
如:
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 楼
MagicG [专家分:650] 发布于 2005-08-08 08:47:00
对咯``谢谢楼上的为我补充,谢谢`!
5 楼
绿步甲 [专家分:1610] 发布于 2005-08-10 14:38:00
能否再解释以下:last^.link:=next;
last:=next;
少了其中一步会怎样?
6 楼
MagicG [专家分:650] 发布于 2005-08-11 09:50:00
习惯上的用法,就是让LAST代表最后一个指针
但是如果没有那一句,那链表里就永远只有那一个元素了,就建不成表了``
我来回复