单链表顾名思义就是每一个元素只有一个一个直接前驱和一个直接后驱,链表中的每一个元素称为节点,一个节点包括数据区和指针区,数据区即存储数据的部分,指针区即下一个节点的存储地址,操作链表主要就是操作节点的指针区,链表在内存中存储不是连续的,也不是一次性分配和释放的,用链表可以方便的插入和删除元素。下面是一个用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.
程序运行截图如下: