您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第10章-结构体new总结
第10章结构体本章内容结构体类型的定义结构体变量的定义结构体数组结构体与指针链表的概念及操作2引例输入10位同学的一组信息,包括学号、姓名、性别、数学成绩、计算机成绩,求得每位同学的平均分和总分,然后按照总分从高到低排序。3结构体类型与变量的概念结构体类型把关系紧密且逻辑相关的多种不同类型的数据组织到统一的名字之下,这样的集合称为结构体类型。结构体变量结构体类型的变量占用相邻的一段内存单元45一般形式:struct结构体类型名{类型关键字成员名1;类型关键字成员名2;…...类型关键字成员名n;};构成结构体类型的数据称为结构体的成员,也称元素或域结构体类型的定义6先定义结构体类型再定义变量名在定义类型的同时定义变量直接定义结构体变量(不出现结构体类型名)structstudentstudent1,student2;structstudent{intnum;charname[20];charsex;floatshx;floatjsj;floataver;floatsum;}student1,student2;struct{intnum;charname[20];charsex;floatshx;floatjsj;floataver;floatsum;}student1,student2;结构体变量的定义用户自定义类型名关键字typedef概念:关键字typedef用来为已经定义的数据类型定义一个别名。举例:typedefstructstudentSTUD;STUDstudent1,student2;STUD与structstudent类型是同义词7结构体变量的内存占用按照域表中域的先后顺序依次在内存中划分存储单元给每个域。直接用结构体的每个成员类型所占内存字节数的和作为一个结构体实际所占的内存字节数是不正确的。事实上,所有数据类型在内存中都是从偶数地址开始存放的,且结构所占的实际空间一般是按照机器字长对齐的.不同的编译器、平台,对齐方式会有变化我们用sizeof函数获得结构体变量所占的字节数。即用sizeof(structstudent)进行计算8结构体变量的引用一般形式:结构体变量名.成员名结构体变量的初始化举例:structstudentst1={101,zhangsan,'M',85,69};structstudent{intnum;charname[20];charsex;floatshx;floatjsj;floataver;floatsum;};9举例:以下结构体变量的引用哪个是正确的?structs{intx;inty;}vs;A)s.x=10;B)s.vs.x=10;C)structva;D)structsva={10};va.x=10;10结构体变量的输入与输出C语言规定,不能将一个结构体变量作为一个整体实施输入、输出的操作,只能对每个具体的成员进行输入、输出操作。举例:structstudentst1={101,zhangsan,'M',85,69};11结构体类型的嵌套如:structdate{intmonth;intday;intyear;};structstud{charname[20];intnum;charsex;structdatebirthday;floatshx;floatjsj;floataver;floatsum;};12结构体类型中的成员也可以是结构体。举例structworkers{intno;charname[20];charsex;struct{intday;intmonth;intyear;}birth;}w;若w中的生日为1963年10月25日,如何编写相应的语句?13w.birth.day=25;w.birth.month=10;w.birth.year=1963;结构体数组概念:由若干相同结构体类型的数据组成的有序集合,叫做结构体数组。定义形式:同基本数据类型的数组定义方法struct结构体类型名结构体数组名[元素个数];14举例structperson{charname[9];intage;};structpersonclass[10]={John,19,Paul,17,Mary,18,Adam,16};能打印出字母A的语句应为:15Printf(“%c”,class[3].name[0]);举例引例:输入10位同学的一组信息,包括学号、姓名、数学成绩、计算机成绩,求得每位同学的平均分和总分,然后按照总分从高到低排序。zhang,001,95.0,64.0wang,002,92.0,97.0zhao,003,85.0,78.0li,004,96.0,88.0zhou,005,91.0,96.0wu,006,93.0,78.0lin,007,98.0,97.0ma,008,89.0,93.0zhen,009,88.0,90.0yu,010,94.0,90.016#includestdio.hvoidmain(){structstudent{charname[10];intnum;floatshx;floatjsj;floataver;floatsum;}stu[4]={{zhang,001,95.0,64.0},{wang,002,92.0,97.0},{zhao,003,85.0,78.0},{li,004,96.0,88.0}},student1;inti,j;for(i=0;i4;i++){stu[i].sum=stu[i].shx+stu[i].jsj;stu[i].aver=stu[i].sum/2;}17for(i=0;i3;i++)for(j=i+1;j4;j++)if(stu[i].sumstu[j].sum){student1=stu[i];stu[i]=stu[j];stu[j]=student1;}printf(sortafer:\n);for(i=0;i4;i++){printf(%s,stu[i].name);printf(%0d,stu[i].num);printf(%7.2f,stu[i].shx);printf(%7.2f,stu[i].jsj);printf(%7.2f,stu[i].aver);printf(%7.2f\n,stu[i].sum);}}18结构体与指针指向结构体变量的指针结构体数组与指针链表19指向结构体变量的指针structpoint{intx;inty;};structpointpt;/*定义结构体变量*/structpoint*ppt;/*定义结构体指针*/ppt=&pt;怎样通过pt访问pt的成员?pt.x=0;/*成员运算符*/怎样通过ppt访问pt的成员?(*ppt).x=0;ppt-x=0;/*指向运算符*/第二种更常用20xypptpt思考题structpoint{intx;inty;};structrect{structpointpt1;structpointpt2;};structrectrt;structrect*rp=&rt;下面表达式哪些合法?rt.pt1.x(*rp).pt1.xrp-pt1.xrt-pt1.x上面合法的表达式都是等价的吗?21√√√×结构体数组的指针structSTUDENTstu[4];structSTUDENT*pt;pt=stu;22…2…3…4…1stu[0]stu[1]stu[2]ptpt++stu[3]举例#includestdio.hstructst{intx;inty;};voidmain(){structsts[2]={{24,8},{4,2}},*p=s;printf(%d,++p-x);/*(++p)-x*/}23输出结果为:25(4)下面程序的运行结果是___________.main(){structcmplx{intx;inty;}cnum[2]={1,3,2,7};printf(%d\n,cnum[0].y/cnum[0].x*cnum[1].x);}a)0b)1c)3d)624√#includestdio.hstructst{intx;int*y;};voidmain(){intdt[4]={10,20,30,40};structsta[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};structst*p=a;printf(%d\n,++p-x);printf(%d\n,(++p)-x);printf(%d\n,++(*p-y));}25输出结果是:516021struct类型的特点一个普通的类型可以定义该类型的变量、数组、指针可以做函数的参数类型和返回值类型它的成员可以是任意类型基本类型、数组、指针、结构体struct类型的变量两个同类型结构体变量之间可以相互赋值可以取地址&不能直接参与算术和比较运算26动态数据结构—链表结构体类型声明时不能包含自我,但可以包含指向本结构体类型的指针变量链表structLink{intdata;structLink*next;};27datanextheaddatanextdatanextdataNULL图10-1链表原理图基本概念链表---是一种常见的重要的数据结构。它是动态进行存储分配的一种结构。它可以根据需要开辟或删除存储单元。链表分为单向链表和双向链表。头指针---链表有一个头指针变量,通常以head表示,它存放链表中的第1个元素的地址。28datanextheaddatanextdatanextdataNULL图10-1链表原理图基本概念节点---链表中的元素称为节点。每个节点都包含两部分:数据域和指针域。根据节点在链表中的位置,又可分为链表的起始节点、中间节点以及结束节点。链表的结束节点的指针域为空指针NULL29datanextheaddatanextdatanextdataNULL图10-1链表原理图举例#includestdio.hstructst{intx;structst*next;};voidmain(){structstaa[3]={5,&aa[1],7,&aa[2],9,NULL};structst*p;p=&aa[0];printf(%d,++p-x);}30两个常用函数malloc()函数—动态申请内存如:structtemp{intdata;structtemp*next;};structtemp*p;p=(structtemp*)malloc(sizeof(structtemp));free()函数—释放内存如:free(p);使用这两个函数时要包含头文件stdlib.h31单链表的基本操作链表的建立链表的删除链表的插入3233共用体联合体又称为共用体,意为各种不同数据共用同一段存储空间。与结构体类似,为了定义共用体类型变量,首先要定义共用体类型,说明该共用体类型中包括哪些成员,它们各属于何数据类型,然后再定义该类型的变量。34定义共用体数据类型的一般形式为union共用体名{成员表};例如,unionw{intk;doubled;charc;};定义了一个共用体类型w,包括代表整型量的成员k、代表双精度型量的成员d和代表字符型量的成员c。k,d,c三个变量的首地址相同,相当于共用了一段连续的内存单元,长度为8.kdc2000共用体变量的引用与赋值引用的一般形式:共用体变量名.成员名赋值:仅在程序中进行,不能初始化,每次只能赋予一个成员值。3536几点说明:(1)由于一个共用体变量中的各成员共用一段存储空间,因此,在任一时刻,只能有一种类型的数据存放在该变量中,即在任一时刻,只有一个成员的数据有意义,其他成员的数据是没有意义的。(2)在引用共用体变量中的成员时,必须保证数据的一致。(3)在定义共用体变量时不能为其初始化,并且,共用体变量不能作为函数参数。
本文标题:第10章-结构体new总结
链接地址:https://www.777doc.com/doc-1953552 .html