结构体共用体和用户定义的类型

上传人:枫** 文档编号:584827705 上传时间:2024-09-01 格式:PPT 页数:43 大小:492KB
返回 下载 相关 举报
结构体共用体和用户定义的类型_第1页
第1页 / 共43页
结构体共用体和用户定义的类型_第2页
第2页 / 共43页
结构体共用体和用户定义的类型_第3页
第3页 / 共43页
结构体共用体和用户定义的类型_第4页
第4页 / 共43页
结构体共用体和用户定义的类型_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《结构体共用体和用户定义的类型》由会员分享,可在线阅读,更多相关《结构体共用体和用户定义的类型(43页珍藏版)》请在金锄头文库上搜索。

1、C C语言程序设计语言程序设计 第第1414章章 结构体、共用体和用户定义的类型结构体、共用体和用户定义的类型 结构体:是一种自定义 的 构造数据类型。用途:把不同类型的数据组合成一个整体。struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体14.1 结构体类型定义:例 struct student int num; char name20; char sex; int age; float score; char addr30; ; namenu

2、msexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式,不分配内存结构体类型的定义例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 14.1.2 结构体变量1、结构体变量的定义(1)、先定义结构体类型,再定义结构体变量v一般形式: struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构

3、体名 变量名表列;变量名表列;(2)、定义结构体类型的同时定义结构体变量一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列;变量名表列;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; (3)、无名结构体定义一般形式:struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列;变量名表列;例 struct int num; c

4、har name20; char sex; int age; float score; char addr30; stu1,stu2; 用无名结构体无名结构体直接定义几点说明v结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同l类型类型:不分配内存;不分配内存; 变量变量:分配内存分配内存l类型类型:不能赋值、存取、运算不能赋值、存取、运算; 变量变量:可以可以v结构体成员名与程序中变量名地位相同结构体成员名与程序中变量名地位相同v结构体可嵌套例 struct date int month; int day; int year; ; struct student int num; c

5、har name20; struct date birthday; stu;numnamebirthdaymonthdayyear例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear 2、结构体变量的初始化 和其他类型的变量相同,在定义结构体变量时赋初值形式一:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名

6、 结构体变量结构体变量=初始数据初始数据;例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;形式二:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .结构体变量结构体变量=初始数据初始数据;例 struct student int num; char name20; char sex; int age; char ad

7、dr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三:struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .结构体变量结构体变量=初始数据初始数据;例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 3 结构体变量的引用引用规则v 结构体变量不能整体引用,只能引用变量成员v可以将一个结构体变量赋值给另一个结构体变量v结构体嵌套时逐级

8、引用成员成员(分量分量)运算符运算符优先级优先级: 1结合性结合性:从左向右从左向右引用方式: 结构体变量名.成员名例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student int num; char name20; char sex; int age; float score; char addr30; s

9、tu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ( )stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ( )例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;

10、numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ( )指针引用结构体变量中数据指针变量名-成员名(*指针变量名).成员名struct student char name12; char sex; struct date birthday; float sc4;std,arr5,*ps; ps=&std; 引用结构体变量std中

11、的sex成员,可写作: std.sex ps-sex (*ps).sex14.1.3 结构体数组1、结构体数组的定义和初始化 定义:三种形式:形式一: struct student int num; char name20; char sex; int age; ;struct student stu2;形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumnamesex

12、agestu0stu125B初始化:与其他类型的数组赋初值的方法相同例 struct int num; char name20; char sex; int age; stu =,;顺序初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 分元素初始化: struct student int num; char name20; char sex; int age;

13、;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化时维数可省2、结构体数组引用引用方式: 结构体数组名下标.成员名stu1.age+; struct student int num; char name20; char sex; int age; str3;strcpy(stu0.name,”ZhaoDa”);numnamesexagenumnamesexagestu0stu125B14.2 14.2 向函数传递结构体型数据向函数传递结构体型数据 1.1.向函数传递结构体

