《数据结构第五章树与二叉树.ppt》由会员分享,可在线阅读,更多相关《数据结构第五章树与二叉树.ppt(102页珍藏版)》请在金锄头文库上搜索。
1、在此幻灯片插入公司的徽标在此幻灯片插入公司的徽标从从“插入插入”菜单菜单选择图片选择图片找到徽标文件找到徽标文件单击单击“确定确定”重新设置徽标大小重新设置徽标大小单击徽标内任意位置。徽标外部单击徽标内任意位置。徽标外部出现的方框是出现的方框是“调整控点调整控点”使用这些重新设置对象大小使用这些重新设置对象大小如果在使用尺寸调整控点前按下如果在使用尺寸调整控点前按下 shift 键,则对象改变大小但维键,则对象改变大小但维持原比例。持原比例。1065865姓名姓名学号学号成绩成绩班级班级李红李红976105995机机97.6ABCDEFG1数据的逻辑结构2、数据的存储结构3、数据的运算:检索、
2、排序、插入、删除、修改等。A线性结构B非线性结构A顺序存储B链式存储线性表栈队树形结构图形结构数据结构的三个主要问题8/11/20242线性结构线性结构A,B,C,,X,Y,Z学生成绩表86胡孝臣986110395刘忠赏9861107100张卓9861109成绩姓名学号线性表线性表结点间是以线性关系联结结点间是以线性关系联结8/11/202431数据的逻辑结构2、数据的存储结构3、数据的运算:检索、排序、插入、删除、修改等。A线性结构B非线性结构A顺序存储B链式存储线性表栈队树形结构图形结构数据结构的三个方面8/11/20244树形结构树形结构全校学生档案管理的组织方式全校学生档案管理的组织方
3、式8/11/20245ABCDEFGH树形结构结点间具有分层次的连接关系HBCDEFGA8/11/202465树和二叉树树和二叉树树的定义:由一个或多个结点组成的有限集合树的定义:由一个或多个结点组成的有限集合。仅有一个仅有一个根结点,结点间有明显的层次结构关系。根结点,结点间有明显的层次结构关系。ACGT2DHIT3JMBELKT1F现实世界中,能用树的结构表示的例子:现实世界中,能用树的结构表示的例子:学学校校的的行行政政关关系系、书书的的层层次次结结构构、人人类类的的家家族族血血缘缘关关系等。系等。8/11/20247介绍几个概念:介绍几个概念:结结点点(Node):树树中中的的元元素素
4、,包包含含数数据据项项及及若若干干指指向向其其子树的分支。子树的分支。结点的度(结点的度(Degree):):结点拥有的子树数。结点拥有的子树数。结点的层次:从根结点开始算起,根为第一层。结点的层次:从根结点开始算起,根为第一层。叶子(叶子(Leaf):):度为零的结点,也称端结点。度为零的结点,也称端结点。孩子(孩子(Child):):结点子树的根称为该结点的孩子结点。结点子树的根称为该结点的孩子结点。兄弟(兄弟(Sibling):):同一双亲的孩子。同一双亲的孩子。双双亲亲(Parent):孩孩子子结结点点的的上上层层结结点点,称称为为这这些些结结点点的的双亲。双亲。深度(深度(Depth
5、):树中结点的最大层次数。树中结点的最大层次数。森林(森林(Forest):):M棵互不相交的树的集合。棵互不相交的树的集合。ACGT2DHIT3JMBELKT1F8/11/202485.2二叉树二叉树(BinaryTree)1、二叉树的定义及其性质、二叉树的定义及其性质(1)二叉树的定义二叉树的定义二叉树的五种基本形态二叉树的五种基本形态二二叉叉树树一一种种特特殊殊的的树树型型结结构构,特特点点是是树树中中每每个个结结点点只只有有两两棵棵子树,且子树有左右之分,次序不能颠倒。子树,且子树有左右之分,次序不能颠倒。空空二叉树二叉树仅有仅有根结点根结点右子树右子树为空为空左子树左子树为空为空左右
6、子树左右子树均非空均非空因因为为树树的的每每个个结结点点的的度度不不同同,存存储储困困难难,使使对对树树的的处处理理算算法法很复杂。所以引出二叉树的讨论。很复杂。所以引出二叉树的讨论。8/11/20249 二叉数是二叉数是n(nn(n 0)0)个结点的有限集合。它或为空个结点的有限集合。它或为空数数(n=0),(n=0),或由一个根结点和两棵分别称为根的左子或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉数组成。树和右子树的互不相交的二叉数组成。 特别要注意:特别要注意:二叉数不是二叉数不是树的特殊情况。树的特殊情况。a aa ab bb b两棵不同的二叉数两棵不同的二叉数8/1
7、1/202410A、二叉树的第i层上至多有2i-1(i1)个结点。(2)二叉树的基本性质二叉树的基本性质423167891011121314155第三层上第三层上(i=3)(i=3),有,有2 23-13-1=4=4个节点。个节点。第四层上第四层上(i=4)(i=4),有,有2 24-14-1=8=8个节点。个节点。8/11/202411A、二叉树的第i层上至多有2i-1(i1)个结点。B、深度为h的二叉树中至多含有2h-1个结点。(2)二叉树的基本性质二叉树的基本性质423167891011121314155此树的深度此树的深度h=4h=4,共有共有2 24 4-1=15-1=15个节点。个
8、节点。8/11/202412A、二叉树的第i层上至多有2i-1(i1)个结点。B、深度为h的二叉树中至多含有2h-1个结点。C、若在任意一棵二叉树中,有n0个叶子结点,有n2个度为2的结点,则:n0=n2+1(2)二叉树的基本性质二叉树的基本性质423167891011121314155n n0 0=8=8n n2 2=7=78/11/202413(3)满二叉树)满二叉树423167891011121314155特点:每一层上都含有最大结点数。特点:每一层上都含有最大结点数。8/11/202414423167891011125非完全二叉树非完全二叉树(4)完全二叉树42316789101112
9、5完全二叉树完全二叉树特点:除最后一层外,每一层都取最大结点数,特点:除最后一层外,每一层都取最大结点数,最后一层结点都集中在该层最左边的若干位置。最后一层结点都集中在该层最左边的若干位置。8/11/202415(5)树与二叉树的区别)树与二叉树的区别A树的结点个数至少为树的结点个数至少为1,而二叉树的结点个数可以为而二叉树的结点个数可以为0。B树中结点的最大度数没有限制,二叉树结点最大度数为树中结点的最大度数没有限制,二叉树结点最大度数为2。C树的结点子树无左、右之分,二叉树的结点子树有明确的左、树的结点子树无左、右之分,二叉树的结点子树有明确的左、右之分。右之分。 二二叉叉树树树树8/11
10、/2024182、二叉树的存储结构、二叉树的存储结构(2)链式存储结构链式存储结构T16若父若父结点在数组中结点在数组中i下标处,其左孩子在下标处,其左孩子在2*i处,右孩子在处,右孩子在2*i+1处。处。11ABcFED1248910563712131415(1)顺序存储结顺序存储结构构(1)顺序存储结顺序存储结构构2h-1= 24-1=15用用一一组组连连续续的的存存储储单单元元存存放放二二叉叉树树的的数数据据元元素素。结结点点在在数数组组中中的的相相对对位置蕴含着结点之间的关系。位置蕴含着结点之间的关系。0000FE000DC0BA15141312111098765432100一般二叉树
11、必须按完全二叉树的形式存储,将造成存储的浪费。一般二叉树必须按完全二叉树的形式存储,将造成存储的浪费。8/11/202419(2)链式存储结构链式存储结构lchildDatarchildADBCEF图图为为一一般般二二叉叉树树的的二二叉叉链链表表结构结构AECBDF每个结点由数据域、左指针域和右指针域组成。每个结点由数据域、左指针域和右指针域组成。8/11/202420链式存储结构的描述:链式存储结构的描述:TypedefstructBiTNodeintdata;StructBiTNode*lchild,*rchild;BiTNode,*BiTree;lchildDatarchildlchil
12、dDatarchildlchildDatarchild8/11/2024213、将树和森林转换为二叉树、将树和森林转换为二叉树由于二叉树可以用二叉链表表示,为了使一般树也能由于二叉树可以用二叉链表表示,为了使一般树也能用二叉链表表示,必须找出树与二叉树之间的关系。用二叉链表表示,必须找出树与二叉树之间的关系。这样,给定一棵树,可以找到唯一的一棵二叉树与之这样,给定一棵树,可以找到唯一的一棵二叉树与之对应。对应。(1)树转换为二叉树)树转换为二叉树方法:方法:对每个孩子进行从左到右的排序;对每个孩子进行从左到右的排序;在兄弟之间加一条连线;在兄弟之间加一条连线;对每个结点,除了左孩子外,去除其与
13、其余孩对每个结点,除了左孩子外,去除其与其余孩子之间的联系;子之间的联系;以根结点为轴心,将整个树顺时针转以根结点为轴心,将整个树顺时针转45度。度。8/11/202422IABCDEFGH(b)ABCDEGHFI(a)树转换为二叉树树转换为二叉树ABEFCDGHI(d)ABCDEFGHI(c)8/11/202423(2)森林转换为二叉树森林转换为二叉树ADCBEFHIGJEFADCBHIGJADCBEFHIGJADCBEFHIGJ方法:方法:将各棵树分别转成二叉树;将各棵树分别转成二叉树;把每棵树的根结点用线连起来;把每棵树的根结点用线连起来;以以第第一一棵棵树树的的根根结结点点作作为为二二
14、叉叉树树的根结点,按顺时针方向旋转。的根结点,按顺时针方向旋转。8/11/2024244、二叉树的遍历二叉树的遍历查查找找某某个个结结点点,或或对对二二叉叉树树中中全全部部结结点点进进行行某某种种处处理理,就就需需要要遍遍历。历。(1)遍历定义及遍历算法)遍历定义及遍历算法遍遍历历是是指指按按某某条条搜搜索索路路线线寻寻访访树树中中每每个个结结点点,且且每每个个结结点点只只被被访访问一次。问一次。按先左后右的原则,一般使用三种遍历:按先左后右的原则,一般使用三种遍历:先序遍历先序遍历(DLR):访问根结点,按先序遍历左子树,按先序遍历右子树。访问根结点,按先序遍历左子树,按先序遍历右子树。中序
15、遍历中序遍历(LDR):按中序遍历左子树,访问根结点,按中序遍历右子树。按中序遍历左子树,访问根结点,按中序遍历右子树。后序遍历后序遍历(LRD):按后序遍历左子树,按后序遍历右子树,访问根结点。按后序遍历左子树,按后序遍历右子树,访问根结点。二二叉树为空叉树为空时,执行空操作,即空二叉树已遍历完。时,执行空操作,即空二叉树已遍历完。8/11/202425(2)遍历算法遍历算法先序遍历:先序遍历:DLR中序遍历:中序遍历:LDR后序遍历:后序遍历:LRDADBCT1T2T3DLRADLRDLRBDCDLR以先序遍历以先序遍历D L RD L R为例演示遍历过程为例演示遍历过程 ABDCBDAC
16、DBCA8/11/202426VoidPreOderTraverse(BiTreeT)if(T!=NULL)printf(T-data);PreOrderTraverse(T-lchild);PreOrderTraverser(T-rchild);/*先序遍历先序遍历*/主程序主程序Pre(T)返回返回pre(TR);返回返回pre(TR);ACBDTBprintf(B);pre(TL);BTAprintf(A);pre(TL);ATDprintf(D);pre(TL);DTCprintf(C);pre(TL);C返回T左是空返回左是空返回pre(TR);T左是空返回左是空返回T右是空返回右是
17、空返回T左是空返回左是空返回T右是空返回右是空返回pre(TR);8/11/202427中序遍历二叉树的递归算法:中序遍历二叉树的递归算法:voidinOrderTraverse(BiTreeT)if(T!=NULL)inOrderTraverse(T-lchild);printf(T-data);inOrderTraverse(T-rchild);后序遍历二叉树的递归算法:后序遍历二叉树的递归算法:voidPostOrderTraverse(BiTreeT)if(T!=NULL)PostOrderTraverse(T-lchild);PostOrderTraverse(T-rchild);p
18、rintf(T-data);8/11/202428(3)遍历二叉树的应用)遍历二叉树的应用1)建立一棵二叉树建立一棵二叉树(在遍历过程生成结点,建立二叉在遍历过程生成结点,建立二叉树的存储结构,用链式存储结构)树的存储结构,用链式存储结构)BiTreeCreatBiTree()BiTreeT;scanf(&ch);if(ch= )T=NULL;elseT=(BiTNode )malloc(sizeof(BiTNode);T-data=ch;/*生成根结点生成根结点*/T-lchild=CreatBiTree();/*构构造造左左子子树树*/T-rchild=CreatBiTree();/*构造
19、右子树构造右子树*/return(T);ADBCABDCABDC按先序按先序遍历遍历8/11/202429ch=ATTAcreat(TL)T=,Creat(T)返回creat(TR)Tch=D|=返回creat(TR)D=Tch=返回ch=DTTDcreat(TL)=|creat(TR)ch=CTTCcreat(TL)+ch=BTTBcreat(TL)Tch=BTCch=+返回creat(TR)TCch=+返回ATABABD|=ABDABDC+BAABDC8/11/202430(2)统计二叉树中叶子结点的个数)统计二叉树中叶子结点的个数方方法法:对对二二叉叉树树进进行行遍遍历历,判判断断被被访
20、访问问的的结结点点是是否否叶叶子结点,若是叶子结点,则将计数器加子结点,若是叶子结点,则将计数器加1。实现算法:实现算法:intcountleaf(BiTree)intn1,n2;if(T=NULL)return(0);elseif(T-lchild=NULL)&(T-rchild=NULL)return(1);elsen1=countleaf(T-lchild);n2=countleaf(T-rchild);return(n1+n2);8/11/202431作业:作业:P77第第2925题题第第27题、第题、第29题题8/11/202432ACGDHIJMBELKF作业作业20解解AK、L、
21、F、G、M、I、JCE、FE、F、G、H、I、J48/11/202433ABCDEFKLGHIJM8/11/202434voidchange(NODE*T)NODE*m;if(T!=NULL)m=T-LT-L=T-R;T-R=m;change(T-L);change(T-R);typedefstructnodeintdata;structnode*L,*R;NODE;ABCDACBDACBD21.试以二叉链表作为存储结构,将二试以二叉链表作为存储结构,将二叉树中所有结点的左右子树进行交换。叉树中所有结点的左右子树进行交换。8/11/20243523.n24.12i-125.CDBFGEA27.
22、88/11/202436第第2525题题: :先序遍历中的第一个元素必为二叉树的根结点。先序遍历中的第一个元素必为二叉树的根结点。中序遍历中的根结点恰为左、右子树的分界点。中序遍历中的根结点恰为左、右子树的分界点。先序遍历先序遍历:ABCDEFG :ABCDEFG 中序遍历中序遍历:CBDAFEG:CBDAFEGC D B F G E AC D B F G E A8/11/202437intAA(R,e)P=R;intn=1;while(P-data!=e|p-next=NULL)p=p-next;n=n+1;if(p-next=NULL&P-data!=e)printf(“ERRORn”);
23、return(n);关系运算符:关系运算符:=!=逻辑运算符:逻辑运算符:&|!错在哪?错在哪?8/11/202438阅读程序并回答问题:(1)程序执行了什么功能?(2)针对右面的图,写出程序的运行结果。typedefstructBiTNodeintdata;structBiTNode*lchild,*rchild;BiTNode,*BiTree;intpreprn(BiTtreeT)if(T-lchild!=NULL)&(T-rchild!=NULL))printf(T-data);preprn(T-lchild);preprn(T-rchild);elsereturnOK;abdecgfh
24、iabcg8/11/202439作业作业1:用用C语语言言编编写写递递归归和和非非递递归归计算计算n!程序。程序。8/11/202440递归算法递归算法:intF(intn)intm;if(n=0)m=1;elsem=n*F(n-1);return(m);非非递归算法:递归算法:intF(intn)intf1=1,s=1;if(n=0)return1;while(sdata data)-data data) q-data = q-data = pbpb-data;-data;p pq qai-1a1aianPab2b1Pb8/11/202446合并算法如下:合并算法如下:JD * JD * c
25、omlink(JDcomlink(JD *pa,JD * *pa,JD *pbpb) ) JD *p,*q,*pc; JD *p,*q,*pc; pc=(JD*) pc=(JD*)malloc(sizeof(JDmalloc(sizeof(JD););pcpcp=pc;p=pc;While(pa!=NULL & While(pa!=NULL & pbpb!=NULL)!=NULL) q=(JD*)q=(JD*)malloc(sizeof(JDmalloc(sizeof(JD););if (if (pbpb-data data)-data data) q-data = q-data = pbpb
26、-data;-data;p pq qai-1a1aianPab2b1Pbb18/11/202447合并算法如下:合并算法如下:JD * JD * comlink(JDcomlink(JD *pa,JD * *pa,JD *pbpb) ) JD *p,*q,*pc; JD *p,*q,*pc; pc=(JD*) pc=(JD*)malloc(sizeof(JDmalloc(sizeof(JD););pcpcp=pc;p=pc;While(pa!=NULL & While(pa!=NULL & pbpb!=NULL)!=NULL) q=(JD*)q=(JD*)malloc(sizeof(JDmal
27、loc(sizeof(JD););if (if (pbpb-data data)-data data) q-data = q-data = pbpb-data;-data;p pq qb1pbpb= =pbpb-link;-link;ai-1a1aianPab2b1Pb8/11/202448合并算法如下:合并算法如下:JD * JD * comlink(JDcomlink(JD *pa,JD * *pa,JD *pbpb) ) JD *p,*q,*pc; JD *p,*q,*pc; pc=(JD*) pc=(JD*)malloc(sizeof(JDmalloc(sizeof(JD););pcp
28、cp=pc;p=pc;While(pa!=NULL & While(pa!=NULL & pbpb!=NULL)!=NULL) q=(JD*)q=(JD*)malloc(sizeof(JDmalloc(sizeof(JD););if (if (pbpb-data data)-data data) q-data = q-data = pbpb-data;-data;p pq qb1pbpb= =pbpb-link;-link;ai-1a1aianPab2b1Pb8/11/202449pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-lin
29、k;pa=pa-link;p pq qai-1a1aianPab2b1Pba18/11/202450pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba18/11/202451pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-li
30、nk=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba18/11/202452pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1P
31、ba1p=q;p=q; 8/11/202453pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; 8/11/202454pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-li
32、nk=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; 8/11/202455pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1ai
33、anPab2b1Pba1p=q;p=q; a28/11/202456pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a28/11/202457pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa
34、=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a28/11/202458pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link
35、;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a28/11/202459pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a28/11/202460pcpcElse q-data = pa-data;Else q-data = pa-dat
36、a;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a2b18/11/202461pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb =
37、= pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a2b18/11/202462pcpcElse q-data = pa-data;Else q-data = pa-data;pa=pa-link;pa=pa-link;p-link=q;p-link=q;if (pa-data= =if (pa-data= =pbpb-data)-data)pbpb = = pbpb-link;-link;p pq qai-1a1aianPab2b1Pba1p=q;p=q; a2b18/11/202463While (pa!=While (pa!=nNU
38、LLnNULL)/*)/*如果如果papa链表还未到表尾,复制剩余部分链表还未到表尾,复制剩余部分* */ /q=(JD *)q=(JD *)malloc(sizeof(JDmalloc(sizeof(JD);); q-data = pa-data; q-data = pa-data; pa=pa-link; pa=pa-link; p-link=q; p-link=q; p=q; p=q; 8/11/202464While (While (pbpb!=!=nNULLnNULL)/*)/*如果如果pbpb链表还未到表尾,复制剩余部分链表还未到表尾,复制剩余部分* */ /q=(JD *)q=(
39、JD *)malloc(sizeof(JDmalloc(sizeof(JD);); q-data = q-data = pbpb-data;-data; pbpb= =pbpb-link;-link; p-link=q; p-link=q; p=q; p=q; 8/11/202465pcpcp-link=NULL;p-link=NULL;p pq qa1a2b18/11/202466pcpcp-link=NULL;p-link=NULL;p=pc;p=pc;p pq qa1a2b18/11/202467pcpcp-link=NULL;p-link=NULL;p=pc;p=pc;pc=p-lin
40、k;pc=p-link;p pq qa1a2b18/11/202468pcpcp-link=NULL;p-link=NULL;p=pc;p=pc;pc=p-link;pc=p-link;free(p);free(p);p pq qa1a2b18/11/202469pcpcp-link=NULL;p-link=NULL;p=pc;p=pc;return(pc);return(pc); pc=p-link;pc=p-link;free(p);free(p);q qa1a2b18/11/202470合并算法程序如下:合并算法程序如下:JD * JD * comlink(JDcomlink(JD *p
41、a,JD * *pa,JD *pbpb) ) JD *p JD *p,* *q q,* *pcpc; pc=(JD*)pc=(JD*)malloc(sizeof(JDmalloc(sizeof(JD);p=pcp=pc;While(pa!=NULL & While(pa!=NULL & pbpb!=NULL)!=NULL) q=(JD*)q=(JD*)malloc(sizeof(JDmalloc(sizeof(JD);if (if (pbpb-data data)-data data) q-data = q-data = pbpb-data-data; pbpb = = pbpb-link-l
42、ink; Else q-data = pElse q-data = pa a-data-data;pa=pa-linkpa=pa-link;p-link=qp-link=q;if (pa-data= =if (pa-data= =pbpb-data) -data) pbpb = = pbpb-link-link; p=qp=q; 8/11/202471While (pa!=While (pa!=nNULLnNULL)/*)/*如果如果papa链表还未到表尾,复制剩余部分链表还未到表尾,复制剩余部分* */ /q=(JD *)q=(JD *)malloc(sizeof(JDmalloc(size
43、of(JD);); q-data = pa-data; q-data = pa-data; pa=pa-link; pa=pa-link; p-link=q; p-link=q; p=q; p=q; 8/11/202472While (While (pbpb!=!=nNULLnNULL)/*)/*如果如果pbpb链表还未到表尾,复制剩余部分链表还未到表尾,复制剩余部分* */ /q=(JD *)q=(JD *)malloc(sizeof(JDmalloc(sizeof(JD);); q-data = q-data = pbpb-data;-data; pbpb= =pbpb-link;-lin
44、k; p-link=q; p-link=q; p=q; p=q; 8/11/202473p-link=NULL;p-link=NULL;p=pc;p=pc;return(pc);return(pc); pc=p-link;pc=p-link;free(p);free(p);8/11/202474下面介绍链表的创建。下面介绍链表的创建。8/11/202475LinklistLinklist creatcreat()() linklistlinklist head,p1,p2; head,p1,p2;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)m
45、alloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-d
46、ata)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); 创立具有头指针的链表创立具有头指针的链表8/11/202476LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-ne
47、xt=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(he
48、ad); HeadHeadp1p1p2p28/11/202477LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1
49、) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p2n=0n=08/11/202478LinklistLinklist creatcreat()() linkl
50、istlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p
51、2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p2n=0n=08/11/202479LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct
52、 lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );
53、 scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p2n=0n=015158/11/202480LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(
54、“%d”,&p1-data);head-next=NULLhead-next=NULL; ;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL
55、; return(head)return(head); HeadHeadp1p1p2p215n=0n=08/11/202481LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULLhead-next=NULL; ;while(p1-data!0)whil
56、e(p1-data!0) n=n+1n=n+1; if(n=1) head-next=p1if(n=1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=1n=18/11/202482Link
57、listLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(if(n= =1n= =1) ) head-next=p1head-next=
58、p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=1n=18/11/202483LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1
59、,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(if(n= =1n= =1) ) head-next=p1head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structst
60、ruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=1n=18/11/202484LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LE
61、Nmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)
62、scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=1n=18/11/202485LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-ne
63、xt=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1 n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)retur
64、n(head); HeadHeadp1p1p2p2152323n=1n=18/11/202486LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n
65、+1 n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else p2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p21523n=1n=18/11/202487LinklistLinkl
66、ist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else p
67、2-next=p1else p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p21523n=2n=28/11/202488LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=
68、0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnod
69、elnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p21523n=2n=28/11/202489LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc
70、(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d
71、”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p21523n=2n=28/11/202490LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NUL
72、L;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head)
73、; HeadHeadp1p1p2p21523n=2n=28/11/202491LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1;
74、if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p21523n=2n=238/11/202492LinklistLinklist creat
75、creat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-ne
76、xt=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=2n=23238/11/202493LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=
77、p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)
78、*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=33238/11/202494LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) )
79、;scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-d
80、ata);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=33238/11/202495LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head
81、-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); Head
82、Headp1p1p2p215n=3n=33238/11/202496LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n=
83、 =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=33238/11/202497LinklistLinklist creatcreat
84、()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1
85、p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=332308/11/202498LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(
86、p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)ma
87、lloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=323038/11/202499LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );sc
88、anf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data
89、);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHeadp1p1p2p215n=3n=323038/11/2024100LinklistLinklist creatcreat()() linklistlinklist head,p1,p2 head,p1,p2; ;n=0n=0;p1=p2=(p1=p2=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) );scanf(“%d”,&p1-data)scanf(“%d”,&p1-data);head-next=NULL;head-
90、next=NULL;while(p1-data!0)while(p1-data!0) n=n+1n=n+1; if(n= =1) head-next=p1if(n= =1) head-next=p1; else else p2-next=p1p2-next=p1; p2=p1p2=p1;p1=(p1=(structstruct lnodelnode*)*)malloc(LENmalloc(LEN) ); scanf(%d”,&p1-data)scanf(%d”,&p1-data);p2-next=NULLp2-next=NULL; return(head)return(head); HeadHead15n=3n=3233重新播放单击此处重新播放单击此处8/11/2024101上机作业上机作业3:在在顺顺序序存存储储线线性性表表和和链链式式存存储储线线性性表表中中,在在指指定定元元素素后后插入指定元素。插入指定元素。8/11/2024102