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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(C语言链表(能看得懂的)PPT.ppt)为本站上传会员【a199****6536】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

C语言链表(能看得懂的)PPT.ppt

1、Click to edit Master title,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,1,第十一章 链表,2,例:跳马。依下图将每一步跳马之后的位置,(x,y),放到一个,“,结点,”,里,再用,“,链子穿起来,”,,形成一条链,相邻两结点间用一个指针将两者连到一起。,结构的概念与应用,3,依上图有,7,个结点,(x1,y1),(x2,y2),(x6,y6),(x7,y7),为了表示这种既有数据又有指针的情况,引入结构这种数据类型。,4,11.7,用指针处

2、理链表,链表是程序设计中一种重要的动态数据结构,它是动态地进行存储分配的一种结构。,动态性体现为:,链表中的元素个数可以根据需要增加和减少,不像数组,在声明之后就固定不变;,元素的位置可以变化,即可以从某个位置删除,然后再插入到一个新的地方;,5,1249,A,1356,B,1475,C,1021,D,Null,1,、链表中的元素称为,“,结点,”,,每个结点包括两个域:,数据域和指针域;,2,、单向链表通常由一个头指针(,head),,用于指向链表头;,3,、单向链表有一个尾结点,该结点的指针部分指向一个空结点,(NULL),。,Head 1249 1356 1475 1021,结点里的指针

3、是存放下一个结点的地址,6,链表中结点的定义,链表是由结点构成的,关键是定义结点,;,链表的结点定义打破了先定义再使用的限制,即可以用自己定义自己;,递归函数的定义也违反了先定义再使用;,这是,C,语言程序设计上的两大特例,7,链表的基本操作,对链表的基本操作有:,(,1,),创建链表是,指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。,(,2,),检索操作,是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。,(,3,),插入操作,是指,在结点,k,i-1,与,k,i,之间插入一个新的结点,k,

4、使线性表的长度增,1,,且,k,i-1,与,k,i,的逻辑关系发生如下变化:,插入前,,k,i-1,是,k,i,的前驱,,k,i,是,k,i-1,的后继;插入后,新插入的结点,k,成为,k,i-1,的后继、,k,i,的前驱,.,8,(,4,),删除操作,是指,删除结点,k,i,,使线性表的长度减,1,,且,k,i-1,、,k,i,和,k,i+1,之间的逻辑关系发生如下变化:,删除前,,k,i,是,k,i+1,的前驱、,k,i-1,的后继;删除后,,k,i-1,成为,k,i+1,的前驱,,k,i+1,成为,k,i-1,的后继,.,(5),打印输出,9,一个指针类型的成员既可指向其它类型的结构体

5、数据,也可以指向自己所在的结构体类型的数据,99101,89.5,99103,90,99107,85,num,Score,next,next,是,struct student,类型中的一个成员,它又,指向,struct student,类型,的数据。,换名话说:,next,存放下一个结点的地址,10,11.7.2,简单链表,#define NULL 0,struct student,long num;float score;,struct student *next;,main(),struct student a,b,c,*head,*p;,a.num=99101;a.score=89.5;

6、b.num=99103;b.score=90;,c.num=99107;c.score=85;,head=,a.next=,b.next=,c.next=NULL;,p=head;,do,printf(%ld%5.1fn,p-num,p-score);,p=p-next,;while(,p!=NULL,);,例,11.7,建立和输出一个简单链表,各结点在程序中定义,不是临时开辟的,始终占有内容,不放,,这种链表称为,“,静态链表,”,11,11.7.3,处理动态链表所需的函数,C,语言使用系统函数,动态,开辟和释放存储单元,1.malloc,函数,函数原形:,void*malloc(unsi

7、gned int size);,作用:,在内存的动态存储区中分配,一个,长度为,size,的连续空间。,返回值:,是一个指向分配域起始地址的指针(基本类型,void,)。,执行失败:,返回,NULL,12,函数原形,:,void*calloc(unsigned n,unsigned size);,作用:,在内存动态区中分配,n,个,长度为,size,的连续空间。,函数返回值,:指向分配域起始地址的指针,执行失败:返回,null,主要用途,:为一维数组开辟动态存储空间。,n,为数组元素个数,每个元素长度为,size,2.calloc,函数,13,3.free,函数,函数原形:,void free

