回 帖 发 新 帖 刷新版面

主题:[请教]如何理解指针赋值操作

读入一串以"#"为结束标志的字符,统计每个字符出现的次数。
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.

回复列表 (共2个回复)

沙发

[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.
 

板凳

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.

我来回复

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