链表的应用示例

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    ListBox1: TListBox;
    ListBox2: TListBox;
    ListBox3: TListBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  Plink = ^student;                                                 //记录指针类型的定义
  student = record
    xm: string[8];                                                  //姓名
    xb: string[2];                                                  //性别
    bj: string[16];                                                 //班级
    next: plink;                                                    //指向下一个节点
  end;

var
  Dtrec: plink;                                                     //定义全局记录指针

procedure TForm1.Button1Click(Sender: TObject);                     //添加按钮
var
  tempp,p: plink;                                                   //定义局部记录指针
begin
  new(tempp);                                                       //动态分配
  tempp^.xm := edit1.Text;                                          //添加的姓名
  tempp^.xb := edit2.Text;                                          //添加的性别
  tempp^.bj := edit3.Text;                                          //添加的班级
  tempp^.next := nil;                                               //默认指向空,防止错误
  if dtrec = nil then                                               //全局指针为空,即没有任何数据
    begin
      dtrec := tempp;
    end
  else
    begin
      p := dtrec;                                                   //p指针进行搜索
      while p^.next <> nil do                                       //搜索到最后一个节点
        p := p^.next;
      p^.next := tempp;                                             //在最后一个节点插入数据
    end;
  edit1.Clear;                                                      //清空
  edit2.Clear;
  edit3.Clear;
  edit1.SetFocus;                                                   //编辑框1获得焦点
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^.xm);
      listbox2.Items.Add(p^.xb);
      listbox3.Items.Add(p^.bj);
      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('请输入姓名,姓名不能为空!');
      exit;
    end;
  i := 0;
  p := dtrec;                                                       //p指向链表头
  if p = nil then                                                   //链表无数据
    showmessage('链表为空!')
  else                                                              //根据姓名搜索
    if p^.xm = edit1.Text then                                      //如果在表头
      begin
        dtrec := p^.next;                                           //dtrec指向第二个数据
        dispose(p);                                                 //释放p相应的内存单元
      end
    else
      begin
        p1 := p^.next;
        if p1 <> nil then
          repeat
            if p1.xm = edit1.Text then                              //找到要删除的数据
              begin
                p^.next := p1^.next;                                //断开要删除的数据连接
                dispose(p1);                                        //释放删除的数据
                i := i + 1;                                         //找到数据的标志
              end
            else                                                    //寻找数据
              begin
                p := p1;
                p1 := p1^.next;
              end;
          until p1 = nil;
        if i = 0 then
          showmessage('无匹配数据!');
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);                       //窗口创建
begin
  dtrec := nil;                                                     //全局指针为空
end;

end.

 

posted @ 2011-12-08 12:30  endsnow  阅读(179)  评论(0)    收藏  举报