《结构体与指针》PPT课件.ppt

上传人:za****8 文档编号:12722974 上传时间:2020-05-19 格式:PPT 页数:49 大小:2.49MB
返回 下载 相关 举报
《结构体与指针》PPT课件.ppt_第1页
第1页 / 共49页
《结构体与指针》PPT课件.ppt_第2页
第2页 / 共49页
《结构体与指针》PPT课件.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
1,复习:(1)结构体变量的定义与引用(2)结构体数组,新内容:(1)指向结构体变量的指针(2)指向结构体数组的指针(3)结构体指针作为函数参数(4)用指针处理链表,第7讲结构体与指针,2,复习:结构体变量的定义与引用,注意不要忘了分号,结构体类型定义形式:,struct结构体类型名数据类型成员名1;数据类型成员名2;:数据类型成员名n;,关键字,用户定义的标识符,3,2.定义结构体类型同时定义变量structstudentcharname10;intage;ints1,s2;st1,st2;,1.先定义结构体类型,再定义变量structstudentcharname10;intage;ints1,s2;structstudentst1,st2;,复习:结构体变量的定义与引用,结构体变量的定义,结构体类型定义,结构体变量定义,结构体变量占用的字节数可用sizeof运算符算出,printf(“%dn”,sizeof(structstudent);printf(“%dn”,sizeof(st1);,4,复习:结构体变量的定义与引用,例:structdateintyear;intmonth;intday;structstudcharname10;structdatebirthday;ints1,s2;,结构体类型可以嵌套定义,或:structstudcharname10;structdateintyear;intmonth;intday;birthday;ints1,s2;,5,复习:结构体变量的定义与引用,应用typedef定义结构体类型,structstudentcharname10;intage;ints1,s2;structstudentst1,st2;,typedefstructstudentcharname10;intage;ints1,s2;SD;SDst1,st2;,优点:书写简单,使程序具有更好的移植性,6,复习:结构体变量的定义与引用,引用结构体变量中的成员(点记法)格式:结构体变量名.成员名,structstudentcharname10;intage;ints1,s2;st1,st2;,strcpy(st1.name,“Mary”);st1.age=21;scanf(“%d%d”,相同类型的结构体变量可以进行整体赋值,只能对结构体变量的成员进行输入和输出,st2=st1;,7,11.6.1指向结构体数据的指针,定义指向结构体变量的指针typedefstructstudentcharname20;intage;ints1,s2;SD;SDx,stu,*p;p=,成员的引用格式(1)结构体变量名.成员名stu.name,例:scanf(“%s”,x.name);scanf(“%d”,(2)(*指针变量名).成员名(*p).age,(3)指针变量名-成员名p-s1,8,赋值语句p=,指针变量p指向结构体变量student,引用结构体中的成员变量:(*p).成员名或p-成员名,相当于,student.成员名,9,说明:和成员运算符一样,“-”为指向运算符,是运算优先级最高的运算符。由于成员运算符“.”的运算优先级高于运算符“*”,因此(*p).成员名中()不能少。,*p.成员名,p=,不能用指向某个结构体变量的指针指向该结构体变量的某个成员。,10,对结构体数组及其元素可以用指针来指向,例如:structstruct_namecharname10;intnum;floatscore;/*定义结构体类型标识符*/structstruct_namestd30,*p;,11.6.1指向结构体数组的指针,11,赋值语句p=std;/*p指向一个结构体数组std*/,/*指针变量p存放的是数组std的首地址*/,引用:p-name;p-num;p-score;,12,思考:赋值语句p=std+1;和p+;分别代表指针p指向哪里?,p-name;p-num;p-score;代表的信息发生了什么变化?,13,注意:以下赋值语句都是错误的:,p=,(不能指向数组元素的成员变量),p=,(数组名本身就代表该数组的首地址,因此不能使用地址运算符例:structstudentfunct(intx,floaty)函数体;,注意:结构体类型是已经定义好的,11.6.3结构体指针作为函数参数,15,#include#defineN5structstudcharname10;ints3;intsum,ave;,structstudcount(structstudx)intj;x.sum=0;for(j=0;jsum+p-sj;p-ave=p-sum/3;return(p);,例:求学生成绩的总分和平均分(指向结构体的指针作参数),#include#defineN5structstudcharname10;ints3;intsum,ave;,/指向结构体的指针作参数返回结构体类型的值,18,voidmain()structstudaN;intj;for(j=0;jnum,p-score);p=p-next;,2010,1428,1570,2010,1951428,2861570,382NULL,2010,1428,1570,NULL,输出:1,95,2,86,3,82,voidmain()ST*h=NULL;h=creat();list(h);,33,链表的删除结点操作,删除表头结点,让头指针指向链表的第2个结点,1428,step1:让指针变量p指向要删除的结点即表头结点,step2:重新给头指针赋值,使它指向第2个结点,head=p-next;,step3:释放删除的结点空间,free(p);,p=head;,34,链表的删除结点操作,删除表尾结点,将链表的倒数第2个结点的指针成员赋为NULL,step1:让指针变量p指向要删除的结点即表尾结点让指针变量q指向要删除结点的前一个结点,step2:将删除结点的前驱结点的指针成员赋空值,step3:释放删除的结点空间,free(p);,q-next=NULL;,NULL,35,链表的删除结点操作,删除中间结点,step1:让p指向要删除的结点,让q指向要删除结点的前驱结点,step2:前驱结点的指针成员赋为要删除结点的指针成员值,step3:释放删除的结点空间free(p);,q-next=p-next;,让要删除结点的前驱结点指向要删除结点的后继结点,1570,36,ST*del(ST*head,intnum)ST*p,*q=NULL;p=head;while(num!=p-num),typedefstructstudentintnum;intscore;structstudent*next;ST;,链表的删除结点操作,删除结点函数,令p指向要删除的结点,q指向其前驱结点,/删除结点为表头结点,/删除结点为表尾结点或中间结点,/释放已删除的结点空间,/链表的结点个数减1,/返回链表的头指针,37,ST*p,*q=NULL;p=head;while(num!=p-num),设num=3,2010,1428,1428,1570,让p指向要删除的结点,让q指向其前驱结点,链表的删除结点操作,38,链表的插入结点操作,插入的结点作表头结点,2010,让p0指向新结点即要插入的结点,让p1指向插入位置上的结点即表头结点,head=p0;p0-next=p1;,2106,39,插入的结点作表尾结点,让p0指向新结点即要插入的结点,让p1指向插入位置上的结点即表尾结点,NULL,3652,链表的插入结点操作,p1-next=p0;p0-next=NULL;,40,插入的结点作中间结点,链表的插入结点操作,让p0指向新结点即要插入的结点,让p1指向插入位置上的结点,p2指向p1的前驱结点,2374,1570,p2-next=p0;p0-next=p1;,41,链表的插入结点操作,插入结点函数,ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,/如果是空链表,则新结点是链表的表头结点,/找到要插入结点的位置,/插入结点作表头结点,/插入结点作中间结点,/插入结点作表尾结点,/链表的结点个数加1,42,链表的插入结点操作,(1)插入链表的第一个结点ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,386,1428,NULL,1428,NULL,1,43,链表的插入结点操作,ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,1428,2,2010,1428,195,(2)插入结点作表头结点,1428,2010,44,链表的插入结点操作,ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,(3)插入结点作表尾结点,582,NULL,2010,2010,1428,3,1570,45,练习题,建立一个链表并输出;根据用户要求删除链表中第n个结点;根据用户要求在第n个结点后插入一个结点;输出改变的链表;main函数调用各函数.,46,#include#includetypedefstructstudentintnum;intscore;structstudent*next;ST;#defineLENsizeof(ST)intn=0;,ST*creat(void)ST*p1,*p2,*head=NULL;p1=(ST*)malloc(LEN);if(p1=NULL)printf(nNoenoughmemory!n);exit(0);scanf(%d%d,47,voidlist(ST*head)ST*p;p=head;while(p!=NULL)printf(“%d,%dn”,p-num,p-score);p=p-next;,ST*del(ST*head)ST*p,*q;p=head;inti,num;printf(“deleten:”);scanf(“%d”,48,ST*insert(ST*head)ST*p,*q,*p0;p=head;inti,num;printf(“insertn:”);scanf(“%d”,49,voidmain()ST*h=NULL;h=creat();list(h);h=del(h);list(h);h=insert(h);list(h);,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!