线性表及应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例题2、猴子选大王 例题 、
链表实现: 链表实现: 教材“数据结构及应用” 教材“数据结构及应用”p 22 牵涉知识:建立循环链表, 牵涉知识:建立循环链表,结点计数及删除结点 操作
type point=^node; node=record data:integer; next:point; end; var m,n,s:integer;p,q,head:point; begin readln(m,n); new(head);q:=head;head^.data:=1; for s:=2 to m do begin new(p);p^.data:=s;q^.next:=p;q:=p; end; q^.next:=head; s:=1;q:=head; if n=1 then writeln(m)
procedure inser1( head1:point; st2:string); var p,q,r : point ; begin new(r);r^.da:=st2 ; r^.link:=nil ; p:=head1^.link ; q:=head1; while (p<>head1) and (p^.da<st2) do begin q:=p; p:=p^.link ; end; r^.link:=q^.link ; q^.link:=r ; end; q:=q^.link ;
7、循环链表 、
将表尾的指针指向表头, 将表尾的指针指向表头,构成循环链接表 (1) 单链表类型描述 ) type link=^node; node=record data:integer; next:link; end; var head:link;
循环链表:一种首尾相接的链表。 循环链表:一种首尾相接的链表。 单循环链表——在单链表中,将终端结点的指针域 在单链表中, 单循环链表 在单链表中 将终端结点的指针域nil 改为指向表头结点或开始结点即可。 改为指向表头结点或开始结点即可。 (2)带头结点的单循环链表 ) 其作用方便插入和删除, 其作用方便插入和删除,算法与单链表类似
s^.next:=q^.next ;q^.next :=s ; q:=q^.next ; end ; end ;
6、单链表的删除 、
前提:删除 结点后的 结点后的r结点 前提:删除p结点后的 结点 表头删除: 表头删除: head^.next:=p^.next; dispose(p); 表中删除: 表中删除: q^.next:=p^.next; dispose(p); 表尾删除: 表尾删除: q^.next:=nil; dispose(p);
3、单链表的遍历与输出 、
PROCEDURE print ( head : point ) ; { 带表头指针 带表头指针} var p : point ; BEGIN p := head while p < > nil do begin write ( p^.data : 8 ) ; ^ p := p^.next ; ^ end ; end; { 打印链表的过程 }
例题1 建立一个若干个学生姓名的循环链接表, 例题 建立一个若干个学生姓名的循环链接表,并 输出,完成以下功能: 输出,完成以下功能: (1)建立按字典顺序排列的顺序链表,并输出 )建立按字典顺序排列的顺序链表, (2)输入一个学生姓名,若该学生姓名在链表中, )输入一个学生姓名,若该学生姓名在链表中, 则删除该结点,若不在链接表中, 则删除该结点,若不在链接表中,则插入该学生姓 名,并使其仍然有序。 并使其仍然有序。 (3)要有判断链表为空的功能 )
5、插入结点的操作 、
插入到头结点: 插入到头结点 P^.next:=head; ^ head:= p;
插入到某一个结点 P^.next:=q^.next; ^ ^ q^.next:=p ; ^ q:= q^.netx ; ^
插入到尾部: : 插入到尾部 r^.next :=p; ^ r := p ;
二、线性表的链接存储
1、单向线性链表 、 2、有序链表 、 3、双向线性链表 、 4、循环链表 、
1、用表头插入法建立链表 、
read(ch); head:=nil; while ch<>'#' do begin new(p); p^.data:=ch; p^.next:=head; head:=p; read(ch); end; p:=head;
问题分析: 问题分析: (1)建立循环链表的过程,其实质是不断插入结点 建立循环链表的过程, 的过程,所以首先建立一个头结点,不断插入结点。 的过程,所以首先建立一个头结点,不断插入结点。 (2)在插入结点的过程中,需要判断插入结点的定 在插入结点的过程中, 位问题。总是从表头的下一个结点开始搜索位置。 位问题。总是从表头的下一个结点开始搜索位置。 (3)删除结点的过程,需要寻找删除结点位置(用 删除结点的过程,需要寻找删除结点位置( 两个指针变量完成),当找到删除结点, 两个指针变量完成),当找到删除结点,则进行删除 ),当找到删除结点 否则插入该结点。 否则插入该结点。 (4)打印循环线性表的过程:从头结点的下一个结 打印循环线性表的过程: 点开始输出. 点开始输出.
插入算法实现
Procedure insert (var head:point ;ch:char); Var p,q,s:point ; Begin p:=head ; q:=p; new(s) ; s^.data:=ch;s^.next:=nil; While (p<>nil) and ( ch>p^.data) do {查找位置 查找位置} 查找位置 begin q:=p ; p:=p^.next ; 插入表头: 插入表头: end; Begin S^.next :=head; head:=s ; end; { 表尾 表尾} else { 插入表内 插入表内} If p=nil then q^.next:=s begin Else if p=head then
插入表头: 插入表头:if p=head then begin s^.next:=head; head:=s ;p:=head ;q:=head ; end 否则 : If p=nil then 插入表尾 q^.next:=s 否则 插入表中 s^.next:=q^.next ;q^.next :=s ; q:=q^.next;
2、用表尾插入法建立链表 、
read(ch); head:=nil; q:=nil; while ch<>'#' do begin new(p); p^.data:=ch; p^.next:=nil; if head=nil then begin head:=p; q:=p; end else begin q^.next:=p; q:=p; end; read(ch); end;
if p = head then
begin p := p^.next ; ^ dispose ( q ) ; head := p ; end ; else begin q^.next := p^.next ^ ^ dispose ( p ) ; p := q^.next ; ^ end ;
print ( head ) ; end ;{ 删除一个结点并打印 } {
4、线性表的查找算法 、
Procedure search( head :point, ch:char ); Var p:point ; Begin p:=head; while (p<>nil) and (p^.data<>ch) do p:=p^.next; if p<>nil then write('ok') else write('sorry');
program xunhuanlianbiao; while p<>head1 do type point=^stu; begin stu= record write(p^.da:5); da:string[8] ; p:=p^.link ; link: point ; end; end; writeln; var head,p,q : point ; end; st1:string[8]; len,x: integer ; procedure print( head1:point); var p:point ; begin p:=head1^.link ;
பைடு நூலகம்
procedure dele( head1:point ;st2:string) ; var p,q :point ; begin p:=head1^.link ; q:=head1 ; while (p^.link<>head1) and (p^.da<>st2) do begin q:=p; p:=p^.link ; end;
if (p^.link=p) or ( p^.link=head1) then begin writeln('not found ') ;inser1( head1,st2); end else begin q^.link:=p^.link ; dispose(p); p:=q^.link ; end; end;
线性链表及应用
单双向链表、 单双向链表、有序链表 循环链表、 循环链表、线性表的应用
2010/3/4 南京树人国际学校09初一信息奥赛
一、顺序表中结点ai 的存储地址 顺序表中结点
假设表中每个结点占用c个存储单元, 假设表中每个结点占用c个存储单元,其中开 始结点a 的存储地址(简称为基地址) 始结点a1的存储地址(简称为基地址)是LOC ),那么结点 那么结点a (a1),那么结点ai的存储地址 LOC( LOC(ai)为: LOC(ai)= LOC(a1)+(i-1)*c ( ( ( ) 1≤i≤n
删除操作 : 删除头结点 P:=head ; : Head:=head^.next; Dispose (p); 删除某一个结点 q^.next := p^.next ; ^ ^ dispose ( p ) ;
PROCEDURE dele ( var head :point ; ch:char ) ; var p , q : point ; BEGIN p := head ; q := p ; while ( p^.data < > ch ) and ( p <> NIL ) do begin q := p ; p := p^.next ; ^ end ; { 查找所要删除的结点 } if p = NIL then writeln ( ' not found ') else
6、建立有序链表 、
算法:既不能仅用表头插入法, 算法:既不能仅用表头插入法,也不能仅用尾插入法 输入第一个数,建立结点, 输入第一个数,建立结点,三个指针均指向头结点 head:=s; p:=s ;q:=p ; 当没有结束时,读入下一个数,建立结点, 当没有结束时,读入下一个数,建立结点,将该数据 与已有的链表的每个结点值比较: 与已有的链表的每个结点值比较: while ( s^.data >p^.data ) and ( p<>nil ) do begin q:=p ; p:=p^.next ; end;
打印循环线性表的过程: 打印循环线性表的过程:从头结点的下一个结点开始输出
写出循环链表的遍历过程
procedure print(head:point); var p:point; begin p:=head^.next; while p<>head do begin write(p^.da:5); p:=p^.next; end; end;
begin new(head); head^.da:='#'; head^.link:= head; p:=head ; readln(st1); while st1<>'#' do begin inser1(head,st1); readln(st1); end; print(head);
repeat write('please input 1-3 '); readln(x); case x of 1: begin readln(st1);inser1(head,st1);print(head); end; 2: begin readln(st1);dele(head,st1);print(head);end; end; until x=3 ; end.
相关文档
最新文档