结构体共用体和用户定义的类型_第1页
结构体共用体和用户定义的类型_第2页
结构体共用体和用户定义的类型_第3页
结构体共用体和用户定义的类型_第4页
结构体共用体和用户定义的类型_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于结构体共用体和用户定义的类型结构体:是一种自定义的构造数据类型。用途:把不同类型的数据组合成一个整体。struct

[结构体名]{

类型标识符成员名;类型标识符成员名;

…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体14.1

结构体类型定义:第2页,共44页,2024年2月25日,星期天例

struct

student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存结构体类型的定义第3页,共44页,2024年2月25日,星期天例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;14.1.2

结构体变量1、结构体变量的定义(1)、先定义结构体类型,再定义结构体变量一般形式:struct

结构体名{类型标识符成员名;类型标识符成员名;…………….};struct

结构体名变量名表列;第4页,共44页,2024年2月25日,星期天(2)、定义结构体类型的同时定义结构体变量一般形式:struct

结构体名{类型标识符成员名;类型标识符成员名;…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;第5页,共44页,2024年2月25日,星期天(3)、无名结构体定义一般形式:struct{

类型标识符成员名;类型标识符成员名;

…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义第6页,共44页,2024年2月25日,星期天几点说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体成员名与程序中变量名地位相同结构体可嵌套例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear第7页,共44页,2024年2月25日,星期天2、结构体变量的初始化和其他类型的变量相同,在定义结构体变量时赋初值形式一:struct

结构体名{类型标识符成员名;类型标识符成员名;…………….};struct

结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};第8页,共44页,2024年2月25日,星期天形式二:struct结构体名{类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};第9页,共44页,2024年2月25日,星期天形式三:struct{

类型标识符成员名;类型标识符成员名;

…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};第10页,共44页,2024年2月25日,星期天3结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);(

)stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(

)例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..(

)第11页,共44页,2024年2月25日,星期天指针引用结构体变量中数据指针变量名->成员名(*指针变量名).成员名structstudent{charname[12];charsex;structdatebirthday;floatsc[4];}std,arr[5],*ps;ps=&std;

引用结构体变量std中的sex成员,可写作:std.sexps->sex(*ps).sex第12页,共44页,2024年2月25日,星期天14.1.3结构体数组1、结构体数组的定义和初始化定义:三种形式:形式一:

structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B第13页,共44页,2024年2月25日,星期天初始化:与其他类型的数组赋初值的方法相同例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};分元素初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时维数可省第14页,共44页,2024年2月25日,星期天2、结构体数组引用引用方式:结构体数组名[下标].成员名stu[1].age++;structstudent{intnum;charname[20];charsex;intage;}str[3];strcpy(stu[0].name,”ZhaoDa”);numnamesexagenumnamesexagestu[0]stu[1]25B第15页,共44页,2024年2月25日,星期天14.2向函数传递结构体型数据

1.向函数传递结构体变量的成员

普通变量作函数的实参的用法相同,形参与实参之间仍然是“值传递”的方式。2.向函数传递结构体变量

ANSIC允许函数之间传递结构体变量。若实参是结构体变量,那么形参也应是同类型的结构体变量。3.向函数传递结构体数组名若实参是结构体数组名,那么形参也应是同类型的结构体变量。第16页,共44页,2024年2月25日,星期天#include<stdio.h>typedefstuct{intnum;doublemark;}REC;voidsub1(RECx){x.num=23;x.mark=81.5;}voidsub2(RECy[]){y[0].num=12;y[0].mark=77.5;}main(){RECa={16,90.0},b[]=16,90.0};sub1(a);printf(“A)%d,%5.1lf\n”,a.num,a.mark);sub2(b);printf(“B)%d,%5.1lf\n”,b[0].num,b[0].mark);}结果:16,90.012,77.5第17页,共44页,2024年2月25日,星期天读入五位用户的姓名和电话号码,按姓名字典顺序排序后,输出用户的姓名和电话号码.#include<stdio.h>#include<string.h>#defineN5typedefstruct

{charname[20];charnum[10];}USER;voidgetdata(USER*sp);voidgetsort(USER*sp);voidoutdata(USER*sp);第18页,共44页,2024年2月25日,星期天main(){USERsp[N];getdata(sp);getsort(sp);outdata(sp);}voidgetdata(USER*sp){inti;printf(“Entername&phonenumber:\n”);for(i=0;i<N;i++){gets(sp[i].name);gets(sp[i].num);}}voidgetsort(USER*sp){inti,j,k;USERtemp;for(i=0;i<N-1;i++)

第19页,共44页,2024年2月25日,星期天{k=i;for(j=i+1;j<N;j++)if(strcmp(sp[k].name,sp[j].name)>0)k=j;temp=sp[k];sp[k]=sp[i];sp[i]=temp;}}voidoutdata(USER*sp){inti;printf(“aftersort:\n”);for(i=0;i<N;i++)printf(“%s,%s\n”,sp[i].name,sp[i].num);}第20页,共44页,2024年2月25日,星期天14.3共用体有时需要将几个不同时出现的变量共享一个内存单元.如:将一个整型变量、实型变量、字符型变量共同放入同一个地址空间(当然这几个变量不能同时用),怎么办?C提供了共用体(联合体)类型支持。

