版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
结构体与共用体要点
一、概述
结构体(structure)是一种数据类型,它把互相联系的数据组合成
一个整体。
把不同类型的数据组合成一个有机的整体,可以用结构体解决。
结构体中的每一项数据,称为结构体“成员”(member)或“分量”。
声明结构体类型的一般形式:struct结构体名
{成员表列};
声明各成员的形式:类型名成员名;
例如:学生数据structstudent
{intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];
);注意不要忽略最后的分号
student结构体类型占59个字节。
二、定义结构体类型变量的方法
1.先声明结构体类型再定义变量名
structstudentstudentl,student2;要求指定为某一特定的结
构体类型
2.在声明类型的同时定义变量
struct结构体名
{成员表列
}变量名表列;
例如:structstudent
{intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];
}studentl,student!;
3.直接定义结构体类型变量
struct
{成员表列
}变量名表列;
几点说明:
(1)类型与变量是不同的概念;
(2)结构体中的成员可单独使用,其作用与地位相当于普
通变量;
(3)成员也可以是一个结构体变量;
(4)成员名与普通变量名相同,不代表同一对象。
三、结构体变量的引用
(1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进
行输入和输出。
printf("%d,%s,%c,%d,%f,%s\n”,studentl);错误
(2)引用成员的方式:结构体变量名.成员名
studentl.num=10010;
当成员是另一个结构体变■时,应一级一级地引用成员。
仅在以下两种情况下,可以把结构体变量作为一个整体来访问。
(1)结构体变量整体赋值
例、student!=studentl;
(2)取结构体变量地址
例、printf(''%x",&studentl);/*输出studentl的地址*/
四、结构体变量的初始化
structstudent
{longintnum;/*学号*/
charname[20];/*姓名*/
charsex;/*性别*/
charaddr[20];/*地址7
}a={89031,HLiLin;M',T23BeijingRoad”};
注意:不能在结构体内赋初值。
例、下面程序错误
structstudent
{longintnum=89031;目
charname[20]="LiLin11;^
charsex='M';⑼
H,,
charaddr[30]=123BejingRoad;I5l
}a;
五、结构体数组
每个数组元素都是一个结构体类型数据
1.定义结构体数组
和定义结构体变量的方法相仿(三种方法)
2.结构体数组的初始化
在定义数组的后面加上:={初始表列};
structstudent
{intnum;
charname|20];
charsex;
intage;
floatscore;
charaddr[30);
}stu[3]={{10101JLiLin”,18,87.5,H103Bejing
Road”},
{10102,nZhangFunM;M\19,99,”130Shanghai
Roaadn},
{10104,nWangMin”,20,78.5,”1010Zhongshan
Road”});
六、指向结构体类型数据的指针
结构体变量的指针:就是该变量所占据的内存段的起始地址。
1.指向结构体变量的指针
(*p).num表示:p指向的结构体变量中的成员num
成员运算符优先于运算符,不能写成*p.num=*(p.num)
三种表示形式:
(1)构体变量名.成员名
(2)(*p).成员名该方式用得很少
(3)p->成员名
2.指向结构体数组的指针
注意:
(1)p=stu;,则p++指向
(2)运算符优先于“++”运算符
++p->num:使p所指向的num成员值加1
(++p)->num:先使p+L然后得到它指向的元素中的num成员值
例:有4个学生,每个学生包括学号、姓名和成绩。要求找出成绩
最高者的姓名和成绩。
include-stdio.h”
voidmain()
{structstudent
{intnum;/*学号*/
charname[20];/*姓名*/
floatscore;/*成绩*/
);
structstudentstu[4];/*4个学生7
structstudent*p;
inti;
inttemp=0;/*成绩最高学生在数组中的序号,0~37
floatmax;/*最高成绩*/
for(i=0;i<4;i++)/*输入4个学生的学号、姓名、成绩*/
scanf(H%d%s%f,&stu[i].num,stu[i].name,&stu[i].score);
for(max=stu[0].score,i=1;i<4;i++)/*stu[0]已赋给max*/
{if(stu[i].score>max)
(
max=stu[i].score;
temp=i;
)
}
p=stu+temp;/*p指向成绩最高的学生结构*/
printf(,f\nThemaximumscore:\n,1);
printf(HNo.:%d\nname:%s\nscore:%4.1f\nH,
p->num,p->name,p->score);
)
3、结构体变指向结构体的指针均可作为函数参数
例:有一个结构体变量stu,内含学生学号、姓名和三门课程的成
绩。要求在main中赋以值,在函数print中打印输出。
#include"stdio.h”
#include"string/
#defineformatH%d\n%s\n%An%f\n%f\n"
structstudent
{intnum;/*学号7
charname[20];/*姓名*/
floatscore[3];/*三门课程的成绩*/
);
voidprint(structstudent*p);/*print函数原型声明*/
voidmain()
{structstudentstu;
stu.num=12345;
strcpy(,nLiLi”);
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.6;
print(&stu);〃如果stu是结构体数组,则不要&符号7
)
voidprint(structstudent*p)/*print函数定义*/
{printf(format,p->num,p->name,p->score[0],p->score[1],
p->score[2]);
printfCn”);
)
⑴结构体的成员作函数的参数。
与普通变■作函数参数的用法相同。值传送,不能修改实
参的值。
(2)结构体指针作函数的参数。
将结构体的地址传送给函数效率高,可以修改实参的值。
⑶结构体作函数的参数。
将结构体的全部成员值传送给函数,效率低,不能修改实
参的值。
例:
#include<string.h>
structSTU
{charname[10];
intnum;
);
voidf(char*name,intnum)
{structSTU
sPl^rSunDan",2004},rPenghua",20045}};
num=s[0].num;
strcpy(name,s[O].name);
)
main()
{structSTU
s[2]={{,YangSan,,,20041},{,,LiSiGuo,,,20042}}*p;
p=&s[1];
f(p・>namep>mjm);前一个参数的地址,后一个是数值
printf(H%s%d\nH,p->name,p->num);
getch();
)
运行结果:SunDan20042前一个随子函数变化,后一
个不变仍是主函数中的值。
七、用指针处理链表(一定要学会画图)
1.链表概述
链表:动态地进行存储分配的一种结构,它动态地进行存储
分配。
数组:存放不同班级的学生数据,数组定得足够大,浪费内
存。
数组必须事先定义固定的长度(元素个数),不能适应数据
动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;
当数据减少时,造成内存浪费。
链表动态地进行存储分配,可以适应数据动态地增减的情况,
且可以方便地插入、删除数据项。(数组中插入、删除数据项时,
需要移动其它数据项)。
链表有单向链表、双向链表、环形链表等形式。
结点:链表中的每一个元素,包括两部分
①用户需要的实际数据
②下一个结点的地址
head--»|A|•+-|B|•+一|C|•+-DNULL
head指向第一个元素,第一个元素又指向第二个元素,…直到最
后一个元素,该元素不再指向其它元素。
表尾:地址部分放一个“NULL”(表示空地址)
※结点应为结构体类型,一个结点中应包含一个指针变量,用它
存放下一个结点的地址。
例:structstudent
{intnum;
floatscore;
structstudentnext;/*next指向structstudent类型数据*/
};
student链表
2.简单链表
所有结点都是在程序中定义的,不是临时开辟的,是“静态链表”
3.处理动态链表所需的函数
(1)malloc(size)
作用:在内存的动态存储区中。
函数返回值:该分配域的起始地址。不成功,则返回NULLo
(2)calloc(n9size)
分配n个长度为size的连续空间
(3)free(p)
释放由p指向的内存区。函数无返回值。
4.建立动态链表
即从无到有,一个一个地开辟结点和输入各结点数据,并建
立起前后相链的关系。
例、写一函数建立一个有3名学生数据的单向动态链表
过程:开辟单元一输入数据一加入链表
head:头指针
pl、p2:工作指针,p2跟着pl向后走
sizeof:求字节运算符
(structstudent*):返回的指针转换为指向structstudent类型数据
的指针。
5.输出链表
一般从链表首部依次输出。
6.对链表的删除操作
删去结点,即是把它从链表中分离出来即可。
(1)删除头结点
(2)删除中后结点
7.对链表的插入操作
将一个结点按指定次序,插入到一个已有的链表中
(1)头部
(2)中部
(3)后部
例:
(1)下列程序用来从键盘上读入一行字符,并按输入顺序建立一
个“反式”链表。即读入的第1个字符存入尾结点,读入的第2个字
符存入倒数第2个结点,依此类推,读入的最后一个字符存入头结点。
读入完成后,按链表输出这一行字符,最后释放全部结点空间。
例如:读入abed,建立的链表如下图
head-----|d|>-|-^[Tp^->|b|<-||a|0|
最后输出的一行字符为dcba
SdefineNULL0
SdefineLENsizeof(structnode)
#include“stdio.h"
structnode
{charinfo;structnode*next;}
mainO
{structnode*head,*p;
charc;
head二NULL;
while((c=getchar())!=’\n)
{p=(structnode*)malloc(LEN);
p->info=c;
p->next=head;
head=p;}
while(head!=NULL)
{p=head;
head=head->next或p->next;
putchar(p->info);
free(p);/*释放一个结点*/}
(2)建立一条链,链中的数据按从小到大的顺序排列.
ttinclude<stdio.h>
structnode
{intdata;structnode*next;};
structnode*addx(structnode*head,intx)
{structnode*p,*pl,*p2;
p=(structnode*)malloc(sizeof(structnode));
p->data=x;
if(head二NULL)
{head=p;p->next=NULL;return(head);}
if(head->data>=p->data)
{(p->next=head);head=p;return(head);}
pl=head;p2=pl->next;
if(p2==NULL)
{pl->next=p;p->next=NULL;return(head);}
while(p2->next!=NULL&&(p2->data<p->data))
{pl=(p2);p2=p2->next;}
if(p2->data<p->data)
{p2->next=p;p->next=NULL;}
else
{(p->next=p2);pl->next=p;}
return(head);}
mainO
{structnode*head;
inti,x;
head=NULL;
for(i=0;i<5;i++)
{printf(^Xnlnput%2dthnumberI77,i);
scanf&x);
head=addx(head,x);}
while(head!=NULL)
{printf("\n%d",head->data);head=head->next;}
)
八、共用体
1.共用体的概念
几种不同类型的变量共占同一段内存单元(同一地址开始)。
共用体变量定义的一般形式:
struct共用体名
{成员表列
}变量表列;
与结构体一样可以有三种定义形式。
例如:un
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏淮安市淮阴师范学院部分教师岗招聘4人备考题库附参考答案详解(预热题)
- 2026上半年广东广州市越秀区教育局招聘事业编制教师83人备考题库及答案详解(各地真题)
- 2026新疆喀什昆仑建设有限公司招聘3人备考题库及参考答案详解(轻巧夺冠)
- bh-换热站施工方案(3篇)
- 企业明渠施工方案(3篇)
- 2026年上半年长信保险经纪(四川)有限公司第二批人员招聘1人备考题库及参考答案详解(模拟题)
- 华为高管日常管理制度(3篇)
- 地名石施工方案(3篇)
- 学校严格落实日常管理制度(3篇)
- 2026江苏盐城市射阳县教育局下属事业单位赴高校招聘教师17人备考题库含答案详解ab卷
- 2026内蒙古环投集团社会招聘17人考试参考试题及答案解析
- GB/T 4343.2-2026家用电器、电动工具和类似器具的电磁兼容要求第2部分:抗扰度
- 2026年扬州市广陵区事业单位公开招聘工作人员37人笔试参考题库及答案解析
- 2026上半年北京事业单位统考大兴区招聘137人备考题库(第一批)新版附答案详解
- 2026年南宁教师编制考试试题及答案
- 广东省化工(危险化学品)企业安全隐患排查指导手册(工业气体生产经营企业专篇)
- 校医院内部财务管理制度
- 2025年智能家居安防服务协议
- 2026年兰考三农职业学院单招职业适应性测试题库附答案详解(黄金题型)
- 多病原体整合监测工作方案(2025版)
- 施工管理措施方案
评论
0/150
提交评论