8、void,*p,);,作用:,释放由,p,指向的内存区。,P:,是最近一次调用,calloc,或,malloc,函数时返回的值。,free,函数无返回值,动态分配的存储单元在用完后一定要释放,否则内存会因申请空间过多引起资源不足而出现故障。,14,结点的动态分配,ANSI C,的三个函数,(,头文件,malloc.h)void*malloc(unsigned int size),void*calloc(unsigned n,unsigned size),void free(void*p),C+,的两个函数,new,类型(初值),delete ,指针变量,/*,表示释放数组,可有可无)*,/,

9、使用,new,的优点:,可以通过对象的大小直接分配,而不管对象的具体长度是多少(,p340,例,14.10,),15,11.7.4,建立动态链表,基本方法,:,三个结点(头结点,head,、尾结点,NULL,和待插入结点,P,),第一步:定义头结点,head,、尾结点,p2,和待插入结点,p1,,待插入的结点数据部分初始化;,第二步:该结点被头结点、尾结点同时指向,。,P1=p2=(struct student*)malloc(LEN);,头指针部分为空,,,head=NULL;,第三步:重复申请待插入结点空间,对该结点的数据部分赋值(或输入值),将该结点插入在最前面,或者最后面(书上在尾部插

10、入),.,P2-next=P1;P2=P1;,最后,:P2-next=NULL;,*head,*p1,*p2,使用,malloc(LEN),P2-next=NULL;,16,11.7.4,建立动态链表,99101,89.5,head,P1,p2,1,.,任务是开辟结点和输入数据,2.,并建立前后相链的关系,待插入的结点,p1,数据部分初始化,该结点被头结点,head,、尾结点,p2,同时指向,.,17,图,11.14,99101,89.5,head,p2,99103,90,p1,99101,89.5,head,p2,99103,90,p1,(a),(b),p1,重复申请待插入结点空间,对该结点

11、的数据部分赋值(或输入值),P2-next,指向,p1,新开辟的结点。,18,图,11.14,head,99101,89.5,p1,p2,99103,90,(c),P2,指向新结点,p2=p1,19,图,11.15,99101,89.5,99101,89.5,p2,99107,85,p1,head,99101,89.5,99101,89.5,p2,99107,85,p1,head,(a),(b),20,图,11.16,99103,90,99107,85,p2,0,0,p1,head,99101,89.5,99103,90,99107,85,NULL,p2,0,0,p1,head,99101,8

12、9.5,21,例,11.8,建立一个有,3,名学生数据的单向动态链表,#define NULL 0,#define LEN sizeof(struct student),struct student,long num;float score;,struct student*next,;,int n;,struct student*creat(void),struct student*head;struct student*p1,*p2,;,n=0;,p1=p2=(,struct student*,)malloc(LEN);,scanf(%1d,%f,结构体类型数据的长度,,sizeof,是,“

13、字节数运算符,”,定义指针类型的函数。带回链表的起始地址,开辟长度为,LEN,的内存区,P1,p2,是指向结构体类型数据的指针变量,强行转换成结构体类型,假设头指向空结点,22,续,while(p1-num!=0),n=n+1;/*n,是结点的个数*,/,if(n=1)head=p1;,else p2-next=p1;p2=p1;,p1=(struct student*)malloc(LEN);,scanf(%1d,%f,p2-next=NULL;return(head);/,返回链表的头指针,算法:,p1,指向新开的结点,:,p1=(stuct student*)malloc(LEN);,

14、p1,的所指向的结点连接在,p2,所指向结点后面,用,p2-next=p1,来实现。,p2,指向链表中最后建立的结点,,:,p2=p1;,头指针指向,p1,结点,P1,开辟的新结点链到了,p2,的后面,P1,继续开辟新结点,给新结点赋值此,23,11.7.5,输出链表,链表遍历,1.,单向链表总是从头结点开始的;,2.,每访问一个结点,就将当前指针向该结点的下一个结点移动:,p=p-next,;,3.,直至下一结点为空,P=NULL,24,图,11.18,head,p,P,P,NULL,25,例题,9,void print(struct student*head),struct student

15、p,;,printf(nNow,These%d records are:n,n);,p=head,;,if(head!=NULL),do,printf(%ld%5.lfn,p,-,num,p,-,score,);,p=p,-,next;,while,(p!=NULL,);,26,11.7.6,对链表的删除操作,删除结点原则:,不改变原来的排列顺序,只是从链表中分离开来,撤消原来的链接关系。,两种情况:,1,、要删的结点是头指针所指的结点则直接操作;,2,、不是头结点,要依次往下找。,另外要考虑:空表和找不到要删除的结点,27,链表中结点删除,需要由两个临时指针:,P1:,判断指向的结点是不是

16、要删除的结点(用于寻找);,P2:,始终指向,P1,的前面一个结点;,28,图,11.19,A,B,D,E,C,A,B,D,E,C,(a),(B),29,图,11.20,99101,head,p1,99103,99107,NULL,(,a,),(b),99101,head,99103,99107,NULL,p2,p1,原链表,P1,指向头结点,P2,指向,p1,指向的结点。,P1,指向下移一个结点。,30,图,11.20,99101,head,99103,99107,NULL,p1,99101,head,99103,99107,NULL,p2,p1,(c),(d),经判断后,第,1,个结点是要

17、删除的结点,,head,指向第,2,个结点,第,1,个结点脱离。,经,P1,找到要删除的结点后使之脱离。,31,例 题,10,struct student*del(struct student*head,long num),struct student *p1,*p2;,if(head=NULL)printf(nlist null!n);,goto end;,p1=head;,while(num!=p1-num&p1-next!=NULL),p2=p1;p1=p1-next;,if(num=p1-num),if(p1=head)head=p1-next;,else p2-next=p1-nex

18、t;,printf(delete:%ldn,num);,n=n-1;,else printf(%ld not been found!n,num);,end:return(head);,找到了,没找到,32,11.7.7,对链表的插入操作,插入结点:将一个结点插入到已有的链表中,插入原则:,1,、插入操作不应破坏原链接关系,2,、插入的结点应该在它该在的位置,实现方法:,应该有一个插入位置的查找子过程,共有三种情况:,1,、插入的结最小,2,、插入的结点最大,3,、插入的结在中间,33,操 作 分 析,同删除一样,需要几个临时指针:,P0:,指向待插的结点,;,初始化:,p0=,数组,stu;,

19、P1:,指向要在,P1,之前插入结点;初始化,:p1=head;,P2:,指向要在,P2,之后插入结点;,插入操作:当符合以下条件时:,p0-num,与,p1-num,比较找位置,if(p0,-,num,p1,-,num)&(p1,-,next!=NULL),则插入的结点不在,p1,所指结点之前;指针后移,交给,p2,;,p1=,p1-next;p2=p1;,则继续与,p0,指向的数组去比,直到,(,p1,-,next!=NULL),为止。,否则有两种情况发生:,if(head=p1)head=p0;p0-next=p1,插到原来第一个结点,之前,;,else p2,-next=p0;p0-n

20、ext=p1;,插到,p2,指向的结点,之后,;,还有另外一种情况:插到,最后,的结点之后;,p1,-next=p0;p0-next=NULL;,34,图,11.22,99101,head,p1,99103,99107,NULL,(,a,),99102,p0,35,图,11.22,99101,head,99103,99107,NULL,99102,p0,p2,p1,(b),36,例 题,11,struct student insert(struct student*head,struct,student*stud),struct student*p0,*p1,*p2;,p1=head;p0=s

21、tud;,if(head=NULL;),head=p0;p0-next=NULL;,else,while(p0-nump1-num)&(p1-next!=NULL),p2=p1;p1=p1-next;,if(p0-numnum),if(head=p1)head=p0;,else p2-next=p0;p0-next=p1;,else p1-next=p0;p0-next=NULL;,n=n+1;return(head);,原来的链表是空表,P0,指向要插的结点,使,p0,指向的结点作为头结点,使,p2,指向刚才,p1,指向的结点,插到原来第一个结点之前,插到,p2,指向的结点之后,插到最后的结

22、点之后,链接,37,5,head,6,10,15,null,12,8,课堂举例:,已有一个如图所示的链表;,它是按结点中的整数域从小到大排序的,现在要插入一个结点,该结点中的数为,10,待插入结点,此结点已插入链表,38,分析:,按三种情况,1,、第一种情况,链表还未建成(空链表),待插入结点,p,实际上是第一个结点。这时必然有,head=null,。只要让头指针指向,p,就可以了。语句为,6,null,head,p,head=p;,p-next=null;,2,、第二种情况,链表已建成,待插入结点,p,的数据要比头结点的数据还要小,这时有,(,p-num)num),当然,p,结点要插在,he

23、ad,结点前。,39,6,head,8,5,12,null,head,p,p-next=head;,head=p;,语句为,null,40,3,、第三种情况,链表已建成,待插入结点,p,的数据比头结点的数据大,需要找到正确的插入位置。这时,可以借助两个结构指针,r,和,g,,利用循环比较来找到正确位置。然后将结点,p,插入到链表中正确的位置。,参见下面的图示,41,6,head,8,12,13,null,p,15,g,r,说明:,这种情况下,,p,结点已经与链表的第一个结点比较过了,所以从链表的下一个结点开始比较。,138,,继续比较。,42,6,head,8,12,13,null,p,15,

24、g,r,说明:,1312,,继续比较。,43,6,head,8,12,13,p,15,g,r,null,说明:,13next=p;,p-next=g;,44,/,结构,7.c,#include/预编译命令,#include/内存空间分配,#define null 0/定义空指针常量,#define LEN sizeof(struct numST)/定义常量,表示结构长度,struct numST/结构声明,int num;/整型数,struct numST*next;/numST结构指针,;,参考程序,45,/,被调用函数,insert(),,两个形参分别表示链表和待插入的结点,void in

25、sert(struct numST*phead,struct numST*p),/,函数体开始,struct numST*q,*r;/,定义结构指针,q,r,if(*phead)=null)/,第一种情况,,链表为空,*phead=p;/,链表头指向,p,return;/,完成插入操作,返回,else/链表不为空,/,第二种情况,,,p结点num值小于链表头结点的num值,if(*,p,head)-num p-num),/将p结点插到链表头部,p-next=*,p,head;/将p的next指针指向链表头(*,p,head),*,p,head=p;,/将链表头赋值为p,return;,/返回,

26、46,/,第三种情况,,循环查找正确位置,r=*,p,head;/r赋值为链表头,q=(*,p,head)-next;/q赋值为链表的下一个结点,while(q!=null),/,利用循环查找正确位置,/判断当前结点num是否小于p结点的num,if(q-num num),r=q;/r赋值为q,即指向q所指的结点,q=q-next;/q指向链表中相邻的下一个结点,else/找到了正确的位置,break;/退出循环,/将p结点插入正确的位置,r-next=p;,p-next=q;,47,/被调用函数,形参为ST结构指针,,用于输出链表内容,void print(struct numST*head

27、),int k=0;/整型变量,用于计数,struct numST*r;/声明r为ST结构指针,r=head;/r赋值为head,即指向,链表头,while(r!=null)/当型循环,链表指针不为空,则继续,/循环体开始,k=k+1;/计数加1,printf(%d%dn,k,r-num);,r=r-next;,/,取链表中相邻的下一个结点,/循环体结束,48,void main()/主函数开始,/函数体开始,struct numST*head,*p;/ST型结构指针,head=null;,/分配两个ST结构的内存空间,用于构造链表,head=(struct numST*)malloc(LEN

28、);,head-next=(struct numST*)malloc(LEN);,/为链表中的两个结点中的num赋值为5和10,head-num=5;,head-next-num=10;,head-next-next=null;/链表尾赋值为空,/构造一个结点p,用于插入链表,p=(struct numST*)malloc(LEN);,p-num=8;,p-next=null;,insert(,/调用create函数建立链表,,print(head);/调用print函数,输出链表内容,/主函数结束,49,说明:,函数,insert(),的第一个形参为,struct numST*,类型,即“指

29、针的指针”。调用时送入的实参是链表头指针的地址,即程序中的,&head,。这样对,head,的修改才会在函数返回后仍有效。如果形参为,struct numST*,,则传入的为指针,当函数返回后,,head,无法改变。,50,11.8,共用体,构造类型之二,联合,在同一存储单元里,根据需要放不同类型的数据,,使用覆盖技术。,51,11.8.1,概念,单元起始地址:,1000,。三个变量(数据)占用同一单元:,1000,1003,浮点型(,4 byte,),字符型(,1 byte,),整型(,2Byte,),52,共用体变量的定义,格式(一般形式):,union,联合类型名,成员列表,变量列表;,

30、11.8.2,共用体变量的引用方式,同结构类型变量的引用格式:,变量名,.,成员名,53,格式与结构类型的定义和变量声明形式上类似,但实质上有区别:,结构类型的长度,=,各成员的长度和;各成员占独立的存储单元,不共享;,联合类型的长度为成员中长度的最大者,各成员共享长度最大的存储单元;,54,11.8.3,共用体类型数据的特点,虽然同一内存单元内可以存放不同类型(同一地址)、不同长度的数据,但任一时刻,只有一种类型数据(最后赋值的)起作用;其它的都没有意义;,不能对共用体变量整体赋值,也不能对其初始化。,共用变量不可作为函数的参数,但可以通过指针指向;,共用体类型可以和结构类型,/,数组类型互

31、为基类型;,p289,55,例 题,12,struct,int num;,char name10;,char sex;char job;,union,int class;char position10;,category;,person2;,main(),int n,i;,for(i=0;i2;i+);,scanf(%d,,,%s,,,%c,,,%c,”,56,if(personi.job=s),scanf(%d,else if(personi.job=t),scanf(%s,personi.category.position);,else printf(input error!);,prin

32、tf(n);,printf(no.name sex job class/positionn);,for(i=0;iSun,、,Sat,最大。,(,4,)枚举元素的值也是可以人为改变的:在定义时由程序指定。,例如,如果,enum weekdays Sun=,Mon,Tue,Wed,Thu,Fri,Sat,;则,Sun=,,,Mon=,,从,Tue=2,开始,依次增。,61,例 题,13,/*file1.c,文件,1*/,main(),extern enter-string(char str80);,extern delete-string(char str,char ch);,extern pr

