线性结构及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
①用数组实现 ②用链表实现
线性表的应用
3、 、
Joseph(约瑟夫 问题 约瑟夫)问题 约瑟夫 问题描述】 【问题描述】 m只猴子要选大王,选举办法如下:所有猴子按 只猴子要选大王, 编号围坐一圈, 只猴子要选大王 选举办法如下:所有猴子按1…m编号围坐一圈,从第 号开始按 编号围坐一圈 从第1号开始按 顺序1, , , 报数 凡报到竹的猴子退出到圈外,如此循环, 报数, 顺序 ,2,…,n报数,凡报到竹的猴子退出到圈外,如此循环,直到圈内只剩下一 只猴子时, 只猴子时, 这只猴子就是大王。 这只猴子就是大王。 m和咒由键盘输入,打印出最后剩下的那只猴子的编号。 和咒由键盘输入, 和咒由键盘输入 打印出最后剩下的那只猴子的编号。 运行示例: 运行示例: Input m,n:8 3 , : The monkey king is no.7 . ①用数组实现 算法分析】 【算法分析】 在确定程序设计方法之前首先来考虑如何组织数据,由于要记录m只猴子的状态 只猴子的状态, 在确定程序设计方法之前首先来考虑如何组织数据,由于要记录 只猴子的状态, 可利用含m个元素的数组 可利用含 个元素的数组monkey来实现。利用元素下标代表猴子的编号,元素的值 来实现。利用元素下标代表猴子的编号, 个元素的数组 来实现 表示猴子的状态, 表示第k只猴子仍在圈中 表示猴子的状态,用monkeyEk]=l表示第 只猴子仍在圈中,monkeyEk-]=0则表示第 表示第 只猴子仍在圈中, 则表示第 k只猴子已经出圈。 只猴子已经出圈。 只猴子已经出圈 程序采用模拟选举过程的方法,开始时将报数变量count置为 ;用变量 置为1;用变量current表示 程序采用模拟选举过程的方法,开始时将报数变量 置为 表示 当前报数的猴子的编号,初始时也置为1;变量。 记录出圈猴子数。 当前报数的猴子的编号,初始时也置为 ;变量。out记录出圈猴子数。当count=n时, 记录出圈猴子数 时 对当前报数的猴子做出圈处理, 对当前报数的猴子做出圈处理,即monkey[current]:=O,count:=0,out:=out+1。 : , : : 。 然后继续往下报数,直到圈中只剩一只猴子为止(即out=m-1)。 然后继续往下报数,直到圈中只剩一只猴子为止 即 。
线性表基本操作的实现
单链表基本操作的实现 (1)初始化 New(head); head:=nil; (2)建表 (头插法建表和尾插法建表) read(ch); while ch<>’#’do begin new(p);P^.data:=ch;P^.next:=head: head:=p;read(ch); end; P:=head
线性结构及其应用
线性表的概念
线性表(linear_list)是最常用、最简单的一种数据结构。 一个线性表是n(n≥0)个具有相同特性的数据元素的有限 序列。 它具有以下特性: 存在唯一的被称作“第一个”的数据元素; 存在唯一的被称作“最后一个”的数据元素; 除第一个元素外,线性表中的每个数据元素均只有一个前 驱; 除最后一个元素外,每个数据元素均只有一个后继; 线性表中的数据元素可以使多种类型,但同一线性表中的 元素必定具有相同特性。即基类型相同。
双向链表基本操作的实现
单链表的特点是任何操作都必须从表头 开始。假如要把一个链表从尾到头输出, 那效率就太低了,建立双向链表可以解决 这一问题。
循环链表基本操作的实现
利用指针实现表时,表中最后一个元素所在单元的指针 域(next)为空指针nil。如果将这个空指针改为指向表头单 元的指针就使整个链表形成一个环。.这种首尾相接的链 表称为循环链表。在循环链表中,从任意一个单元出发可 以找到表中其他单元。 (1)单向循环链表 在单链表中,将最后一个结点的指针指向头结点 (2)双向循环链表 在单向循环链表中,虽然从任一单元出发,可以找到其 前驱单元,但需要O(n)时间。如果将双链表中最后一个结 点的指针指向头结点,且头结点的前趋指向最后一个结点, 这样就构成了双向循环链表
线性表基本操作的实现
单链表基本操作的实现 (3)单链表的遍历与输出 单链表的遍历与输出 P:=head; : ; while p<>nil do begin write(p^.data);P:=p^.next; . ; : . ; end; ; (4)求单链表的长度 求单链表的长度lenlkst(head) 求单链表的长度 function lenlkst(head:link):integer; : : ; Var P:link;i:integer; : ;: ; begin P:=head;i:=0; : ;: ; while P^.next<>nil do . begin i:=i+1;P:=P^.next : ; : . end; ; lenlkst:=i; : ; end; ;
线性表基本操作的实现
(3)获取元素 Procedure getlist(a:list;i:integer;var x:lelement); Begin if (i<=0) or (i>a.last) then writeln(‘取数位置不对’) else if a.last=0 then writeln(‘表为空’) else x:=a.data[i] End; (4)定位 Function loclist(a:list; x:lelement):integer; Begin i:=1; while (i<=a.last)and(a.data[i]<>x) do i:=i+1; if i<=a.last then loclist:=i else loclist:=0 End;
线性表基本操作的实现
(5)插入元素 Procedure inslist(var a:list;i:integer;x:lelement); Var j:integer; Begin if a.last+1>lmaxlen then writeln(‘超出最大长度’); if (i>a.last) or (i<0) then writeln(‘插入位置不对’); if (i<=a.last+1)and(i>0)and(a.last+1<=lmaxlen) then begin for j:=a.last downto i do a.data[j+1]:=a.data[j]; a.data[i]:=x; a.last:=a.last+1 end; End;
线性表基本操作的实现
单链表基本操作的实现 (5)判断链表是否为空(emplkst(head)) function emplkst(head:link):boolean; begin if head^.Next=nil then emplkst:=true else emplkst:=false end; (6)查找 ①按序号查找。 ②按值查找。 read(ch); P:=head; while(p<>nil)and(p^.data<>ch)do P:=P^.next; if p<>nil then write(’ok’) else write(‘sorry‘);
线性表基本操பைடு நூலகம்的实现
单链表基本操作的实现 (2)建表 (头插法建表和尾插法建表) read(ch);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;
线性表的存储结构
链接存储结构:用指针类型来描述 单链表: Type datatype={ datatype={单链表中结点的数据类型} } link=^node; node=record data:dataty; next:link end;
线性表基本操作的实现
顺序存储线性表基本操作的实现 (1)初始化 Procedure initial(a:list); Begin a.last:=0; End; (2)求长度 Function length(a:list):integer; Begin length:=a.last; End;
线性表基本操作的实现
(6)删除 Procedure dellist(var a:list;i:integer); Var j:integer; Begin if a.last=0 then writeln(‘表为空’); if (i<0) or (i>a.last ) then writeln(‘删除位置有错’); if (a.last<>0) and (i>0)and(i<=a.last) then begin for j:=i+1 to a.last do a.data[j-1]:=a.data[j]; a.last:=a.last-1; end; End;
线性表基本操作的实现
单链表基本操作的实现 (8)删除值为 的结点 删除值为z的结点 删除值为 表头删除。Head^.next:=P^.next;dispose(p); 表头删除。 表头删除 . : . ; ; 表中删除。q^.next:=p^.next;dispose(p); 表中删除。 . 表中删除 : . ; ; 表尾删除。q^.next:=nil;dispose(p); 表尾删除。 . 表尾删除 : ; ; procedure delete(var head:pointer;x:integer); : ; : ; var P,q:pointer; , : ; begin if head=nil then writeln(’no element’) else begin q:=head;p:=head^.next; : ; : . ; while(p<>nil)and(p^.data<>x)do . begin q:=P;P:=P^.next : ; : . end; ; if p<>nil then begin q^.next:=p^.next;dispose(p);end . : . ; ; else writeln(’not found x’) end end; ;
线性表基本操作的实现
顺序存储线性表基本操作的实现 (7)判断线性表是否满 function fulllist(a:list):boolean; Begin if a.last=lmaxlen then fulllist:=true else fulllist:=false; End; (8)判断线性表是否空 Function emplist(a:list):boolean; Begin if a.last=0 then emplist:=true else emplist:=false; End;
线性表的存储结构
顺序存储结构:用一维数组来描述 const lmaxlen={线性表可能达到的最大长度}; type lelement={线性表数据元素的数据类型} list=record data:array[1..lmaxlen] of lelement; last:0..lmaxlen end;
线性表基本操作的实现
单链表基本操作的实现 (7)插入元素(inslkst(head,i,x) 将S结点插在P结点之后 表头插入。S^.next:=head^.next;head^. S^ next =head^ next head^ next:=s next =s 表中插入。S^.next:=p^.next;P^.next: =S 表尾插入。S^.next:=nil;P^.next:=s
线性表的应用
1、 【问题描述】 、 问题描述】 线性表a和b分别表示两个线性表,它们的数据元素类型相同,现要 分别表示两个线性表, 线性表 和 分别表示两个线性表 它们的数据元素类型相同, 中存在而a中不存在的数据元素插入到线性表 将b中存在而 中不存在的数据元素插入到线性表 中。设线性表 的 中存在而 中不存在的数据元素插入到线性表a中 设线性表a的 长度与线性表b的长度之和不超过线性表 允许的最大长度。 的长度之和不超过线性表a允许的最大长度 长度与线性表 的长度之和不超过线性表 允许的最大长度。 参考程序】 【参考程序】 proceduIre union(var a:list;b:list); : ; : ; begin n:=length(a); : ; for i:=1 to length(b)do : begin getlist(b,i,x);{取线性表 中第 位上的数给 取线性表b中第 位上的数给T} , , ; 取线性表 中第i位上的数给 k:=loclist(a,x);{返回 在线性表 中的位置 返回z在线性表 中的位置} : , ; 返回 在线性表a中的位置 if k=0 then begin inslist(a,n+1,x);{将z插入线性表 的末尾 插入线性表a的末尾 , , ; 将 插入线性表 的末尾} n:=n+1; : ; end; ; end; ; end; ;
线性表的应用
2、 、
【问题描述】 问题描述】 已知线性表。 中的数据元素按递增的顺序排列, 已知线性表。和b中的数据元素按递增的顺序排列,现 中的数据元素按递增的顺序排列 要求将a和 归并为一个新的线性表 归并为一个新的线性表c, 中的数据元素仍 要求将 和b归并为一个新的线性表 ,c中的数据元素仍 按递增排列。 按递增排列。
相关文档
最新文档