第9章 结构体_第1页
第9章 结构体_第2页
第9章 结构体_第3页
第9章 结构体_第4页
第9章 结构体_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、2022-2-29.1 9.1 结构体概念结构体概念9.2 9.2 结构数组结构数组9.3 9.3 结构体指针结构体指针* *9.4 9.4 单向单向链表链表如何定义结构体类型如何定义结构体类型理解结构体与数组、指针理解结构体与数组、指针和函数间的关系和函数间的关系结构体在程序中的结构体在程序中的应用应用2022-2-2关键字关键字合法标示符合法标示符struct student int number; char name10; char sex; int age; char address50; float score3; ; 成员成员把把不同类型不同类型的数据的数据组合成一个整体组合成一个

2、整体以分号结尾以分号结尾结构体是一种构造的(自定义)数据类型struct student stu1,stu2; /定义结构变量定义结构变量2022-2-2struct student int number; char name10; char sex; int age; char address50; float score3; ; struct date int year; int month; int day;struct date birth;成员的类型可以是成员的类型可以是基本基本类型类型也可以是也可以是构造类型构造类型2022-2-2struct student int number

3、; char name10; char sex; int age; char address50; float score3; ; struct student stu1,stu2; 定义了结构变量,才会定义了结构变量,才会为该变量为该变量分配内存。分配内存。结构类型结构类型定义仅描述了结构定义仅描述了结构的组织形式的组织形式, 并不分配内存并不分配内存address变量变量stu1的内存分配的内存分配情况:情况:22ff1f22ff10 numberage22ff14score22ff55namesex22ff1e22ff23nameaddressscorestruct date birth

4、;2022-2-2struct student int number; char name10; char sex; int age; char address50; float score3; ; struct student stu1; struct student int number; char name10; char sex; int age; char address50; float score3; stu1; struct int number; char name10; char sex; int age; char address50; float score3; stu

5、1; 结构定义的同时定义变量省略结构名称先定义结构,再定义变量无名结构体2022-2-2struct student2 char name10; int age; float score5,ave; zhang=zhangsan, 20,78,92,83,75,69; 变量变量zhang的的内存分配内存分配情况:情况:20*ageave7892837569namescorezhangsan在屏幕上输出该变量所有成员的值在屏幕上输出该变量所有成员的值printf(“”, zhang);printf(“%sn”, );printf(“%dn”, zhang.age);for(i

6、=0;i5;i+) printf(“%.1fn”, zhang.scorei);printf(“%.2fn”, zhang.ave);2022-2-2struct student2 char name10; int age; float score5,ave; li,zhang=zhangsan, 20,78,92,83,75,69;结构变量可以结构变量可以作为一个整体作为一个整体赋值给赋值给同类型同类型的结构变量,的结构变量,即把它各成员的值分别赋值即把它各成员的值分别赋值给同类型变量的相应成员。给同类型变量的相应成员。li=zhang;li=lisi, 21,80,75,89,65,82;

7、问:以上两种赋值语句正确吗?问:以上两种赋值语句正确吗?必须逐个数据赋值给相应的成员struct student li=“lisi”,20,80,75,89,65,82; 2022-2-28stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; printf(“%d,%s,%c,%d,%f,%sn”,stu1);if(stu1=stu2) struct student int num; char name20; char sex; int age; float score; char addr30;stu1, stu2; 结构变量的整体引用,结构变量的整体引用,只能用于只

8、能用于同类型同类型的的结构变量相互赋值。结构变量相互赋值。2022-2-2引用方式引用方式 结构结构变量名变量名. 成员成员名名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;stu1, stu2; 成员引用符成员引用符成员运算符“.”的优先级为最高。可以把“结构变量名.成员名”作为一个整体看待。其性质等同于:同类型的普通变量2022-2-2嵌套结

9、构中的成员引用嵌套结构中的成员引用 通过通过成员运算符成员运算符 “.” 逐级引用逐级引用,直到找到最低一级成员,直到找到最低一级成员。struct date int year,month,day; ;struct student4 char number8; char name10; struct date bir, rx; / bir、rx为为data类型类型li;li.bir.year=1998; / 表示表示li的出生年份为的出生年份为1998年年 li.rx.year=2016; / 表示表示li的入学年份为的入学年份为2016年年 2022-2-2#include main() s

10、truct a1 char c4,*s; s1=abc, def; struct a2 char *cp; struct a1 ss1; s2=ghi, jkl, mno; printf(%c,%cn, s1.c0, *s1.s); printf(%s,%sn, s1.c, s1.s); printf(%s,%sn, s2.cp, s2.ss1.s); printf(%s,%sn, +s2.cp, +s2.ss1.s);写出程序运行结果2022-2-2void main() struct comp s1,s2; double compare (struct comp, struct comp)