14.3.1共用体类型union

共用体名{类型标识符成员名;类型标识符成员名;…………….};例uniondata{inti;charch;floatf;};类型定义不分配内存fchi100地址开始定义形式:第21页,共44页,2024年2月25日,星期天形式二:uniondata{inti;charch;floatf;}a,b;形式一:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;14.3.2共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在1、共用体变量的定义第22页,共44页,2024年2月25日,星期天2共用体变量引用引用方式:例a.i=1;a.ch=‘a’;a.f=1.5;printf(“%d”,a.i);(

编译通过,运行结果不对)

引用规则不能引用共用体变量,只能引用其成员共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;(

)

不能在定义共用体变量时初始化例union{inti;charch;floatf;}a={1,’a’,1.5};(

)

可以用一个共用体变量为另一个变量赋值例floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a’;a.f=1.5;b=a;(

)x=a.f;(

)第23页,共44页,2024年2月25日,星期天例将一个整数按字节输出0110000101000001低字节高字节0100000101100001ch[0]ch[1]运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}第24页,共44页,2024年2月25日,星期天结构体与共用体区别:存储方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在联系:两者可相互嵌套第25页,共44页,2024年2月25日,星期天例:结构体中嵌套共用体struct{intnum;charname[10];charsex;charjob;

union{intclass;charposition[10];}category;}person[2];第26页,共44页,2024年2月25日,星期天14.4

用typedef定义已知类型功能:为已有数据类型命名类型定义简单形式:typedef

typename;例typedefintINTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例typedeffloatREAL;类型定义后,与已有类型一样使用例INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与

define

不同

definetypedef预编译时处理编译时处理简单字符置换为已有类型命名

第27页,共44页,2024年2月25日,星期天14.5、结构体指针的使用

1.链表。

链表的建立、遍历、查找、插入、删除操作第28页,共44页,2024年2月25日,星期天链表什么是链表?链表:链表中的一个元素称为一个结点,每个结点由两部分组成:数据部分、指针。用指针把各个结点串联起来构成链表。分单向、双向链表.第29页,共44页,2024年2月25日,星期天链表为什么使用链表?1)不需要连续存储空间,可利用内存碎片;2)插入删除元素不需移动其它元素,处理速度快;3)动态分配存储空间,可以随意扩充表的容量。

链表结构体定义如下:void*malloc(unsignedsize)函数:如:structstudent{intnum;floatscore;structstudent*next;}*p1;p1=(structstudent*)malloc(sizeof(structstudent));第30页,共44页,2024年2月25日,星期天建立单链表的主要步骤为:

生成只含有头结点的空链表;然后读取数据信息,生成新结点,将数据存放于新结点中,插入新结点到单链表中重复第二步,直到输入结束。根据新结点插入到链表的位置的不同,建立链表的方式,分为在表尾插入的方法和在表头插入的方法。

第31页,共44页,2024年2月25日,星期天在链表中插入结点设指针变量s指向待插入结点,假设指定结点为p。插入到指定结点之后:①s

next=p

next;②p

next=s;

插入到指定结点之前:首先要找到p的前驱结点q。

例9.8

s->next=p;q->next=s第32页,共44页,2024年2月25日,星期天#include<stdio.h>#include<stdlib.h>structslist{intdata;structslist*next;};typedefstructslistSLIST;头结点987第33页,共44页,2024年2月25日,星期天SLIST*creat_slist(){intc;SLIST*head,*s,*r;/*r承上,s启下*/head=(SLIST*)malloc(sizeof(SLIST));r=head;scanf("%d",&c);while(c!=-1){s=(SLIST*)malloc(sizeof(SLIST));s->data=c;r->next=s;r=s;scanf("%d",&c);}r->next='\0';returnhead;}第34页,共44页,2024年2月25日,星期天voidprint(SLIST*head){SLIST*p;p=head->next;while(p!=NULL){printf("%d",p->data);p=p->next;}}main(){SLIST*head; printf("creatlianbiao\n");head=creat_slist(); print(head);

}第35页,共44页,2024年2月25日,星期天在链表中删除结点

在一个单链表中删除指定结点,首先要找到该结点的前驱结点,然后修改前驱结点的指针域指向待删结点的后继结点,然后释放被删结点。

q->=next=p->next第36页,共44页,2024年2月25日,星期天有以下程序:#include<stdio.h>main(){

structcmplx{intx;inty;}cnum[2]={1,3,2,7};printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);}以下程序的输出结果:6第37页,共44页,20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论