主题:[请教]如何理解指针赋值操作
mmhunter
[专家分:20] 发布于 2008-08-18 08:44:00
读入一串以"#"为结束标志的字符,统计每个字符出现的次数。
program zz_ex11_10;
type ref=^letters;
letters=record
key:char;
count:integer;
next:ref;
end;
var k:char;
sentinel,head:ref;
procedure search(x:char);
var w:ref;
begin
w:=head; {如何理解}
sentinel^.key:=x;
while w^.key<>x do w:=w^.next; {w:=w^.next如何理解}
if w<>sentinel {如何理解}
then w^.count:=w^.count+1
else begin
w:=head; {如何理解}
new(head);
with head^ do
begin
key:=x;
count:=1;
next:=w; {如何理解}
end;
end;
end;
procedure printlist(w:ref);
begin
while w<>sentinel do
begin
writeln(w^.key:2,w^.count:10);
w:=w^.next;
end;
end;
begin
new(sentinel);
with sentinel^ do
begin
key:='#';count:=0;next:=nil;
end;
head:=sentinel;
read(k);
while k<>'#' do
begin
search(k);
read(k);
end;
printlist(head);{如何理解}
end.
最后更新于:2008-08-18 08:51:00
回复列表 (共2个回复)
沙发
小田甜 [专家分:3910] 发布于 2008-08-20 13:26:00
[quote]
读入一串以"#"为结束标志的字符,统计每个字符出现的次数。
program zz_ex11_10;
type ref=^letters;
letters=record
key:char;
count:integer;
next:ref;
end;
var k:char;
sentinel,head:ref;
procedure search(x:char);
var w:ref;
begin
w:=head; {如何理解}
sentinel^.key:=x;
while w^.key<>x do w:=w^.next; {w:=w^.next如何理解}
if w<>sentinel {如何理解}
then w^.count:=w^.count+1
else begin
w:=head; {如何理解}
new(head);
with head^ do
begin
key:=x;
count:=1;
next:=w; {如何理解}
end;
end;
end;
[/quote]
[quote]
procedure search(x:char);
var w:ref;
begin
w:=head; {如何理解}
[/quote]
这里是将指针w指向初始位置.
[quote]
sentinel^.key:=x;
while w^.key<>x do w:=w^.next; {w:=w^.next如何理解}
[/quote]
找到与w相同的字符(如果该字符之前出现过那么只统计数字+1,不记录新的字符,否则记录新的.)
[quote]
if w<>sentinel {如何理解}
[/quote]
如果相同那么说明找到了(之前出现过),否则则说明之前没有出现过.
[quote]
then w^.count:=w^.count+1
else begin
w:=head; {如何理解}
[/quote]
插入该元素于链表的最前端,这里用w记录链表的首指针.
[quote]
new(head);
with head^ do
begin
key:=x;
count:=1;
next:=w; {如何理解}
[/quote]
把链表原来的首指针变成新head^的后继(head^.next)
[quote]
end;
end;
end;
[/quote]
[quote]
procedure printlist(w:ref);
begin
while w<>sentinel do
begin
writeln(w^.key:2,w^.count:10);
w:=w^.next;
end;
end;
[/quote]
[quote]
begin
new(sentinel);
with sentinel^ do
begin
key:='#';count:=0;next:=nil;
end;
head:=sentinel;
read(k);
while k<>'#' do
begin
search(k);
read(k);
end;
printlist(head);{如何理解}
[/quote]
打印...当然是调用上面的过程拉.
[quote]
end.
板凳
pupu [专家分:50] 发布于 2008-08-25 15:10:00
program zz_ex11_10;
type ref=^letters;
letters=record
key:char;
count:integer;
next:ref;
end;
var k:char;
sentinel,head:ref;
procedure search(x:char);
var w:ref;
begin
w:=head; {w为全局变量}
sentinel^.key:=x;
while w^.key<>x do w:=w^.next; {w:=w^.next 在链表中查找}
if w<>sentinel {找到处理}
then w^.count:=w^.count+1
else begin
w:=head; {找不到,则在表头新建结点}
new(head);
with head^ do
begin
key:=x;
count:=1;
next:=w; {表头是新件建的结点}
end;
end;
end;
procedure printlist(w:ref);
begin
while w<>sentinel do
begin
writeln(w^.key:2,w^.count:10);
w:=w^.next;
end;
end;
begin
new(sentinel);
with sentinel^ do
begin
key:='#';count:=0;next:=nil;
end;
head:=sentinel;
read(k);
while k<>'#' do
begin
search(k);
read(k);
end;
printlist(head);{打印链表}
end.
我来回复