11、;/? scanf(%lf%lf%lf%lf,&s1.x, &s1.y,&s2.x, &s2.y); if (compare(s1,s2)=0) / 结构变量作为实参调用函数结构变量作为实参调用函数 printf(Equaln); else printf(Unequaln);double compare(struct comp a ,struct comp b)/函数定义函数定义 a.m=sqrt(a.x*a.x+a.y*a.y); b.m=sqrt(b.x*b.x+b.y*b.y); return (a.m-b.m); / 返回返回0表示相等;非表示相等;非0

12、表示不相等表示不相等传递数值传递数值a=s1;b=s2;struct comp double x,y; double m; ;2022-2-2? add( ?) ?例:求两个复数的和例:求两个复数的和void main() struct comp s1,s2,z; struct comp add(struct comp, struct comp); /函数声明函数声明 scanf(%lf%lf%lf%lf,&s1.x, &s1.y,&s2.x, &s2.y); z=add(s1,s2); / 调用函数求复数调用函数求复数s1、s2之和之和 printf(%.2f

13、%+.2fin,z.x,z.y);struct comp add(struct comp a ,struct comp b) struct comp c; c.x=a.x+b.x; c.y=a.y+b.y; return c ; 2022-2-2void fun( int *a, int n) int i; for(i=0; in-1; i+) ai+=i; void main() int i; struct st s=10,2,3,1,6,8,7,5,4,10,9; fun(s.a, s.n); for(i=0; inum=12注意:成员运算符“.”优先于间接引用间接引用运算符运算符“*”若

14、写成*结构指针名结构指针名.成员名成员名,则等价于*(结构指针名结构指针名.成员名成员名)2022-2-2struct s int a; float b; char *c;main() struct s x=19, 83.5, zhang; struct s *px=&x; printf(%d,%.1f,%sn, x.a, x.b, x.c); printf(%d,%.1f,%sn, px-a, (*px).b, px-c); printf(%c,%sn, *px-c, &px-c1); printf(%d,%dn, px-a+, +px-a); printf(“%dn”, x

15、.a);问题:阅读程序,写出结果问题:阅读程序,写出结果+(px-a)(px-a)+-的优先级的优先级高于高于+,所以所以+的运算的运算对象是对象是 px-a 在在C中为了直观与使用方便,中为了直观与使用方便, 通常通常用用 p-num 来代替来代替 (*p).num2022-2-2struct aa int a; int *p;void main() int x=1, y=2, z=3; struct aa s=4, &x, 5, &y, 6, &z; struct aa *q=s+1; printf(%dn, *(q-p);A. 1 B. 2 C. 3 D. 420

16、22-2-2#includestruct man char name20; int age; person3=Anna, 18, David, 25, Mary, 20;void main() struct man *p,*q; int old=0; q=p=person; for( ; (1) ; p+) if(old age) (2) ; old=p-age; printf(年龄最大的是年龄最大的是%s, 年龄是年龄是%dn, (3) );程序功能:现有程序功能:现有3 3人的姓名和年龄,人的姓名和年龄,输出输出3 3人中最年长者的姓名和年龄人中最年长者的姓名和年龄。pname, q-ag

17、e2022-2-2struct data int a, b, c; ;void func(struct data *parm) parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(1: %d, %d, %dn,parm-a,parm-b,parm-c);main() struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“2: %d, %d, %dn, arg.a,arg.b,arg.c); func(&arg); printf(“3: %d, %d, %dn, arg

18、.a,arg.b,arg.c);arga :27b: 3c :30(main)a :18b: 5c :90(func) parm&arg传递结构变量的地址传递结构变量的地址2022-2-2例例:编写:编写复数的排序复数的排序函数函数( (按复数模排序)。按复数模排序)。void main() int i; struct comp a6; /定义结构数组定义结构数组 void sort(struct comp *, int); /声明声明sort函数函数 for(i=0;i6;i+) scanf(“%lf%lf”,&ai.x,&ai.y); /输入实部虚部输入实部虚部 a

19、i.m=sqrt(ai.x*ai.x+ai.y*ai.y);/计算计算复数模复数模 sort(a,N); / 调用排序函数调用排序函数 for(i=0;iN;i+) printf(%.1f%+.1fi,ai.x,ai.y); void sort(struct comp *pa, int n) int i,j,k; struct comp temp; for(i=0;in-1;i+) k=i; for(j=i+1;jm(pa+j)-m) / pa+k为指向为指向pak的指的指针针 k=j; temp=*(pa+i); *(pa+i)=*(pa+k); *(pa+k)=temp; struct c

20、omp double x,y; double m; ;2022-2-2链表的链表的概念概念:若干个数据组若干个数据组(节(节点点)按按一定的规则一定的规则连接起来连接起来。【连接原则连接原则】前一个结点指向下一个结点,只有通前一个结点指向下一个结点,只有通过前一个结点才能找到下一个结点过前一个结点才能找到下一个结点0 x22a124head0 x22ff10 0 x22ff10数据数据A0 x22a124数据数据B0 x22a4f0数据数据C0 x22a4f00 x2f51a40 x2f51a4数据数据DNULL链表中有一个链表中有一个头指针头指针变量变量(headhead),它,它仅仅存放存

21、放一个一个地址地址,该该地址指向一地址指向一个个节节点点每个每个节节点点都应包含两部分:数据都应包含两部分:数据部分、指向下一结点的地址部分、指向下一结点的地址最后一最后一个个节节点点称为表尾称为表尾,地址部分地址部分为为NULLNULL(表示(表示空地址空地址)链表中各元素在内存中可以链表中各元素在内存中可以不连续不连续存放存放。2022-2-2链表链表元素元素定义的一般形式为定义的一般形式为:struct 结构类型名结构类型名 结构结构成员定义成员定义; struct 结构结构类型名类型名 *变量名;变量名;0 x22a1240 x22ff10 0 x22ff10数据数据A0 x22a12

22、4数据数据B0 x22a4f0数据数据C0 x22a4f00 x2f51a40 x2f51a4数据数据DNULL数据部分数据部分指向指向下下一一节节点的点的指针指针2022-2-2设计设计一个链表,每一个节点可以存放一个链表,每一个节点可以存放学生姓名学生姓名及及成绩成绩,则其结构数据类型如下:,则其结构数据类型如下: struct student char name10; float score; struct student *next; ; 只是只是定义了一个数据类型定义了一个数据类型, ,并未实际分配并未实际分配存储空间存储空间。 链表结构是动态分配存储的,即在使用时才开辟一个结点链表

23、结构是动态分配存储的,即在使用时才开辟一个结点的的存储单元存储单元。2022-2-2mallocmalloc函数:函数:void * malloc(unsigned int size在内存的动态存储区中分配一个长度为在内存的动态存储区中分配一个长度为size的连续的连续空间,函数的返回值为分配到空间的起始地址空间,函数的返回值为分配到空间的起始地址。例例: char *x; / 此时此时x的指向不确定的指向不确定x=(char *)malloc(10); /x指向了包含指向了包含10个字符单元的存储空间个字符单元的存储空间2022-2-2calloccalloc函数:函数:void * cal

24、loc(unsigned int num,unsigned int size)在内存的动态存储区中分配在内存的动态存储区中分配n个长度为个长度为size的连续空的连续空间,函数返回分配间,函数返回分配区区间的起始地址间的起始地址。例例: float *p; p = (float*)calloc(10,sizeof(float); /p指向了包含指向了包含10个个float类型类型单元的存储空间单元的存储空间2022-2-2freefree函数:函数:void free(void *p)释放释放p所指向的内存空间,使得系统可将该内存区分所指向的内存空间,使得系统可将该内存区分配给其他变量使用配给

25、其他变量使用。2022-2-2建立链表建立链表:从无到有:从无到有地建立起一个链表,即一个一个地建立起一个链表,即一个一个地输入地输入各各节节点点数据,并建立起前后相链的关系。数据,并建立起前后相链的关系。例:例:struct student char name10; float score; student *next; *head, *pnew, *ptail;1)建立建立头节点头节点head = (struct student*)malloc(sizeof(struct student); pnew = head; scanf (“%s%d”, head-name, &head-

26、score);数据数据 ?headpnew2022-2-22)在在现有链表中添加现有链表中添加新新节点节点:pnew = (struct student*)malloc(sizeof(struct student);scanf (%s%f, pnew-name, &pnew-score);新数据新数据 ?pnew3)与与上上一一节节点点链接:链接:ptail-next=pnew; ptail=pnew;数据数据数据数据数据数据 ?headptail新数据新数据 ?pnew数据数据数据数据数据数据headptail新数据新数据 ?4)将将末末节节点点指向下指向下一一节节点点的成员赋值为的

27、成员赋值为NULL。ptail-next=NULL; NULL2022-2-2定义创建链表函数定义创建链表函数createcreate,建立一个有,建立一个有n n个节点的单向个节点的单向链表链表。struct student *create(int n) struct student *head,*pnew,*ptail; int i; pnew=(struct student *)malloc(sizeof(struct student); scanf(%s%f,pnew-name,&pnew-score); head=ptail=pnew; / 建立头节点建立头节点 for(i=1;iname,&pnew-score); ptail-next=pnew; ptail=pnew; ptail-next=NULL; return head; /返回链表头指针返回链表头指针2022-2-2从从链表的头指针出发,访问链表的每一链表的头指针出发,访问链表的每一个个节点节点。数据数据数据数据数据数据head数据数据 NULLp/定义定义遍历链表函数遍历链表函数printprint,输出链表的,输出链表的所有所有节点节点信息信息。void print(struct student *head) struct student

温馨提示

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

评论

0/150

提交评论