版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章 结构体与共用体简单链表,例题1:某学生,姓名是Li,学号是9800,化学成绩是85。请编写程序输出这些数据。见程序: main() char name4=Li; int num=9800; int score=85; printf(%s,%d,%c,%f,name,num,sex,score); 如果有100个学生,则更麻烦 . TC允许我们定义自己的数据类型,以解决特定的实际问题。为了很好地解决例题1,我们可以定义一种叫struct student的数据类型。,结构体类型也是属于一种构造类型数据,它将不同类型的数据项组织成一个组合项,这些组合项中的数据项是互相联系的。 定义一个结构
2、体类型的一般形式: struct 结构体名 成员表列; 例如:对于一名学生,有如下不同类型的属性: 学号、姓名、年龄、性别、成绩、地址等。 要表示一个学生的六个方面不同类型的有关数据,就可以定义一个结构体类型。,11.1 结构体类型概述,struct student int num; char name10; char sex; int age; float score; char addr30; ; 其中:struct是关键字,表示结构体类型。student是结构体类型名, struct student和标准类型名(int、float)一样可以用作定义变量的类型。花括号内是结构体中的各个成员
3、,每个成员都应进行类型说明。,11.1 结构体类型概述,结构体名相当float,int,分号不能少,成员表列,一、先定义结构体类型,再定义变量名 例如:struct student int num; char name10; char sex; int age; float score; char addr30; ; struct student student1,student2; 上面的student1和student2是struct student类型的变量,它们具有struct student 类型的结构。 定义结构体变量后,系统为变量分配内存单元。可用sizeof(student1)
4、来计student1和student2各占49个字节。,11.2 定义结构体类型变量的方法,二、在定义结构体类型的同时定义变量 例如:struct student int num; char name10; char sex; int age; float score; char addr30; student1,student2;,11.2 定义结构体类型变量的方法,三、直接定义结构体类型变量(不写类型名) 例如: struct int num; char name10; char sex; int age; float score; char addr30; student1,studen
5、t2;,11.2 定义结构体类型变量的方法,说明: 1. 定义类型与定义变量是不同的,在编译时对类型不分配空间,只对变量分配存储空间。 2. 只能对变量赋值、存取或运算,而对结构体类型不可以。 3. 对结构体中的成员可以单独使用,它的作用和地位相当于普通变量。 4.可以用sizeof运算符测一个类型数据的长度。 n= sizeof(struct student)或 n=sizeof(student1) n=sizeof(int) n=sizeof(float),11.2 定义结构体类型变量的方法,5. 成员也可以是结构体变量。,struct student int num; char name
6、20; char sex; int age; struct date birthday; char addr30; student1,student2;,struct date int month; int day; int year; ;,一个结构体类型的变量不能作为一个整体进行输入和输出,只能对结构体变量中的各个成员进行输入、输出和运算。 scanf(“%d,%s,%c,%d,%f,%s”,11.3 结构体类型变量的引用,引用方式:结构体变量名.成员名 例如:scanf(“%d”,若结构体类型嵌套一个结构体类型,则采用逐级访问的方法,只能对最低级的成员进行访问。 student1.birt
7、hday.year 访问结构体变量student1的成员出生年份。而不能用student1.birthday访问birthday。 结构体变量的成员可以和普通变量一样进行各种运算 student2.score=student1.score; student1.age+; +student1.age;,例如: struct student long int num; char name20; char sex; char addr20; a=89031,Li Lin,M,123 Beijing Road; Printf(“%ld,%s,%c,%sn”,a.num,,a.sex,a.a
8、ddr);,11.4 结构体类型变量的初始化,结构体数组中的每个元素都是一个结构体类型的数据,它们都分别包括各个成员项。 例如:要表示3名学生的学号、姓名和成绩。 struct student int num; char name 20; float score ; ; struct student stu3=1000,“li ming”,70, 1001,“wang fan”,80, 1002,“zhang yan”,65.5 ;,11.5 结构体数组,程序举例:有四个学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者的姓名和成绩。S11_ex1.c main() struct stud
9、ent int num; char name20; int score; ; struct student stu4; int i,k=0, max; printf(请按行输入学生的记录: n);,11.5 结构体数组,for(i=0;imax) max=stui.score; k=i; printf(n最高成绩为:n); printf( ” No.:%dnname:%snscore:%dn” , stuk.num,,stuk. score); ,11.5 结构体数组,11.6.1 指向结构体变量的指针 一个结构体变量的指针就是该变量所占据的内存空间的起始地址,可以设一个指针
10、变量指向一个结构体变量。 例如:struct student int num; char name20; int score; stu; struct student *p=,11.6 指向结构体类型数据的指针,如果要表示stu变量中的num成员项 可写成下面三种形式: 1. stu.num 2. (*p).num 3. p-num,11.6 指向结构体类型数据的指针,10.6.2 指向结构体数组的指针 对结构体数组也可以用指针变量来指向。 例如:已知三名学生的有关数据,现全部输出。s11_4.c struct student int num; char name10; char sex; i
11、nt age; stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20; main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age); ,10.3 共用体,union student int num; float score; ; union student b; b.num=1;b.score=2; sizeof(b) 为4,struct student int num; float score; ; struct student a; a.num=1;a
12、.score=2; sizeof(a) 为6,a,b,num,score,num,score,11.8.1 共用体类型的定义和变量的定义方式 使几个不同的变量共占同一段内存单元的结构,称为 “共用体”类型的结构。它也是一种构造类型的数据。 共用体类型的定义形式: union 共用体名 成员表列; ; 例如: union data int i; char ch; float f; ; union data a,b,c;,11.8 共 用 体,定义形式也可以: union data int i; char ch; float f; a ,b,c;,11.8.2 共用体变量的引用方式 不能直接引用共
13、用体变量本身 scanf(“%d”, 而应引用共用体变量的成员。 例如: a.i a.ch a.f 11.8.3 共用体类型数据的特点 1. 共用体与结构体的不同:结构体变量所占内存长度为各成员所占内存长度之和;而共用体变量所占内存长度为最长的成员的长度,所有的成员共用同一段内存,同一时刻只有一个成员起作用。,11.8 共 用 体,2. 共用体变量的地址和它的各成员项的地址是同一地址。如: 则当前共用体变量中,只有a.f是有效的。,11.8 共 用 体,#include union un int i; char c2; main() union un x; x.c0=10; x.c1=1; p
14、rintf(n%d,x.i);,266,思考题1:求下面程序的输出结果 。 main() union time long i; int k5; char c; ; struct date int cat; union time cow; double dog; dt ; union time max; printf(%dn,sizeof(dt)+sizeof(max); ,说明:sizeof ( )是求类型长度的运算符,即在内存中所占的字节数。,20+10=30,思考题2:求下面程序的输出结果 。 struct ks int a; int *b; s4,*p; main() int n=1,i
15、; printf(n); for(i=0;ia,(p+)-a);,s0.a=1 s1.a=3 s2.a=5 s3.a=7,7,3 右结合,先观察链表示意图,后理解链表概念。,某3位同学的物理成绩分别为96,89,93。分别用数组和链表存储这些数据的示意图如下:,613 609 605 601,p,3个节点的链表:,3个元素的数组: float a3;,a,11.9简单链表,11.9.1 链表的概念,链表是一种动态数据结构,可以用来表示顺序访问的线性群体。 链表是由系列结点组成的,结点可以在运行时动态生成。 每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点
16、中只有一个指向后继结点的指针,则该链表称为单链表。 链表不要求逻辑上相邻的元素在物理位置上也相邻,在内存允许的范围内,占用空间大小不受限制,摒弃了数组的弱点。,11.9.2 数组与链表的比较,数组:仅能实现静态存储。,链表:可以实现动态存储。,链表的使用步骤:,建立链表 (使用 malloc 函数) 访问链表 (使用 *p 表达式) 释放链表 (使用 free 函数),p,1链表结构,(1)头指针变量head指向链表的首结点。 (2)每个结点由2个域组成: 1)数据域存储结点本身的信息。 2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志,链表结构的
17、定义,struct student char name10; struct student *next; ; next为struct student类型指针变量,指向下一个结点。 结点的变量或指针变量的定义: struct student node,*head; node可以存放一个学生结点 指针head可以存放学生结点的地址。,相关库函数,1. void *malloc(unsigned int size); 用途:在内存的动态存储区中分配一个size长度的连续存储空间。 返回值:返回一个指向分配域地址的指针(类型为void);若未成功,则返回空指针(NULL) 例如: int *p; p=
18、(int *)malloc(8); p指示系统分配的4个整型存储单元的起始地址 也可看成包含4个数组元素的p数组:p0,p1,p2,p3,2. void free(void *p); 用途:释放由指针变量p所指示的内存区域。 例如:free(p); 通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。,11.9.3 建立链表,尾插法建立单链表 特点:头指针固定不变,新产生的结点总是链接到链表的尾部。 操作步骤: (1)设head为链表头,last为链表尾结点, head=last=NULL; (2)生成新结点,由p指针指示,并将新结点的地址域 清空: p-next=NULL; (3)如果head为NULL,则 head=p; 否则 last-next=p; (4)last=p; (5)重复(2)(4),继续建立新结点。,#include stdio.h struct s int a; struct s *q; ; #define LEN sizeof(struct s),main() struct s *head,*p1,*p2;int m,i,n; for(i=1;ia=m; if(i=1) head=p1=p2; else p1-q=p2;p1=p2; if(i=3) p2-q=NULL; for(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高速公路交通安全管理监察员工作手册
- 企业人力资源面试策略研究
- 通信协议与网络技术研发人员面试全流程
- 高铁网络布局优化工程师面试攻略
- 网络运营服务数据管理的核心竞争力提升
- 我的英勇梦演讲稿英语
- 直销相信自己演讲稿
- 企业政策争取管理制度
- 2026年供应链管理原理与应用试题
- 2026年人工智能应用趋势解析试卷
- 【《财务共享模式下企业营运资金管理研究-以美的公司为例》10000字(论文)】
- 移动l1认证考试题库及答案
- DBJ-T 15-88-2022 建筑幕墙可靠性鉴定技术规程
- 湖南土地复垦管理办法
- 拉花的教学课件
- 2025年北京市乡村振兴协理员招聘考试(公共基础知识)历年参考题库含答案详解(5套)
- 弥漫性大B细胞淋巴瘤的治疗及护理
- 环保合规成本核算-洞察及研究
- 数据外包管理办法
- 绿化病虫害防治培训课件
- 硬皮病护理查房课件
评论
0/150
提交评论