快速学会数据结构中的指针和结构体_第1页
快速学会数据结构中的指针和结构体_第2页
快速学会数据结构中的指针和结构体_第3页
快速学会数据结构中的指针和结构体_第4页
快速学会数据结构中的指针和结构体_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

快速学会数据结构中的指针和结构体指针指针的定义声明一个指针变量给指针赋值指针的运算自定义数据类型基本数据类型数据类型结构类型基本数据类型有哪些?如何使用?问题一:学籍管理问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用C语言程序存储并处理一组学生的学籍。

单个学生学籍的数据结构学号(num):int型姓名(name):char[]型性别(sex):char型年龄(age):int型分数(score):float型单个学生学籍的数据结构如何定义?多个学生学籍的数据结构如何定义?解决办法定义一个结构体类型 当已有的类型满足不了需要时,C语言规定可以由用户自定义数据类型。structstudent{ intnum; charname[10]; charsex; intage; floatscore;};另一个例子定义一个结构体类型 日期类型structdate{ intmonth; intday; intyear;};定义一个结构体类型语法:

struct

结构体名称

{成员列表;

};定义一个时间类型Time,成员有时、分、秒。结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:

struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体的成员可以是一个结构变量结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];

structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点:每个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。不同的人,数据的值不同,但都有共同的成员组成。为将不同数据类型、但相互关联的一组数据,组合成一个有机整体使用,C语言提供一种称为“结构”的数据类型。结构体

也是构造类数据,但其成员可以是任何类型的。构造类型使用户可以象处理单个变量一样来处理复杂的数据结构。要在程序中使用结构必须:声明结构类型结构类型的声明描述该结构的成员名称和它们的数据类型。定义结构变量结构变量的定义是根据结构类型为所定义变量分配存储空间。9.3结构体变量的引用引用规则

结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用(只能对最低级的成员进行赋值或存取以及运算)成员(分量)运算符优先级:

1结合性:从左向右引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);(

)例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..(

)结构体变量的初始化形式一:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};

struct结构体名{

……

类型标识符成员名;

……};

/*struct结构体名合称“结构类型标识符”*//*成员表列*//*此处分号不能省略*/小结:什么是“结构体类型”?关键字用户指定用户自己定义的构造型数据类型;由若干数据项(成员)组成;同一结构体中的成员可以具有不同的数据类型;结构体类型变量占用的内存长度等于各成员项长度之和。使用结构体的一般步骤根据问题的要求定义一个结构体类型用自己定义的结构体类型定义结构体变量在程序中使用结构体变量处理问题注意成员定义与普通变量定义的区别:成员定义时——不为其分配内存变量定义时——为其分配内存main(){structstudent{intnumber;charname[6];charsex;intage;charaddress[20];};printf("%d\n",sizeof(structstudent));}结果:31main(){struct{charname[15];charclass[12];longnum;}stu={"Wenli","Computer1",200113};

printf("%s\n%s\n%ld\n",,stu.class,stu.num);}结果:WenliComputer1200113用结构体数组管理一组学生的信息前面单个学生可用结构体变量std1,std2处理若是一个班级的学生呢?解决办法:一组学生的数据,可以使用结构体数组进行处理。假定数组名为std,则定义student数组,可以使用下面的说明语句: structstudentstd[10];或者在定义结构体类型的同时定义结构体数组9.5结构体数组9.5.1定义结构体数组:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项定义结构体后定义structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu[3];定义结构体时同时定义structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu[3];9.5.2结构体数组的初始化结构数组[n]={{初值表1},{初值表2},...,{初值表n}};一般初始化省略维数[]定义后初始化一般初始化structstudent{intnum;charname[20];charsex;intage;floatscore;}stu[3]={{10101,"李宁",'M',18,87.5},{10102,"张凡",'M',19,99},{10103,"王敏",'F',20,78.5}};定义后初始化structstudent{intnum;charname[20];charsex;intage;floatscore;};structstudentstu[3]={{10101,"李宁",'M',18,87.5},{10102,"张凡",'M',19,99},{10103,"王敏",'F',20,78.5}};每个数组元素的初始数据都用花括号括起来。例2统计侯选人选票。有三个候选人,每次输入一个得票的候选人名,要求最后输出个人得票结果。structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];for(i=1;i<=10;i++){scanf("%s",leader_name);

for(j=0;j<3;j++)

if(strcmp(leader_name,leader[j].name)==0)

leader[j].count++;

}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang0009.6用指针访问结构体9.6.1指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例:structstudent*p;使用形式:使用结构体指针变量引用成员形式·

(*结构体指针名).成员名·

结构体指针名->成员名·

结构体变量名.成员名成员运算符.指向运算符->优先级:最高结合方向:从左向右(*)与->等价示例9main(){structstudent{longintnum;charname[20];charsex;floatscore;}stu,*p;//定义结构体变量stu和结构体指针变量pp=&stu;//p指向结构体stustu.num=89101;strcpy(,"LiLin");

p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",

(*p).num,p->name,stu.sex,p->score);}9.2指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)

printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+19.9类型定义(typedef)除可直接使用C提供的标准类型和自定义的类型(结构、共用、枚举)外,也可使用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。给已有的数据类型加一个新的别名——提高程序可读性(但未建立新的数据类型)。一般形式:typedef数据类型名新别名(已有定义)(习惯用大写)例typedeffloatREAL;REALa,b,c;typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。用法1、简单数据类型

typedeffloatREAL;REALa,b;=floata,b;2、数组

温馨提示

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

评论

0/150

提交评论