Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 1954|回复: 4

处理指针问题

[复制链接]

该用户从未签到

发表于 2012-7-22 19:02:39 | 显示全部楼层 |阅读模式
各位大侠,
肯请你们帮我看一下以下的代码,我利用指针来处理学生信息,错误部分已用红色标出,请好心人帮忙看一下,不甚感激!
implementation

{$R *.lfm}
type
  plink=^student;
  student=record
    name:string[8];
    sex:string[2];
    department:string[16];
    next:plink;
  end;
  var
    Dtrec:plink;

{ TForm1 }

procedure TForm1.Label1Click(Sender: TObject);
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  dtrec:=nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  tempp,p:plink;
begin
  new(tempp);
  tempp^.name:=edit1.text;
  tempp^.sex:=edit2.text;
  tempp^.department:=edit3.text;
  tempp^.next:=nil;
  if dtrec=nil then
  begin
    new(dtrec);
    dtrec:=tempp;
    end
  else
  begin
    p:=dtrec;
    while p^.next<>nil do
    p:=p^.next;
    p^.next:=tempp;
end;
edit1.clear;
edit2.clear;
edit3.clear;
edit1.setfocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  p:plink;
begin
listbox1.clear;
listbox2.clear;
listbox3.clear;
p:=dtrec;
if dtrec=nil then
exit
else
   repeat
     listbox1.Items.Add(p^.name);
     listbox2.Items.Add(p^.sex);
     listbox3.Items.Add(p^.department);
     p:=p^.next;
   until p=nil;

end;

procedure TForm1.Button3Click(Sender: TObject);
var
  p,p1:plink;
  i:integer;
begin
if edit1.text='' then

begin
   showmessage(&#39lease enter name!');
   exit;
end;
i:=0;
p:=dtrec;
if p=nil then
showmessage('Link list is empty!')
else
   if p^.name=edit1.text then;
   begin
     dtrec:=p^.next;
     p^.next:= nil;
     p:= dtrec;
     end
   else  错误提示:Fatal:Syntax error,";" expected but "ELSE" found.

   begin
     p1:=p^.next;
     if p1<>nil then
     repeat
       if p1^.name=edit1.text then
       begin
         p^.next:=p1^.next;
         p1:=p;
         i:=i+1;
         end
       else
       begin
         p:=p1;
         p1:=p1^.next;
         end;
       until p1=nil;
     if i=0 then
     showmessage('No matched data!');
     end;
  end;

end;

end.            
回复

使用道具 举报

该用户从未签到

发表于 2012-7-22 21:47:19 | 显示全部楼层
else
   if p^.name=edit1.text then;  // 去掉分号
   begin
     dtrec:=p^.next;
     p^.next:= nil;
     p:= dtrec;
     end
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-7-23 00:04:05 | 显示全部楼层
这段代码问题很多,我都没看完。先把看到的问题说一下:

if dtrec=nil then
  begin
    new(dtrec);
    dtrec:=tempp;

这种写法不对头啊。

dtrec 被 new 后就是一个指针,指向了 new 出来的一个空间。而 tempp 是另一个指针,指向的是另一个空间。如果做 dtrec := tempp,则 dtrec 原来new出来的那个指针和空间就没有被任何变量引用,内存泄漏,而且再也用不上了。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-7-23 01:16:32 | 显示全部楼层

回 2楼(pcplayer) 的帖子

pcplayer:这段代码问题很多,我都没看完。先把看到的问题说一下:

if dtrec=nil then
  begin
    new(dtrec);
....... (2012-07-23 00:04) 
那这里一般怎么定义?
可以不用new(dtrec)而直接赋值给 dtrec?
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-7-23 09:04:47 | 显示全部楼层

回 1楼(dorry) 的帖子

dorry:else
   if p^.name=edit1.text then;  // 去掉分号
   begin
     dtrec:=p^.next;
     p^.next:= nil;
....... (2012-07-22 21:47) 
谢谢你,有不懂再想你请教。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-3 10:54 , Processed in 0.027640 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表