版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章结构与联合——构造类型二结构和联合的概念在数据中,经常有一些既有联系,类型又不同的数据,它们又需要一起处理。如:学生基本档案的数据字段:
学号
姓名
性别
地址
分数类型:
long
char
char
char
float
C语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型,即结构和联合。结构和联合的操作分为三个步骤:⑴根据需要定义结构或联合类型;⑵通过定义的类型说明变量、数组、指针;⑶引用变量、数组元素和指针指向的对象。7.1结构
⒈结构类型的定义格式:struct
结构名{type成员1;type成员2;…
type成员n;};结构标志。用标识符命名的结构类型名。结构类型中所含的成员项及其类型。struct
student
{longnum;charname[20];intage;charadd[30];floatscore;};结构的定义确定了如下两点:⑴定义结构类型,确定结构中的成员项的名称及类型。⑵指明该结构类型的变量在内存中的组织形式。⒉结构变量的说明定义结构只是确定该结构类型的名称及其成员项的组成及成员项的类型。必须由定义的结构类型说明结构变量,才开辟相应的内存空间以供使用。结构变量的说明方式:⑴定义后说明structstudent{longnum;charname[20];intage;charadd[30];floatscore;};structstudentwang,zhang,liu;用structstudent类型说明三个变量。⑵定义结构类型时说明变量wang,zhang,liu;⑶无名结构方式说明变量struct{longnum;charname[20];intage;charadd[30];floatscore;}wang,zhang,liu;说明:⑴注意类型和变量的区别。⑵成员项可单独使用。wang.age=20⑶结构的成员项也可以是结构变量。structdoc{charname[20];
structbirthage;floatsal;};structbirth{intyear;intmon;intday;};结构doc中的成员项是一个birth的结构变量!⒊结构变量的引用结构变量都是以成员项作为引用单位,引用方式:结构变量名.成员项名wang.score=100;说明:结构变量的成员项与普通变量有相同的性质。⒋结构体变量的初始化结构变量可以在说明时赋初值,称为初始化。staticstructstudent{
long
num;
char
*name;
char
sex[3]
;
int
age
;
float
score;
char
addr[30]
;
}wang={99010101,“王五”,“男”,20,90.5,“上海”};⒍结构指针概念:指向结构变量首地址的指针称为结构指针。结构指针加一,地址加一个结构变量所占的字节。结构指针的应用:⑴先说明结构指针
structstudent
*p,stu1;指向结构的指针。⑵指针指向同类型的结构变量或数组。p=&stu1;⑶通过指针引用指针指向变量的成员项,引用方式为:方式一:(*p).成员项名方式二:p->成员项名结构指针主要用于对结构数组操作。structstudoc{ intiNum;char*name; }*p,wang={2001,”wangli”};p=&wang;printf(“%d:%s”,p->iNum,p->name};举例:#include<stdio.h>structsam{intnum;charname[20];char*addr;}ws[]={{101,“fun”,“Shanghai”},{102,“tan”,“Bejing”},{103,“wang”,“Hefei”}};voidmain(void){inti;
structsam*pws;
pws=ws;
for(i=0;i<3;i++,pws++)printf(“%-9d%-14s%-20s\n”,
pws->num,pws->name,pws->addr);}定义结构,说明数组并初始化。说明结构指针。指针指向结构数组。通过指针引用成员项。chp7ex2⒎结构与函数参数当函数需要通过形参传递一个结构时,一般有两种处理办法:⑴传递一个结构指针(效率高)。#include<stdio.h>voidmprintp(structstudent*);structstudent{longnum;char*name;floatscore;};
voidmain(){structstudents1;s1.num=99010101;=“wanghai”;s1.score=99;
mprintp(
&s1);}
voidmprintp(structstudent*sp){printf(“%ld\n%s\n%5.1f\n”,sp->num,sp->name,sp->score);}指向结构的指针。⑵传递一个结构变量(效率低)。voidmprintp(structstudent);s1structstudentsvsv.num,,sv.score结构变量。⒏返回结构变量的函数当函数的返回值为一个结构变量时,称该函数为一个结构型函数。#include<stdio.h>structstu{longnum;charname[10];floatscore;};
structstusv(void);voidmain(void){
structstuws;
ws=
sv();
printf(“%ld\n%s\n:%f\n”,ws.num,,ws.score);}structstusv(void){structstustemp;gets()scanf(“%ld,%f”,&stemp.num,&stemp.score);
return(stemp);}chp7ex3⒐返回结构指针的函数当函数的返回值为一个结构指针时,称该函数为一个结构指针型函数。#include<stdio.h>struct
stu{longnum;char*name;floatscore;}
sa[]={99010101,“fun”,89,99010102,“zhang”,99,99010103,“wang”,78,0,0,0}structstu*findp(long);voidmain(){longlsanum;inti;
structstu*sap;
printf(“Enterthenumber:”);scanf(“%ld”,&lsanum);
sap=findp(lsanum);
if(sap->num!=NULL)printf(“%ld\n%s\n%f\n”,sap->num,sap->name,sap->score);elseprintf(“notfound\n”);}structstu*findp(longnumber){inti;for(i=0;sa[i].num!=0;i++)if(sa[i].num==number)break;return(&sa[i]);}思考题已知某班有6个人参加数学和物理竞赛的集训和课程考试,求:
①两门课程中的最高成绩,及对应的姓名、学号和课程编号。
②课程1,2的平均成绩,并求出两门课程都低于平均成绩的学生姓名和学号。
③对编号1的课程从高到低排序。(注意,其他成员项应保持对应关系)。说明:要求定义结构,第一成员项为学生姓名,第二成员项为学号,另外两个成员项为两门课成绩。①、②、③要求分别用函数完成。④检查某位同学两门课程成绩分别排第几名。7.2链表⒈引用自身的结构和链表的概念结构中的某个成员项,为指向该结构类型自身的指针,则称为引用自身的结构。structstudent{intnum;floatscore;char*name;
structstudent*next;
};指向自身的结构。相同类型的结构指针。链表是一种动态存储分配结构,通过指针相连,数据可以不连续存放。head结构变量NULL链表head2000H2000H2400H2400HNULLtail⒉内存分配函数链表的操作需要开辟内存单元以便插入或追加节点,删除节点后需要释放节点占用的内存单元。C语言提供了相应的函数。⑴malloc函数使用方法:
ptr=malloc(size);分配内存的字节数。返回空类型的指针。成功:返回内存的地址。失败:返回NULL。void*ptr;ptr=mallc(sizeof(int))ptr⑵voidfree(ptr)
作用:释放ptr指向的由malloc分配的内存空间。⒊链表的操作⑴建立链表步骤:①定义引用自身的结构。②说明指向结构的指针,head(头指针),tail(尾指针)。#iinclude<stdio.h>#include<alloc.h>structslist{charinfo;structslist*nextp;};voidmain(void){structslist*head,*tail,*find;charc,d;
head=tail=(structslist*)malloc(sizeof(structslist);head->nextp=NULL;InfonextpheadtailNULLwhile((c=getchar())!=‘\n’)tail=append(tail,c);⑵在尾部追加节点步骤:①为新节点分配内存。②建立新节点的成员项。③建立链接关系。structslist*append(structslist*ptr,charc){structslist*p;
p=(structslist*)malloc(sizeof(structslist));
p->info=c;
p->nextp=NULL;ptr->nextp=p;
return(p);}InfonextpheadtailNULLInfonextppNULLtail
tail
⑶删除节点函数infonextpinfonextpinfonextpvoidcdelete(structslist*pcdel){structslist*p;p=pcdel->nextp;pcdel->nextp=pcdel->nextp->nextp;free(p);}
p
思考题:编写一个函数,在当前指针位置插入节点。7.3联合(union)概念:不同数据类型的集合;每个成员项共用一段内存空间;某一时刻只能对一个“活的active”成员项操作;⒈联合类型的定义格式:union联合名{type成员项1;type成员项2;
…type成员项n;};unionexam{inta;floatb;charc;};⒉联合变量的说明和引用可以用联合类型说明:联合变量、联合数组、指向联合指针。unionexamx,*px,y[10];引用:引用变量的成员项。通过变量引用:变量名.成员项名通过指针引用:指针->成员项名⒊联合与结构的区别structexam{
inta;
floatb;
charc;}x;xabcunionexam{
inta;
floatb;
charc;}x;xbac结构变量的每个成员项有独立的内存单元,而联合变量的成员项以最大的成员项开辟单元后,所有成员项共用单元。sizeof(structexam)举例:#include<stdio.h>voidmain(void){
unionexam{inti;charch[2];
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省湘潭市2026-2027学年高二上学期第一次月考数学自编卷(范围:人教A版必修一、必修二、选必一1-2单元)(原卷版)
- 2026年09月26日 长沙市岳麓区高校测评中心 大众汽车 整车质检专员 17人
- 陕西宝鸡高新四小2025-2026五年级第二学期语文期末试卷(含答案)
- 江西省九江市2025-2026学年教科版五年级下学期期末教学质量评估科学试卷(有答案)
- 2026基层干部防灾减灾科普宣传课件
- VSD 负压引流技术临床应用与规范化护理流程
- 高速公路交能融合发展报告2026 -六大场景× 产业链图谱- 建设现状、关键挑战与破局路径
- 2026新学期幼儿园心理辅导教师工作经验分享课件-后进生转化策略与案例
- 湖南衡阳市常宁市培元中学2026-2027学年八年级上学期9月阶段检测道德与法治试题(含答案)
- 2025-2026年上海市部编版五年级科学第10课光的散射预测试题
- GB 1589-2026汽车、挂车及汽车列车外廓尺寸、轴荷及质量限值
- 2026年黑龙江省佳木斯市辅警考试试卷带答案
- 重庆出版社有限责任公司及下属企业社会招聘考试备考题库及答案详解
- 2026五上数学数学广角植树问题教案
- 小学数学分层作业设计课题研究计划
- 设备采购 投标方案(技术方案)
- 初中化学全册习题集锦
- 2023年公共营养师之二级营养师真题练习试卷A卷附答案
- 第四讲 坚持以人民为中心PPT习概论2023优化版教学课件
- 整车DTS测量规范
- 高考文言文阅读模拟训练:《宋史-辛弃疾列传》(附答案解析与译文)
评论
0/150
提交评论