33、int-string(char str);,char c;char str80;,enter_string(str);scanf(%c,delete_string(str,c);print_string(str);,/*file2.c,文件,2*/,#include,enter_string(char str80),gets(str);,62,续,for(i=0;ix,p-y);,p=p-next;/p,指向下一个结点,i=i+1;/,计数加,1,while(p!=null);/,未到达链表尾部,则继续循环,/,主函数结束,71,用结构数组,利用键盘输入结点中的数据。重点看,scanf(,“,

34、d,”,ni.x=a;,结构数组,数组中的元素为结构类型的数据,如,n8,/,结构,2.c,#include/预编译命令,#define null 0/定义空指针常量,struct TM/定义TM结构,int x,y;/整型变量x,y,struct TM*next;,/指向TM结构的指针,;,72,void main()/主函数,/主函数开始,int i,a,b;,/声明整型变量i,a,b,/声明TM型结构数组n8,TM结构指针head,p,struct TM n8,*head,*p;,for(i=1;i=7;i=i+1),/循环,/循环体开始,printf(输入n%d的xn,i);/提示输

35、入第i个结构的x值,scanf(%d,/输入a,ni.x=a;,/将a的值赋给结构ni的元素x,printf(输入n%d的yn,i);/提示输入第i个结构的y值,scanf(%d,/输入b,ni.y=b;,/将b的值赋给结构ni的元素y,/循环体结束,73,head=/链表头部指向n1,for(i=1;ix,p-y);,p=p-next;/p指向相邻的下一个结点,i=i+1;/计数i加1,while(p!=null);,/未到链表尾部,则继续循环,/主函数结束,74,下面的程序与上面的程序区别仅在,scanf(“%d”,去替换,scanf(“%d”,ni.x=a;,/,结构,3.c,#incl

36、ude/预编译命令,#define null 0/定义空指针常量,struct TM/定义TM结构,int x,y;/整型变量x,y,struct TM*next;,/指向TM结构的指针,;,75,void main()/主函数,/主函数开始,int i,a,b;,/声明整型变量i,a,b,/声明TM型结构数组n8,TM结构指针head,p,struct TM n8,*head,*p;,for(i=1;i=7;i=i+1)/循环,/循环体开始,printf(输入n%d的xn,i);/提示输入第i个结构的x值,scanf(%d,/输入ni.x,printf(输入n%d的yn,i);/提示输入第i

37、个结构的y值,scanf(%d,/输入ni.y,/循环体结束,76,head=/链表头部指向n1,for(i=1;inum,赋值为,1,,让指针域赋值为,null,。之后让链头指针,head,指向第,1,个结点。利用指针,q,记住这个结点,以便让指针,p,去生成下面的结点。,(,2,)利用一个计数循环结构,做出第,2,个结点到第,nn,个结点。并将相邻结点一个接一个链接到一起。,(,3,)最后一个结点要和头结点用下一语句链接到一起,tail=q;tail-next=head;,head,tail,q,84,5,、删结点的函数,select(int mm)mm,为形式参数,从,1,至,m,报数,

38、凡报到,mm,者删除其所在的结点。设计两个指针,p,和,q,。一开始让,q,指向链表的尾部,q=tail,。让,p,指向,q,的下一个结点。开始时让,p,指向,1#,猴所在的结点。用一个累加器,x,,初始时,x=0,,从,1#,猴所在结点开始让,x=x+1=1,,如果,mm,是,1,的话,,1#,猴所在的,p,结点就要被删除。有三条语句,printf(“,被删掉的猴子号为,%d,号,n”,p-num);q-next=p-next;free(p);,1,head,2,8,tail,q,p,演示,85,这里,free(p),是释放,p,结点所占用的内存空间的语句。如果,mm,不是,1,而是,3,,

39、程序会在,do-while,循环中,让,x,加两次,1,,,q,和,p,一起移动两次,,p,指向,3#,所在结点,,q,指向,2#,所在结点,之后仍然用上述三条语句删去,3#,所在的结点。,1,head,2,8,q,p,3,4,q,p,p,q,演示,86,这个,do-while,循环的退出条件是,q=q-next,。即当只剩下一个结点时才退出循环。当然猴王非其莫属了。这时,让头指针,head,指向,q,,,head,是全局变量,在主程序最后输出猴王时要用,head-num,。,参考程序如下:,7,head,q,87,#include/,预编译命令,#include/,内存空间分配,#defin

40、e null 0/,定义空指针常量,/,定义常量,表示结构长度,#define LEN sizeof(struct mon),struct mon/,结构声明,int num;/,整型数,用于记录猴子号,struct mon*next;/mon,结构指针,;,struct mon*head,*tail;/mon,结构指针,全局变量,88,void create(int nn)/被调用函数,/函数体开始,int i;/整型变量i,用于计数,struct mon*p,*q;/声明mon结构指针p,q,/为p分配内存空间,p=(struct mon*)malloc(LEN);,p-num=1;/初始

41、化p结点num域为1,p-next=null;/初始化p结点next域为空,head=p;/链表头指针head赋值为p,q=p;/q赋值为p,89,for(i=2;inum=i;/初始化p结点num域为i,表示猴子号,q-next=p;/将p结点加到链表尾部,q=p;/让q指向链表尾部结点,p-next=null;/链表尾部指向空,/循环体结束,tail=q;/链表尾,tail-next=head;,/链表尾部指向链表头,,/,形成循环链表,/函数体结束,90,/,被调用函数,select,,,mm,表示结点删除间隔,void select(int mm),/,函数体开始,int x=0;,/

42、声明整型值,x,,并初始化为,0,struct mon*p,*q;,/,声明结构指针,p,,,q,q=tail;,/q,赋值为,tail,,指向循环链表尾部,do,/,直到型循环,用于循环删除指定间隔的结点,/,循环体开始,p=q-next;,/p,赋值为,q,相邻的下一个结点,x=x+1;,/x,加,1,if(x%mm=0),/x,是否整除,mm,,,/,表示是否跳过指定间隔,/,输出被删掉的猴子号,printf(,被删掉的猴子号为,%d,号,n,p-num);,q-next=p-next;,/,删除此结点,free(p);,/,释放空间,else q=p;,/q,指向相邻的下一个结点,p

43、while(q!=q-next);,/,剩余结点数不为,1,,则继续循环,head=q;,/head,指向结点,q,,,q,为链表中剩余一个结点,/,函数体结束,91,void main(),/主函数开始,/函数体开始,int n,m;,/声明整型变量n,m,head=null;/初始化head为空,printf(请输入猴子数n);/提示信息,scanf(%d,/输入待插入结点数据,printf(请输入间隔mn);/提示信息,scanf(%d,/输入间隔,create(n);/调用函数create建立循环链表,select(m);,/调用函数select,找出剩下的猴子,printf(猴王是%d号n,head-num);/输出猴王,/函数体结束,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服