链式存储结构

链表的基本概念

链表是一种线性表,但与数组不同的是,它允许表中元素的存储单元任意,由指针将存储表元素的单元串联起来,因此称为链式存储结构
链表可以避免删除或插入元素时移动大量元素,便于扩展存储空间
对于每个数据元素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;




   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值