ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:61.45KB ,
资源ID:17829239      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17829239.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息学奥赛数据结构教程PASCAL版Word文件下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息学奥赛数据结构教程PASCAL版Word文件下载.docx

1、new(指针变量名); PASCAL标准过程3指针变量的赋值指针变量名:=NIL; 初始化,暂时不指向任何存储单元如何表示和操作指针变量?不同于简单变量(如A:=0;),PASCAL规定用“指针变量名”的形式引用指针变量(如P:)。如下图:4相同基类型的指针变量之间可以进行相互赋值如有下面的程序段,可以画出右边的示意图:var p1,p2:integer;new(p1);new(p2);p1:=90;p2:=80;p1:=p2;5关系运算如:if p1=p2 then while p nil do 6释放动态存储单元dispose(指针变量名);(二)单链表的结构、建立、输出由于单链表的每个结

2、点都有一个数据域和一个指针域,所以,每个结点都可以定义成一个记录。比如,有如下一个单链表,如何定义这种数据结构呢?type pointer=nodetype;nodetype=recorddata:datatype;next:pointer; 嵌套定义end;var head,p,q,r:下面给出建立并输出单链表的程序,大家可以把它改成过程用在以后的程序当中。Program creat;data:integer;next:varhead,p,r:r指向链表的当前最后一个结点,可以称为尾指针x:beginwriteln(please input num(-1 is end):);read(x);

