




已阅读5页,还剩182页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、教学对象计算机科学与技术系新生(第二学期)二、教学目标程序设计的重要性程序设计的基本概念与基本方法编程解题的思路与典型方法数学模型简介算法及算法步骤程序结构与相应语句编码与上机调试,绪论,三、教学重点1.程序设计的基本概念,基本方法;2.在C语言的环境下,学会如何针对问题进行分析,得出数学模型,理出算法并编程实现;3.有条有理有根有据的编程实践;4.养成良好的编程风格与习惯;5.重在思维方法的学习,鼓励创新。,绪论,四、指导思想1.立足改革,以培养高素质有创造精神的人才为这门课的教学目标。2.以学生为中心,采用与现实生活贴切和具有趣味性的实例进行讲解,有利于调动学生学习的积极性,引导学生主动学习。3.强化实践,这门课主张程序设计是高强度的脑力劳动,不是听会的、也不是看会的,而是练会的。引导学生在解题编程的实践中探索其中带规律性的认识。将感性认识升华到理性高度。,绪论,五、学习方法1.动手动脑,理论指导下的实践有条有理的实践。2.在编写大量程序之后,才能感到运用自如。,绪论,六、教学内容安排1.简单C程序设计;2.分支结构程序设计;3.循环结构程序设计;4.数组;5.函数;6.递归及其实现方法7.指针;8.结构体与链表。,绪论,1.1认识C语言程序1.程序实例#include/预编译命令,将标准输入输出函数/作为头文件包扩到用户源文件中#include/预编译命令,将系统提供的数学函数/作为头文件包扩到用户源文件中main()/主函数,名为main,/函数体.开始floata,b,c;/声明部分.定义变量类型b=30.0;/执行部分.赋值语句a=sin(b*3.14159/180);/执行部分.赋值语句printf(“%fn”,a);/执行部分.输出语句/函数体.结束,第一讲简单的C程序设计,1.2实例总结1.C程序结构,预编译命令,主函数main()函数体开始声明部分执行部分函数体结束,第一讲简单的C程序设计,2.变量的类型整型:int长整型:long浮点型:float双精度型:double字符型:char用户自定义类型,第一讲简单的C程序设计,3.声明的作用为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。4.变量其值可以改变的量,是内存单元的符号地址。通过符号b可以找到相应的存储单元地址,假设为1000。语句b=30.0;是将值30.0存放在地址为1000的存储单元。,第一讲简单的C程序设计,5.对变量的赋值赋值符号“=”b=30.0;/读作将表达式的值30.0赋给变量ba=sin(b*3.14159/180);/读作将表达式(正弦函数)的值赋给变量a,第一讲简单的C程序设计,6.变量赋值特点(1)先定义,后使用intd,e,f;定义三个变量为整数类型如未定义,则在编译时被查出,认为非法(2)变量未被赋值前,值为未知(3)对变量赋值过程是“覆盖”过程,用新值去替换旧(4)读出变量的值,该变量保持不变(5)参与表达式运算的所有变量都保持原来的值不变,第一讲简单的C程序设计,变量赋值过程def未赋值前执行d=7执行e=d执行f=d+e执行d=d+1000,第一讲简单的C程序设计,7.输出语句printf函数(格式输出函数)一般形式为printf(参数1,参数2,参数3,参数n)其中参数1格式控制参数2,参数3,参数n输出表列举例:floata;intb;a=85.56;b=100;printf(%f%d,a,b);,第一讲简单的C程序设计,格式控制是用双引号括起来的字符串,称“转换控制字符串”%f第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出6位小数%d第二个输出表列的格式说明,以带有符号的十进制形式输出整数(正数不输出符号)显然,%f是控制实数a的;%d是控制整数b的,第一讲简单的C程序设计,为了醒目,格式控制项中除格式说明之外可以有普通字符例:printf(“a=%fb=%d,a,b);输出结果为:a=85.560000b=100换行符号例:printf(“a=%fnb=%d”,a,b);输出结果为:a=85.560000b=100域宽和精度例:printf(”%5.3f”,a);,第一讲简单的C程序设计,8.数学函数sin(x)x为弧度,doublex,doublesin(x)cos(x)cos(x)exp(x)exlog(x)logexlog10(x)log10 xfabs(x)xfmod(x,y)整除x/y的余数floor(x)求不大于x的最大整数pow(x,y)xysqrt(x)x1/2,第一讲简单的C程序设计,9.算术运算符加减*乘/除%模(取余数),第一讲简单的C程序设计,1.3作业,第一讲简单的C程序设计,我们在日常生活中经常需要处理具有两个分支的问题,例如,如果明天下雨,则在教室内组织活动,否则去野游。在C语言中,这类问题需要使用if语句解决,而判断操作通常使用关系运算符。关系运算符和关系表达式大于=大于等于=50”和“w=50代入到四句话中A说:thisman!=A;A!=A假,值为0。B说:thisman=C;A=C假,值为0。C说:thisman=D;A=D假,值为0。D说:thisman!=D;A!=D真,值为1。显然,不是A做的好事(四个关系表达式值的和为1),第二讲分支结构,再试B同学,让thisman=B;代入到四句话中A说:thisman!=A;B!=A真,值为1。B说:thisman=C;B=C假,值为0。C说:thisman=D;B=D假,值为0。D说:thisman!=D;B!=D真,值为1。显然,不是B所为(四个关系表达式值的和为2),第二讲分支结构,再试C同学,让thisman=C;代入到四句话中A说:thisman!=A;C!=A真,值为1。B说:thisman=C;C=C真,值为1。C说:thisman=D;C=D假,值为0。D说:thisman!=D;C!=D真,值为1。显然,就是C做了好事(四个关系表达式值之和为3)这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去试,四句话中有三句为真,该人即所求。,第二讲分支结构,循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。语言提供了三种循环语句,可以组成各种不同形式的循环结构,它们是:语句语句语句,第三讲循环结构,3.1简单循环【实例】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.该数列的规律为a1=1a2=1an=an-1+an-2这里求前20项,第三讲循环结构,i=20,a1=1;a2=1;i=3,an=a1+a2,输出an,i=i+1;a1=a2;a2=an;,Y,end,begin,N,第三讲循环结构,该题目的N-S流程图,a1=1;a2=1;an=0;,i=20,an=a1+a2,输出an,i=i+1,a1=a2,a2=an,第三讲循环结构,2.程序源代码:方法一:for循环语句#includestdio.hmain()longa1,a2,an;inti;a1=a2=1;for(i=3;i=20;i+)an=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;,可否调换?,第三讲循环结构,方法二:while循环语句#includestdio.hmain()longa1,a2,an;inti;a1=a2=1;i=3;while(i=20)an=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;i+;,第三讲循环结构,方法三:do-while循环语句#includestdio.hmain()longa1,a2,an;inti;a1=a2=1;i=3;doan=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;i+;while(i=20);,第三讲循环结构,3.归纳分析(1)for语句格式:for(表达式1;表达式2;表达式3)语句即:for(循环变量赋初值,循环结束条件,循环变量增值)语句,第三讲循环结构,For语句执行过程,第三讲循环结构,表达式可以省略,但分号不能省略a)省略表达式1i=1for(;i=50;i+)sum=sum+2*ib)省略表达式2产生死循环for(i=1;i+)sum=sum+2*ic)省略表达式3for(i=1;i=50;)sum=sum+2*i;i+;d)省略表达式1,省略表达式3i=1for(;i=50;)sum=sum+2*i;i+;,第三讲循环结构,表达式1,表达式3可以是:a)简单的表达式b)逗号表达式表达式2一般是关系表达式或逻辑表达式例:for(sum=0,i=1;i=50;i+,i+)sum=sum+2*i;或:for(sum=0,i=1;i=50;i=i+2)sum=sum+2*i,第三讲循环结构,(2)while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。,第三讲循环结构,使用while语句应注意以下几点:1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。2.循环体如包括有一个以上的语句,则必须用括起来,组成复合语句。3.应注意循环条件的选择以避免死循环,一般需要在循环体中动态改变循环条件的值。,第三讲循环结构,(3)do-while语句的一般形式为:do语句;while(表达式);其中语句是循环体,表达式是循环条件。do-while语句的语义是:先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。,第三讲循环结构,(4)循环体语句可使用break和continue语句break:可以用来从循环体内跳出循环体(提前结束循环)continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断例:输出100以内能被7整除的数。intn;for(n=7;n=100;n+)if(n%7!=0)continue;printf(%d,n);,第三讲循环结构,练习:1.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的前20项之和。2.求1+2!+3!+.+20!的和。3.用牛顿切线法求x-sin(x)=0在区间(0,)之间的解。4.任意输入两个数,求这两个数的最大公约数。5.从键盘输入一个数判断其是否为素数。,第三讲循环结构,作业:求s=a+aa+aaa+aaaa+aa.a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?求1+2!+3!+.+20!的和猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?,第三讲循环结构,3.2循环的嵌套使用【实例】搬砖问题。36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干?1.分析:列方程,得出问题条件:w+m+c=364*m+3*w+c/2=36可以用枚举的方法,让变量w在09、m在012、c在036的偶数中取值,形成满足上述条件的w、m、c的组合,第三讲循环结构,N-S流程图,第三讲循环结构,2.程序main()intm,w,c;for(m=0;m9;m+)for(w=0;w12;w+)c=36-w-m;if(c%2!=0)continue;if(4*m+3*w+c/2=36)printf(“m=%d,w=%d,c=%d”,m,w,c);,第三讲循环结构,练习:1.输出9*9口诀。2.判断101-200之间有多少个素数,并输出所有素数。3.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方5的三次方3的三次方。,第三讲循环结构,作业:1.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。2.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=123.编程找出1000以内的所有完数。,第三讲循环结构,课堂讨论:五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。,第三讲循环结构,思路:1首先是将五个人的预测写成逻辑表达式:让关系运算符“=”的含义是“是”。让数字1、2、3、4、5分别表示名次第一、第二,第五。让整型变量A、B、C、D、E分别表示每个选手所得名次。A选手说:B=2,A=3;B选手说:B=2,E=4;C选手说:C=1,D=2;D选手说:C=5,D=3;E选手说:E=4,A=1;,第三讲循环结构,2考虑到每个人说的话是一对一错,即一真一假,比如A说的,若B=2为真,则A=3为假,为真取值为1,为假取值为0,则两个关系表达式之和必为1。即(B=2)+(A=3)应该是1我们可以归纳出要同时满足五个人所说的话都符合一半对一半错的条件是ta=(B=2)+(A=3)=1;符合A选手的话,则ta为1tb=(B=2)+(E=4)=1;符合B选手的话,则tb为1tc=(C=1)+(D=2)=1;符合C选手的话,则tc为1td=(C=5)+(D=3)=1;符合D选手的话,则td为1te=(E=4)+(A=1)=1;符合E选手的话,则te为1,第三讲循环结构,3.仍然可以用枚举的方法,让变量A、B、C、D、E在15中取值,形成满足上述条件且A、B、C、D、E取值均不同的AE的组合,即是所求。可以考虑A、B、C、D、E取值均不同的条件为A*B*C*D*E=120,第三讲循环结构,第三讲循环结构,For(A=1;A=5;A+),For(B=1;B=5;B+),For(C=1;C=5;C+),For(D=1;D=5;D+),E=15-(A+B+C+D),A*B*C*D*E=120,求ta、tb、tc、td、te,t=ta+tb+tc+td+te,t=5,输出ABCDE,True,True,False,False,作业:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:1)A、B至少有一人作案;2)A、D不可能是同案犯;3)A、E、F三人中至少有两人参与作案;4)B、C或同时作案,或与本案无关;5)C、D中有且仅有一人作案;6)如果D没有参与作案,则E也不可能参与作案。试编一程序,将作案人找出来。,第三讲循环结构,1案情分析:将案情的每一条写成逻辑表达式,第一条用CC1表示,第二条用CC2表示,CC1:A和B至少有一人作案令A变量表示A作案B变量表示B作案ABCC1000101011111显然这是或的关系,因此有CC1=(A|B),第三讲循环结构,CC2:A和D不可能是同案犯可以分析为:A如果是案犯,D一定不是案犯,写成AA=1;A+),for(B=0;B=1;B+),for(C=0;C=1;C+),for(D=0;D=1;D+),for(E=0;E=1;E+),for(F=0;F=1;F+),计算CC1CC2CC3CC4CC5CC6,判断这些值是否都为1,True,False,输出ABCDEF为1的,问题:哪只羊最重?中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。,第四讲数组,1.程序分析:,第四讲数组,2.程序main()/主函数floatsheep10;/数组,有10个浮点类型元素floatmax;/浮点类型变量,存放最肥羊的重量inti,k;/整型变量,i用于计数循环,k用于记录最肥羊的号max=0.0;/赋初值0for(i=0;i=ai+1,位置不动;如果aiai+1,位置交换,即p=ai;ai=ai+1;ai+1=p;步骤3结束后an-j+1中的数为最小的数步骤4:让j=j+1;只要jn就返回步骤3,将an-j+1的值排好。当j=n时执行步骤5步骤5:输出排序结果,第四讲数组,2.程序main()/主函数inti,j,p,a7;/整型变量for(i=1;i=6;i=i+1)/键入6个数,放入a数组中printf(“请输入待排序的数a%d=”,i);scanf(“%d”,第四讲数组,作业:船长与水手的问题:有载有50个人的大船,突然触礁,船底撞了一个大窟窿,水不停地涌进船里,船不断下沉。这时,聪明的船长把所有人召集到一起,给每人一个编号,手拉手围成一圈,从1号开始报数,报的数为9时,这个人出列,跳入大海,剩下的人继续围成一圈,后面的人从1开始继续报数,重复上面地步骤,聪明的船长却最后留在了船上。问:船长是几号才能最后一个跳入大海?,第四讲数组,讨论问题:使用筛法求100以内的所有素数思路1.想象将100个数看作沙子和小石头子,让小石头子当作素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。2.非素数一定是2、3、4的倍数。3.使用数组,让下标就是100以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为1。,第四讲数组,1至100这些自然数可以分为三类:单位数:仅有一个数1。素数:是这样一个数,它大于1,且只有1和它自身这样两个正因数。合数:除了1和自身以外,还有其他正因数。1不是素数,除1以外的自然数,当然只有素数与合数。筛法实际上是筛去合数,留下素数。为了提高筛选法效率,注意到:令n为合数(这里是100),c为n的最小正因数,则据初等数论只要找到c就可以确认n为合数,将其筛去。,第四讲数组,for(i=2;i=100:i+),primi=0;,for(i=3;i=100:i+),a=sqrt(i),for(j=2;j=a:j+),i%j=0,primi=1,for(i=2;i=100;i+),primi=0,输出i,Yes,Yes,No,No,第四讲数组,二维数组问题:求矩阵a的最大值135a=792468,第四讲数组,1二维数组定义格式:类型说明符数组名常量表达式常量表达式例:inta23=3,5,4,1,2,6;说明:a)每一维的下标从0开始,整个数组元素为:23=6个b)C语言中,二维数组中元素排列的顺序是按行存放。即:先存放第一行的元素,再存放第二行的元素,第四讲数组,二维数组在内存中的分配情况,内存,地址,变量名,FF02,FF01,FF00,FF03,FF04,FF05,FF06,FF07,a00,a01,a10,a11,00000000,00000011,00000000,00000101,00000000,00000100,00000000,00000001,00000000,00000010,FF08,FF09,a20,a,数组名,第四讲数组,c)可以计算数组元素在数组中的序号假设mn的数组a,计算aij序号的公式:in+j如33数组中:a0103+1=1(第二个)a1213+2=5(第六个)a2223+2=8(第九个),第四讲数组,求矩阵a的最大值135a=792468问题分析:将矩阵放入二维数组a33中首先定义变量max=a00,max与a01比较,若发现maxa01,则将max=a01,这样max与数组元素逐个比较,最后找到数组中最大的一个。采用二重循环分别对行和列进行控制。外层控制行标,内层控制列标。,第四讲数组,作业1.打印魔方阵:816357492,算法:1.将1放到第1行的中间。2.下一个数放在该数的前一行后一列。3.若该位置已经有数,则放在前一数的正下方。4.当前数是右上角时,其下一个数放在其下方。5.若当前是第1行,则其前一行为第n行,若当前列是第n列,则其后一列为第1列。,第四讲数组,问题:编程求解我们用函数来编写这个题的程序,参考程序如下:,#include/预编译命令#definen6/定义n为6#definek4/定义k为4voidmain()/主函数printf(sumof%dthpowersofintegersfrom1to%d=,k,n);printf(%dn,SOP(n,k);/输出结果,其中SOP(n,k)为被调用函数,第五讲函数,intSOP(m,l)/整型自定义函数,m,l为形参intm,l;/形参m,l为整型变量inti,sum=0;/整型变量i,sumfor(i=1;iS;1#青蛙从YS;3#青蛙从LY;4#青蛙从LR;3#青蛙从YR;1#青蛙从SY;2#青蛙从SR;1#青蛙从YR;,S,Y,5,4,6,L,R,1,2,3,7,8,9,1#,2#,4#,3#,3#,1#,2#,1#,1#,第六讲递归及其实现,用L1L2L3L4表示左岸石柱上落在一起的青蛙的高度位置。L1在最上面,L4在最下面的位置。引入这个信息就可比较容易地看出对青蛙占位的约束条件。同理R1R2R3R4也是如此。对水中石柱S,也分成两个高度位置S1S2。对荷叶Y无须分层,因为它只允许一只青蛙落在其上。t=0为初始时刻,青蛙从小到大落在石柱L上。t=1为第一步:1#从L跳至荷叶Y上;L上只剩2#3#4#。T=2为第二步;2#从L跳至石柱S上,处在S2位置上,L上只剩3#和4#。T=3为第三步,1#从Y跳至S,将Y清空。这时可看出,S上有1#、2#,L上有3#、4#,好象是原来在L上的4只青蛙,分成了上下两部分,上面的2只通过荷叶y转移到了S上。这一过程是一分为二的过程。即将L上的一队青蛙,分解为两个队,每队各二只,且将上面的二只转移到了S上。这时我们可以考虑形成两个系统,一个是L,Y,R系统,一个是S,Y,R系统。前者二只青蛙号大;后者二只青蛙号小。先跳号大的,再跳号小的。从第五步到第九步可以看出的确是这么做的。,第六讲递归及其实现,对于LYR系统,相当于Jump(0,1)对于SYR系统,相当于Jump(0,1)两个系统之和为2*Jump(0,1),因此有:Jump(1,1)=2*Jump(0,1)=2*2=4。现在再看S=2,y=1Jump(2,1)我们将河中的两个石柱称作S1和S2,荷叶叫y,考虑先将L上的青蛙的一半借助于S2和y转移到S1上,当然是一半小号的青蛙在S1上,大的留在L上。,y,L,R,S1,S2,第六讲递归及其实现,这样LS1S2yR系统分解为:(LS2yR系统)+(S1S2yR系统)=2*(LS2yR系统)=2*Jump(1,1)用归纳法Jump(S,y)=2*Jump(S-1,y),第六讲递归及其实现,main()ints,y,sum;/整型变量,s为河中石柱数,y为荷叶数printf(请输入石柱数s=);scanf(%d,第六讲递归及其实现,指针是C语言中的一个重要概念。掌握指针的用法,可使程序简洁、高效、灵活,但并不难学。为了了解什么是指针,先看一个小故事地下工作者阿金接到上级指令,要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索,密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:“去打开211房间,那里有线索”。阿金疾步上楼,打开211房间,用电筒一照,只见桌上赫然6个大字:地址1000。阿金眼睛一亮,迅速找到1000房间,取出重要数据66,完成了任务。,第七讲指针,211,1000,P,说明:1、数据藏在一个内存地址单元中,地址是1000。2、地址1000又由P单元所指认,P单元的地址为211。3、66的直接地址是1000;66的间接地址是211;211中存的是直接地址1000。4、称P为指针变量,1000是指针变量的值,实际上是有用数据藏在存储器中的地址。,1000,66,第七讲指针,指针变量用来存放另一变量地址的变量变量的指针就是变量的地址。1、指针的概念指针是一种特殊的变量,特殊性表现在类型和值上。从变量讲,指针也具有变量的三个要素:(1)变量名,这与一般变量取名相同,由英文字符开始。(2)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。(3)指针的值是某个变量的内存地址。,第七讲指针,从上面的概念可知,指针本身类型是int型,因为任何内存地址都是整型的。但是指针变量的类型却定义成它所指向的变量的类型。2、指针的定义(说明,先说明后引用)例如:int*p,*q;/定义p,q为指向整数类型变量的指针float*point;/定义point为指向float型变量的指针double*pd;/定义pd为指向double型变量的指针int(*pa)10;/定义pa为指向int型数组的指针int(*pu)();/定义pu为指向int型函数的指针int*qq;/定义qq为指向int型指针的指针还有指向结构、联合的指针,后面再介绍,第七讲指针,3、指针赋值例intakey;/定义一个整型变量akeyint*p,*q;/定义p,q为指向整型变量的指针变量akey=66;/将66赋给akeyp=/将p的值赋给q,见图2,66,#includevoidmain()inta5=0,1,2,3,4;/定义数组,赋初值int*p1,*p2;/定义指针变量p1=,第七讲指针,4,3,2,1,0,int*p,*q;akey=66;p=,第七讲指针,66,66,int*p;inti;p=a;for(i=0;i成员名,第八讲结构体,用指针处理链表(1)链表的基本概念链表是一种重要的数据结构,主要用以实现对数据的动态存储,链表中包含若干个结点(又可称为元素),每个结点包含的数据有两部分:一是用户的实际数据,二是下个结点的地址信息,这样,结点都按这个原则“连接”起来,在这种链式结构中,每个结点只有一个“前驱”和一个“后继”,所以,只要知道链中第一个结点的地址,就可以遍访链中的其他结点。,第八讲结构体,头指针:存储第一个结点的指针变量(*head)表头:由头指针指向的结点,有后继而无前驱表尾:表的最后一个结点,有前驱而无后继,其下一个的地址信息为空(NULL),结点的表述:以结构体变量描述:structstudentintnum;intscore;structstudent*next;,第八讲结构体,第八讲结构体,40,110,220,315,4NULL,头指针head,数据,指针,首地址40,首地址10,首地址20,首地址15,如下所示为典型的单链表结构:,5,head,6,10,null,15,12,8,链表的建立例子:已有一个如图所示的链表。它是按结点中的整数域从小到大排序的。现在要插入一个结点,该节点中的数为10。,待插入结点,p,第八讲结构体,分析:考虑将结点p插入链表head中,分如下三种情况:1、第一种情况,链表还未建成(空链表),待插入结点p实际上是第一个结点。这时必然有head=null。只要让头指针指向p就可以了。语句为head=p;p-next=null;2、第二种情况,链表已建成,待插入结点p的数据要比头结点的数据还要小,这时有p-numnum。当然p结点要插在head结点前。3、第三种情况,链表已建成,待插入结点p的数据比头结点的数据大,需要找到正确的插入位置。这时,可以借助两个结构指针r和q,利用循环比较来找到正确位置。然后将结点p插入到链表中正确的位置。,第八讲结构体,说明:这种情况下,p结点已经与链表的第一个结点比较过了,所以从链表的下一个结点开始比较。138,继续比较。,第八讲结构体,说明:1312,继续比较。,6,head,8,12,null,13,p,null,15,q,r,第八讲结构体,说明:13nex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深海探险起点:船舶租赁合同揭秘
- 飞行员培训合同合作意向范本
- 车险代理合同书样本
- 企业员工培训合作协议合同
- 股权激励实施合同协议
- 施工领域农民工劳动合同模板
- 汽车购销合同其一:条款解析
- 小学生心理课件
- 无线广播电视传输中的信号传输信道分配考核试卷
- 天然气储层渗透性改善技术考核试卷
- 2024年甘肃天水麦积山石窟艺术研究所招聘工作人员考试真题
- 2025年山东省荣成市属事业单位招聘岗位及历年高频重点模拟试卷提升(共500题附带答案详解)
- 火星表面材料分析-深度研究
- 《职业技能等级评价规范编制指南编制说明》
- 《教育强国建设规划纲要(2024-2035年)》解读讲座
- 畜禽养殖场恶臭污染物排放及其处理技术研究进展
- 超声内镜引导下穿刺活检术的配合及护理
- 新生儿常见的产伤及护理
- 代写回忆录合同
- 2024年10月自考00149国际贸易理论与实务试题及答案
- 天耀中华合唱简谱大剧院版
评论
0/150
提交评论