14、变量的成员向函数传递结构体变量的成员 普普通通变变量量作作函函数数的的实实参参的的用用法法相相同同,形形参参与与实实参参之之间间仍仍然然是是“值传递值传递”的方式。的方式。2.2.向函数传递结构体变量向函数传递结构体变量 ANSI ANSI C C允允许许函函数数之之间间传传递递结结构构体体变变量量。若若实实参参是是结结构构体变量,那么体变量,那么形参形参也应是同类型的结构体变量。也应是同类型的结构体变量。3.3.向函数传递结构体数组名向函数传递结构体数组名若实参是结构体若实参是结构体数组名数组名,那么形参也应是同类型的结构体变,那么形参也应是同类型的结构体变量。量。#include type

15、def stuct int num; double mark; REC; void sub1(REC x)x.num=23;x.mark=81.5; void sub2(REC y)y0.num=12;y0.mark=77.5;main() REC a=16,90.0, b=16,90.0; sub1(a); printf(“A)%d,%5.1lfn”,a.num,a.mark); sub2(b); printf(“B)%d,%5.1lfn”,b0.num,b0.mark);结果: 16, 90.0 12,77.5读入五位用户的姓名和电话号码读入五位用户的姓名和电话号码,按姓名字典顺按姓名字典

16、顺序排序后序排序后,输出用户的姓名和电话号码输出用户的姓名和电话号码.#include #include #define N 5typedef struct char name20; char num10; USER;void getdata(USER *sp); void getsort(USER *sp); void outdata(USER *sp);main() USER spN; getdata(sp); getsort(sp); outdata(sp);void getdata(USER *sp) int i; printf(“Enter name & phone number:n

17、”); for(i=0;iN;i+) gets(spi.name); gets(spi.num);void getsort(USER *sp) int i,j,k; USER temp;for(i=0;iN-1;i+) k=i; for(j=i+1;j0) k=j; temp=spk; spk=spi;spi=temp;void outdata(USER *sp) int i; printf(“after sort:n”); for(i=0;i成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名union data int i; char ch; fl

18、oat f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.fl共用体变量中起作用的成员是最后一次存放的成员例 union int i; char ch; float f; a; a=1; () l不能在定义共用体变量时初始化例 union int i; char ch; float f; a=1,a,1.5; () l可以用一个共用体变量为另一个变量赋值例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a

19、; a.f=1.5; b=a; () x=a.f; ()例 将一个整数按字节输出01100001 01000001低字节高字节0100000101100001ch0ch1运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1);结构体与共用体v区别: 存储方式不同struct node char ch2; in

20、t k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在v联系: 两者可相互嵌套例: 结构体中嵌套共用体 struct int num; char name10; char sex; char job; union int class; char position10; category;person2;14.4 用typedef 定义已知类型功能:为已有数据类型命名类型定义简单形式: typedef type name;例 typedef int INTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例 t

21、ypedef float REAL;类型定义后,与已有类型一样使用例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同 define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名 14.5、结构体指针的使用1.链表。链表的建立、遍历、查找、插入、删除操作链表链表 什么是链表?链表链表链表链表:链表中的一链表中的一链表中的一链表中的一个元素个元素个元素个元素称为一个称为一个称为一个称为一个结点

22、结点结点结点, ,每个结点由每个结点由每个结点由每个结点由两部分组两部分组两部分组两部分组成成成成:数据部分、指针数据部分、指针数据部分、指针数据部分、指针。用。用。用。用指针指针指针指针把各个结点串联起来构成把各个结点串联起来构成把各个结点串联起来构成把各个结点串联起来构成链表链表链表链表。分单向、双向链表分单向、双向链表分单向、双向链表分单向、双向链表. .链表链表为什么使用链表?1)不需要不需要连续存储空间,可利用内存碎片;连续存储空间,可利用内存碎片;2)插入删除插入删除元素不需移动其它元素,处理速度快;元素不需移动其它元素,处理速度快;3)动态分配动态分配存储空间,可以随意扩充表的容

