Delphi中单链表操作

单链表顾名思义就是每一个元素只有一个一个直接前驱和一个直接后驱,链表中的每一个元素称为节点,一个节点包括数据区和指针区,数据区即存储数据的部分,指针区即下一个节点的存储地址,操作链表主要就是操作节点的指针区,链表在内存中存储不是连续的,也不是一次性分配和释放的,用链表可以方便的插入和删除元素。下面是一个用Delphi控制台程序写的单链表的增删改查程序。

用Delphi新建一个控制台应用程序,源码如下:

program linklit;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  MyP=^MyRecord;
  MyRecord=record
   data:Integer;
   next:MyP;
end;

function Createlist():MyP;  //创建带头指针的单链表
var
  head1,curnode,newnode:MyP;  //定义头结点、当前节点、新生成节点
  ch:Integer;
begin
  New(head1);
  head1.data:=0;
  curnode:=head1;  //当前指针指向头指针
  Writeln('input:');
  readln(ch);
  while ch<1000 do
  begin
    New(newnode); //生成新节点
    newnode.data:=ch;
    curnode.next:=newnode; //新节点插入表尾节点
    curnode:=newnode;  //指针移到指向新的节点
    Readln(ch);  //输入下一个节点值
  end;
 Writeln('list has been created!');
 curnode.next:=nil;
 Result:=head1;
end;

function Searchlist(head1:MyP;x:Integer):MyP;
var
  curnode:MyP;
  index:Integer;
begin
  index:=0;
  if Assigned(head1.next) then     //判断是否为nil
   begin
     curnode:=head1.next;     //curnode指向第一个节点
     while Assigned(curnode) do     //遍历查找指向值为x的节点
     begin
       Inc(index);
       if curnode.data=x then  //找到返回当前节点
        begin
          Result:=curnode;
          Break;
        end
       else
          curnode:=curnode.next;   //继续下次遍历
     end;
     if not Assigned(curnode) then
       Writeln('data is not in the list!')  //没找到节点
     else
      begin
        Writeln('data has been found!');
        Writeln('the location is:'+inttostr(index));
      end;
   end
  else
   Writeln('the list is empty');
end;

procedure Insertlist(head1:MyP;apos,x:integer);    //在apos节点之前插入元素x
var
  curnode,insertnode:MyP;
  j:Integer;
begin               //只考虑apos大于1的情况
  if Assigned(head1.next) then
   begin
     curnode:=head1.next;
     j:=1;
     while(Assigned(curnode) and (j<apos-1)) do  //查找apos-1个节点,并将curnode指向其直接前驱
      begin
         curnode:=curnode.next;
         Inc(j);
      end;
     if not Assigned(curnode) then
       Writeln('error')
     else
       begin
         New(insertnode);
         insertnode.data:=x;    //生成插入节点
         if Assigned(curnode.next) then       //判断apos-1个节点是否有后继节点
          begin
            insertnode.next:=curnode.next;
            curnode.next:=insertnode;
          end
         else
          begin
            curnode.next:=insertnode;
            insertnode.next:=nil;
          end;
       end;
   end
  else
   Writeln('the list is empty');
end;

procedure Deletelist(head1:MyP;index:integer);  //删除单链表中第index个节点
var
  curnode,delnode:MyP; //当前节点和要删除的节点
  curpos:Integer;
begin
 try
  if Assigned(head1.next) then
   begin
     curpos:=0;
     curnode:=head1;
     while (Assigned(curnode.next)) and (curpos<index-1) do   //查找要删除节点的前一个节点并将指针指向其直接前驱
     begin
       curnode:=curnode.next;
       Inc(curpos);
     end;
     if not Assigned(curnode.next) then  //不存在第index个节点
      Writeln('error')
     else
      begin
        delnode:=curnode.next;
        if not Assigned(delnode.next) then  //判断删除的节点是否有后继节点
          begin
            Dispose(delnode);
            curnode.next:=nil;
          end
        else
          begin
            curnode.next:=delnode.next;
            Dispose(delnode);
          end;
      end;
   end
  else
   Writeln('the list is empty');
 except
   on e:Exception do
     Writeln(e.message);
 end;
end;

procedure Viewlist(head1:MyP);  //遍历链表
var
  p:MyP;
begin
  Writeln('the list is:');
  if Assigned(head1.next) then
   begin
     p:=head1.next;
     while Assigned(p) do
     begin
       Write(Inttostr(p.data)+' ');
       p:=p.next;
     end;
     Writeln;
   end
  else
   Writeln('the list is empty');
end;

procedure Updatelist(head1:MyP;index,avalue:Integer);
var
  curnode:MyP;
  i:integer;
begin
  if not Assigned(head1.next) then
   writeln('the list is empty')
  else
   begin
     i:=0;
     curnode:=head1.next;
     while Assigned(curnode) do
      begin
        Inc(i);
        if i=index then Break;
        curnode:=curnode.next;
      end;
     if not Assigned(curnode) then
      Writeln(Format('input index %d is error',[index]))
     else
      curnode.data:=avalue;
   end;
end;

 

//

var
  head:MyP;
  searchdata,delindex,insertindex,invalue,upIndex,upValue:Integer;
begin
 Writeln('Create list!');
 head:=Createlist;
 Viewlist(head);
 Writeln('searching operation!');
 Writeln('input data:');
 Readln(searchdata);
 Searchlist(head,searchdata);
 Writeln('deleting operation!');
 writeln('input deleted position:');
 Readln(delindex);
 Deletelist(head,delindex);
 Writeln('after deleting operation:');
 Viewlist(head);
 Writeln('inserting operation!');
 writeln('input inserting position and value:');
 Readln(insertindex,invalue);
 Insertlist(head,insertindex,invalue);
 Writeln('after inserting operation:');
 Viewlist(head);
 Writeln('updating operation!');
 Writeln('input updating position and value:');
 Readln(upIndex,upValue);
 Updatelist(head,upIndex,upValue);
 Writeln('after updating operation:');
 Viewlist(head);
 Readln;
end.

 

程序运行截图如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值