链表的基本概念
链表是一种线性表,但与数组不同的是,它允许表中元素的存储单元任意,由指针将存储表元素的单元串联起来,因此称为链式存储结构
链表可以避免删除或插入元素时移动大量元素,便于扩展存储空间
对于每个数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继或前驱的信息。这两部分信息组成了数据元素ai的存储映像,称为节点,其中包括数据元素信息的数据域和存储后件存储位置的指针域next或前件地址的指针域prev。
指针域可用动态指针变量来存储前后件地址,亦可采用数组变量来存储前后件元素的数组下标。
为了存取方便,设head为链表的“哨兵”,它的后件指针域next存储链表首元素的地址
链表的类型定义
用数组模拟
Type
node=record
data:elemtp;
next:integer;
end;
List=array[1..n] of node;
用指针类型:
point = ^node;
node= record
data : elemtp (可以为任意类型);
next: point ;
end;
链表的形式
单向链表
由于单链表的每个结点都有一个数据域和一个指针域,所以,每个结点都可以定义成一个记录。
双向链表
每个结点有两个指针域和若干数据域,其中一个指针域指向它的前趋结点,一个指向它的后继结点。它的优点是访问、插入、删除更方便,速度也快了。但“是以空间换时间”。
链表的形式
单向循环链表:最后一个结点的指针指向头结点。
双向循环链表:最后一个结点的指针指向头结点,且头结点的前趋指向最后一个结点。
指针操作
声明一个指针变量:
Var p:^integer;
生成一个数据空间,用指针指向它:
New(p);
删除p指向的数据空间:
Dispose(p);
访问p指向空间的数据:
p^:=20;
链表的基本运算
1、构建链表(creat_Link)
2、插入操作(insert_Link)
3、删除操作(delet_Link)
4、读取操作(get_Link)
构建单链表
procedure creat_link(var head:pointer);
{ head:=nil;
for i:=n downto 1 do
{new(p);
p^.data:=ai;
p^.next:=head; //反序插入
head:=p;
}
}
插入操作
//在单链表的第i个节点前插入元素x
procedure insert_link(x:elemenetype;i:integer;var head:pointer);
{new(s);
s^.data:=x;
p:=head;j:=0;
while (p<>nil)and(j<i-1) do{p:=p^.next;j:=j+1;}
if p<>nil then{s^.next:=p^.next;p^.next:=s}
else writeln(‘without’);
}
删除操作
//删除单链表的第i个节点的操作如下
procedure delete_link(i:integer;var head:pointer);
{p:=head;j:=0;
whiel (p^.next<>nil) and (j<i-1) do
{p:=p^.next; j:=j+1;}
if p^.next=nil then writeln(‘without’)
else
{q:=p^.next;
p^.next:=p^.next^.next;
dispose(q);}
}
读取操作
//读取单链表的第i个元素的操作如下
function get_link(i:integer;var head:pointer):elementype;
{p:=head^.next;
j:=1;
while (p<>nil) and (j<i) do{p:=p^.next;j:=i+1;}
if p=nil then writeln(‘without’)
else exit(p^.data);
}
练习
1、在线排序。输入数值,构建成有序链表,将结果输出。
2、设有两个线性表LA和LB,这两个线性表都是从小到大排好序,编程让两个线性表合并成一个排好序的线性表
program link;
type
point=^node;
node=record
data:integer;
next:point;
end;
var
h,p:point;
n,i:integer;
procedure insert(var h:point);
var
p,q:point;
begin
new(p);
read(p^.data);
if (h=nil) or (p^.data<h^.data) then
begin
p^.next:=h;
h:=p;
exit;
end;
q:=h;
while (q^.next<>nil) and (q^.next^.data<p^.data) do
q:=q^.next;
p^.next:=q^.next;
q^.next:=p;
end;
procedure print(h:point);
var
p:point;
begin
p:=h;
while p<>nil do
begin
writeln(p^.data,' ');
p:=p^.next;
end;
end;
begin
readln(n);
h:=nil;
for i:=1 to n do
begin
insert(h);
end;
print(h);
end.
静态链表
用数组模拟
Type
node=record
data:elemtp;
next:integer;
end;
List=array[1..n] of node;