23、量。存储空间,可以随意扩充表的容量。 链表结构体定义如下:链表结构体定义如下:链表结构体定义如下:链表结构体定义如下:void *void *malloc(unsignedmalloc(unsigned size) size)函数函数函数函数:如:如:如:如: structstruct student student intint num; num; float score; float score; structstruct student *next;*p1; student *next;*p1;p1=(p1=(structstruct student *) student *)mallo

24、c(sizeof(structmalloc(sizeof(struct student); student);建立单链表的主要步骤为: 生成只含有头结点的空链表;生成只含有头结点的空链表; 然然后后读读取取数数据据信信息息,生生成成新新结结点点,将将数数据据存存放放于于新新结点中,结点中, 插入新结点到单链表中插入新结点到单链表中 重复第二步,直到输入结束。重复第二步,直到输入结束。 根根据据新新结结点点插插入入到到链链表表的的位位置置的的不不同同,建建立立链链表表的方式,的方式,分为在表尾插入的方法和在表头插入的方法。分为在表尾插入的方法和在表头插入的方法。 在链表中插入结点 设指针变量s指

25、向待插入结点,假设指定结点为p。 插入到指定结点之后: snext=pnext; pnext=s; 插入到指定结点之前:首先要找到p的前驱结点q。 例9.8 s-next=p; q-next=s#include #include struct slist int data; struct slist *next;typedef struct slist SLIST;头结点头结点987SLIST *creat_slist() int c; SLIST *head, *s,*r; /* r承上,s启下 */ head=(SLIST *)malloc(sizeof(SLIST); r=head; s

26、canf(%d,&c); while(c!=-1)s=(SLIST *)malloc(sizeof(SLIST); s-data=c; r-next=s; r=s; scanf(%d,&c);r-next=0;return head;void print(SLIST *head)SLIST *p; p=head-next; while(p!=NULL) printf(%d ,p-data); p=p-next; main() SLIST *head;printf(creat lian biaon); head=creat_slist();print(head); 在链表中删除结点 在一个单链表

27、中删除指定结点,首先要找到该结点的前驱结点,然后修改前驱结点的指针域指向待删结点的后继结点,然后释放被删结点。 q-=next=p-next有以下程序:#include main() struct cmplxint x;int y; cnum2=1,3,2,7; printf(“%dn”,cnum0.y/cnum0.x*cnum1.x);以下程序的输出结果:6有以下程序 :struct st int n; struct st *next;struct st a3, *p;a0.n=5;a0.next=&a1;a1.next=&a2; a2.n=9; a2.next=0;p=&a0;则以下表达式

28、是6的是:A p+-n B p-n+ C +(*p).n D +p-n答案:D记住:+p-n成员值增等价+(p-n). (+p)-n 指针增(在访问之前)(p+)-n p+-n 指针增(在访问之后)有以下程序(若long型和int型数据均占4个字节);#include Typedef union long x2;int y4; char z8;MYTYPE;MYTYPE them;main() printf(“%dn”,sizeof(them);16若以建立如图所示链表:则不能将s所指的节点插入到链表尾的是:headdata nextpsGF0EA s-next=NULL; p=p-next;

29、p-next=s;B p=p-next;s-next=p-next;p-next=s;C p=p-next;s-next=p; p-next=s;D p=(*p).next; (*s).next=(*p).next; (*p).next=s;答案:C以下函数creat用来建立一个带头节点单向链表,新产生的结点总是插在链尾,单向链表的头指针作为函数返回请填空#include #include struct list char data; struct list *next; struct list *creat() struct list *h,*p,*q; char ch; h=_(1)malloc(sizeof(_(2); p=q=h;ch=getchar();While(ch!=?)p=_(3)malloc(sizeof(_(4);p-data=ch; q-next=p; q=p;ch=getchar(); p-next=0;_(5);(1)(struct list *) (2)struct list (3)(struct list *) (4)struct list(5) return h;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号