3、new(head); 申请头结点head:=nil; 头结点初始化r:=head;while x-1 do 读入的数非-1beginnew(p); 则,申请一个新结点p.data:=x;p.next:r.next:=p; 把新结点链接到前面的链表中,实际上r是p的直接前趋r: 尾指针后移一个read(x);end;r.next: 最后一个结点的指针域赋空readln;output: 输出 p:=head.next; 头指针没有数据,只要从第一个结点开始就可以了while p.nextnil dowrite(p.data:4);p:=p.next;write(p.data: 最后一个结点的数据单

4、独输出,也可以改用REPEAT循环end.请大家改写这个程序,把链表的实际结点个数存入到头结点中,并输出(三)单链表的操作1 查找“数据域满足一定条件的结点”=headnext;while (p.data x) and (p.nextnil) do p: 找到第一个就结束if p.data = x then 找到了处理 else 输出不存在;如果想找到所有满足条件的结点,则修改如下:while p.nextnil do 一个一个判断beginif p.data = x then 找到一个处理一个;p:2 取出单链表的第i个结点的数据域function get(head:i:integer):j

5、:j:=1;while (pnil) and (ji) do j:=j+1;if (p i-1) then writeln(no this position!)else begin 插入new(s);s.data:s.next:=s;4 删除单链表中的第i个结点(如下图的“b”结点)procedure delete(head:删除第i个元素while (p.nextelse begin 删除p的后继结点,假设为ss:=p.next.next; 或p.next:=s.nextdispose(s);5 求单链表的实际长度 function len(head:pointer):n:while p n

6、il don:=n+1;len:=n;(四)双向链表每个结点有两个指针域和若干数据域,其中一个指针域指向它的前趋结点,一个指向它的后继结点。它的优点是访问、插入、删除更方便,速度也快了。但“是以空间换时间”。数据结构的定义:type pointer=nodetype;nodetype=recorddata:pre,next: pre指向前趋,next指向后继end;var head,p,q,r:下面给出双向链表的插入和删除过程。Procedure insert(head:i,x:在双向链表的第i个结点之前插入XVars,p:BeginNew(s);S.data:P: p指向第i个结点if p=

7、nil then writeln(no this position!else begin 将结点S插入到结点P之前s.pre:=p.pre; 将S的前趋指向P的前趋p.pre: 将S作为P的新前趋 将S的后继指向Pp.pre.next: 将P的本来前趋结点的后继指向SEnd;Procedure delete(head:删除双向链表的第i个结点else begin 将结点P删除p.prenext: P的前趋结点的后继赋值为P的后继p.next.pre: P的后继结点的前趋赋值为P的前趋(五)循环链表 单向循环链表:最后一个结点的指针指向头结点。双向循环链表:最后一个结点的指针指向头结点,且头结点

8、的前趋指向最后一个结点。循环链表的应用举例:约瑟夫问题。问题描述有n只猴子,按顺时针方向围成一圈(开始时编号为1,2,n),选大王。从第1号猴子开始报数1,2,3,数到m号时该猴子退出到圈外,如此报数直到圈内只剩下一只猴子时,此猴便是大王。你的任务是从键盘读入n,m,程序判断输出最后的大王是几号?数据结构和算法分析数据结构:显然是一个单向循环链表。数据域为猴子的编号,指针域为下一个猴子的地址。算法:报数实际上是计数,只要设一个计数器就可以了。当计数器由0变化到m时,删除该结点,计数器回0继续计数(或者用求余运算)。直到链表中剩下一个结点。参考程序program king(input,outpu

9、t);type pointer=monkey;monkey=recordnum:head,p,q:n,m:procedure creat(var head:n: 建立一个单向循环链表varp,q:i: 建立头结点head:p.num:q: q指向链表的尾结点for i:=2 to n do 建立链表new(p);p.num:=i;q.next: 把P结点连接到q的后面q:q.next: 建立循环链表procedure selectking(var head:var m:i,count:count: 指向第一个结点,洋计数1 q为p的前趋repeat=q.next;count:=count+1;

10、if count mod m=0 then begin 该猴子出圈,即删除结点q.next:dispose(p);endelse q: 指针往后移一个until p.next=p; 只剩下一个结点begin mainwrite(input monkey num :readln(n);writeln(the baoshu number:readln(m);creat(head,n);selectking(head,m);writeln(the moneyking is no.,head.num);readlnend. 运行测试输入:input monkey num :13the baoshu n

11、umber:5输出:the moneyking is no.6(六)线性表的应用举例1 链表的归并操作已知线性表L1和L2中的数据元素按值非递减有序排列,现要求将L1和L2归并成一个新的线性表L3,使L3中的数据元素仍按非递减有序排列。例如:L1=(1,3,4,5,8,9,10,11,12),L2=(2 ,4, 6, 8),则L3=(1,2,3,4,4,5,6,8,8,9,10,11,12)。注意:相同元素照算。标准过程procedure merge(h1,h2: var h3:pointer); 将头指针分别为h1,h2的两个单链表归并成一个新的单链表,该链表头指针为h3p1,p2,p3:

12、临时用工作指针,一般不能破坏头指针p1:=h1.next;p2:=h2.next;h3:=h1; 新链表共用第一个链表,简化,也可以另外开辟一个头结点p3:=h3;while (p1nil) and (p2nil) do 归并if p1.data=p2.data thenbegin 将p1结点链接到p3中去p3.next:=p1; 指向p3: p3后移p1:=p1.next p1后移endelse begin 将p2结点链接到p3中去p2:=p2.nextif p1nil then p3.next:=p1 将p1中剩下的结点一起链接到p3中else p3.next: 将p2中剩下的结点一起链接

13、到p3中2一元多相式的表示和加减运算在数学上,一个一元n次多项式Pn(x),可以按升幂写成:Pn(x)=P0 + P1X + P2X2 + P3X3 + PnXn它由n+1个系数唯一确定。因此,在计算机里,它可以用一个线性表 P来表示:P = (P0,P1,P2,Pn)每一项的指数i隐含在系数Pi的序号里。任务给定一个一元n次多项式Pn(x) 和一个一元m次多项式Qm(x),求它们的和与差。数据结构方法1:按n,m分别生成n+1和m+1个结点的两个单链表,即不管系数是否为0都生成一个结点。一个指针域指向后继结点,一个数据域存放系数(不存在的项系数为0)。浪费了很多空间,尤其是指数很高,而项数很

14、少的情况下,浪费更严重。方法2:只生成存在的项,实际多少项就有多少结点,每个结点有2个数据域,一个存放系数,一个存放指数。如有以下多项式P8(x)=3+8x+9x5+6x8 ,用上述两种方法表示的示意图分别如下:方法1 示意图方法2 示意图算法分析算法非常简单,遍历两个单链表,根据指数和系数进行相应的加减,生成一个新链表。系数为0的结点删除掉(或不生成这种结点),输出该链表。3魔术师与扑克问题13张黑桃扑克(A 2 3 4 5 6 7 8 9 10 J Q K),预先排好,正面朝下拿在魔术师的手里,从最上面开始,第一次数一张牌翻过来放在桌面上,正好是“A”;第二次数两张牌,数1的那张放在手中扑

15、克的最下面,数2的那张翻过来放在桌面上正好是“2”;,如此下去,放在桌面上的牌最后正好是“A 2 3 4 5 6 7 8 9 10 J Q K”的顺序(从下向上)。编程,找出魔术师手中扑克原来的排列顺序(从下向上)。4“法雷序列”问题对任意给定的一个自然数n(n=100),将分母小于等于n的不可约的真分数按上升的次序排列,并且在第一个分数 前加上0/1,在最后一个分数后加上1/1,这个序列称为n级法雷序列,以Fn表示,例如 :F8=0/1,1/8,1/7,1/6,1/5,1/4,2/7,1/3,3/8,2/5,3/7,1/2,4/7,3/5,5/8,2/3,5/7,3/4,4/5,5/6,6/7,7/8,1/1。编程,求出n级法雷序列,每行输出10个分数。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1