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

下载本文档

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

文档简介

1、第十一章 结构体 1、用户定义类型(、用户定义类型(typedef)形式:形式: typedef 类型名类型名 标识符;标识符;例:typedef int zhengxing;解释:解释:1、typedef是用户定义类型的关键字 2、类型名:是在定义以前必须存在的数据类型(一般是c语言已经 规定好的数据类型) 3、用户定义类型的含义就是把已经存在的数据类型更改个名字, 更改后的数据类型的功能与原来的数据类型保持一致。列:Typedef int zhengMain() zheng a=8; printf(“%d”,a);第十一章 结构体Tpyedef 除了可以定义除了可以定义c语言已经存在的数据

2、类型外还可以再次定义我们语言已经存在的数据类型外还可以再次定义我们自己定义的数据类型。自己定义的数据类型。列:Typedef int zhengMain() typedef zheng b; b a=8; printf(“%d”,a);Typedef一般在程序开始时定义,而且它一般只用来定义一些比较不好记一般在程序开始时定义,而且它一般只用来定义一些比较不好记忆或太长的数据类型比如忆或太长的数据类型比如 unsinged int 、unsinged short int 等等。等等。第十一章 结构体 在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整

3、型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,语言中给出了另一种构造数据类型“结构”。 “结构结构”是一种构造类型,是一种构造类型,它是由若干“成员成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构那么在说明和使用之前必须先定义它,也就是构造它造它。如同在说明和调用函数之前要先定义函数一样。第十一章 结构体 2、结构的声名、结构的声名声明一个结构的一般形式为:

4、 struct 结构名结构名 成员表列成员表列 ;成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符 成员名; 成员名的命名应符合标识符的书写规定。例如: 第十一章 结构体 struct stuint num;char name20;char sex;float score; 解释:1、struct是结构体的关键字不可省略。 2、不可省略。 3、注意在结构体结束后要用“;”结束,不可省略 4、一个结构体中可以包含若干个成员,成员可以是变量、指针、 数组。第十一章 结构体 3、由结构结构体定义出对象、由结构结构体定义出对象当一个结构体已经

5、定义好后我们可以应用此结构体定义出对象。它一共有3种方式,3-1:声明时直接定义:声明时直接定义 struct student int age; char * sex; int height; zhang,* wang; 3-2:省略结构体名省略结构体名 struct int age; char * sex; int height; zhang,wang ; 第十一章 结构体3-3:使用使用typedef说明一个结构体类型名,再用新类型名来定义变量说明一个结构体类型名,再用新类型名来定义变量typedef struct int age; char * sex; int height; stud

6、ent ; student zhang;student * wang;3-4:先声明再定义:先声明再定义struct struct int age; char * sex; int height; student ; struct student zhang, * wang;第十一章 结构体4、结构体的赋值、结构体的赋值和一般的变量和数组一样,结构体也可以在定义时赋值。struct student int age; char * sex; int height; wang=15,”wang”,100; 结构体数组赋值结构体数组赋值struct student int age; char * s

7、ex; int height; people3=25,”wang”,100,25,”zhang”,120,24.”li”,140; 第十一章 结构体 在定义后再赋值在定义后再赋值 struct student int age; char * sex; int height; ;struct student wang;wang=10,”wang”,40; 结构体中的数组成员的赋值结构体中的数组成员的赋值 struct student int age; char * sex; int height3; wang=15,”wang”,100,120,130; 第十一章 结构体结构体中的结构体成员的赋

8、值结构体中的结构体成员的赋值 struct date int year; int mouth; int day; ;struct student int age; char * name; struct date brithday;wang=25,”wang”,1980,2,20;第十一章 结构体 5、使用结构体中的数据、使用结构体中的数据根据定义的对象不同我们可以使用根据定义的对象不同我们可以使用3种方式来使用结构体的数据种方式来使用结构体的数据(1)如果被定义的对象为普通类型)如果被定义的对象为普通类型 对象对象.结构体成员结构体成员(2)如果被定义的对象为指针类型)如果被定义的对象为指针

9、类型 对象对象-结构体成员结构体成员 (*对象)对象). 结构体成员结构体成员例:例:struct student char * name;int age;int height;wang,* wang1;wang1=&wang;wang.age=12;wang1-age=12;(*wang1).age=12;第十一章 结构体6、结构体举例、结构体举例1、制作结构student ,里面有2项分别存放学生的年龄和姓名,在程序中象年龄和姓名中输入数据,并显示。Struct student char * name; int age;main() struct student a1; scanf

10、(“%s”,); scanf(“%d”,&a1.age); printf(“student name( %s)n”,); printf(“student age(%d)”,a1.age); 第十一章 结构体 2、编写程序,把、编写程序,把5位学生的姓名,年龄,位学生的姓名,年龄,4项成绩以及平均成绩放在一个项成绩以及平均成绩放在一个结构体数组中,学生的姓名,年龄,结构体数组中,学生的姓名,年龄,4项成绩由键盘输入,平均成绩由程项成绩由键盘输入,平均成绩由程序自己计算。序自己计算。第十一章 结构体 函数之间结构体变量的数据传递函数之间结构体变量的数据传递1、传

11、递结构体的地址、传递结构体的地址typedef struct char s10; int t;st;getdata(st * p) scanf(“%s %d”,p-s,&p-t );main() st a; getdata(&a); printf(“%s,%dn”,a.s,a.t);第十一章 结构体 2、函数的返回值是结构体类型、函数的返回值是结构体类型typedef struct char a; int t;st;st fun(st x) x.a=99;x.b=s;,return x;main() st y; y.a=0;y.b=a; printf(“y.a=%d y.b=%

12、cn”,y.a,y.b); y=fun(y); printf(“y.a=%d y.b=%cn”,y.a,y.b);第十一章 结构体 3、通过函数的返回值返回指向结构体变量的指针、通过函数的返回值返回指向结构体变量的指针typedef struct char a; int t;st;st * fun(st * x) st * px ;(*x).a=99;(*x).b=s;px=x;,return px;main() st y, *p ; y.a=0;y.b=a; printf(“y.a=%d y.b=%cn”,y.a,y.b); p=fun(&y); printf(“(*p).a=%d

13、(*p).b=%cn”,(*p).a,p-b);第十一章 结构体 利用结构体变量构成链表利用结构体变量构成链表1、结构体中含有可以指向本结构体的成员、结构体中含有可以指向本结构体的成员当一个结构体中有一个或多个成员指向本结构体,则称当一个结构体中有一个或多个成员指向本结构体,则称 引用自身的结构引用自身的结构体。体。struct link char ch; struct link *p;a;由于由于p是一个指向是一个指向struct link类型的指针,因此类型的指针,因此a.p=&a是合法的是合法的a.cha.p第十一章 结构体 一个简单的链表一个简单的链表struct node i

14、nt data; struct node * next;typedef struct node NODETYPEmain() NODETYPE a,b,c,*h,*p; a.data=10;b.data=20;c.data=30; h=&a; a.next=&b; c.next=&c; c.next=0; p=h; while(p) printf(“%d”,p-data); p=p-next; printf(“n”);h=&aa.dataa.next=&bb.datab.next=&cc.datac.next=null第十一章 结构体 其中a b

15、 c称为结点,它们都是通过定义由系统在内存中开辟的固定的互不连续的存储单元。在程序运行过程中不可人为的,再生成新的存储单元也不可使开辟的存储单元消失。因此这种链表叫做“静态链表”,而我们经常使用的是动态链表。动态链表:动态链表:在c语言中使用数组有一定局限性,使用动态分配虽然可以随时开辟存储单元但,但动态存储的单元是不连续,用链表可以解决上述问题,链表中的结点除了可以存放数据外还可以存放一个指针,用此指针来指向下一个结点的地址,这样就可以把各结点连接起来,由于各存储单元都是动态分配的所以称此链表为 动态链表。注意:在动态链表中,每个结点元素都没有自己的名字,只能靠指针维系结点元素之间的连续关系

16、,一旦某个元素的指针断开,后续元素就无法找寻。第十一章 结构体 每个链表都有一个头结点,里面只存放一个头指针(head)。此指针里存放链表中的第一个结点地址。链表中最后一个结点指针中不存放任何地址只存放”0”值。标志敛表结束。以上链表每个结点都只有一个指针,存放下一个结点的地址,因此,链表只能从当前结点找到后续结点。故称单单项链表项链表建立带头结点的单项链表建立带头结点的单项链表步骤:读取数据,生成新结点,将数据存入结点的成员变量中,将新接点步骤:读取数据,生成新结点,将数据存入结点的成员变量中,将新接点插入掉链表。插入掉链表。例:编写函数例:编写函数 c_slist1,建立带有头结点的单项链

17、表,结点数据中的数值,建立带有头结点的单项链表,结点数据中的数值从键盘输入,以从键盘输入,以-1作为结束标志,链表的头结点的地址由函数值返回作为结束标志,链表的头结点的地址由函数值返回。struct slist int data; struct slist * next;typedef struct slist SLIST;第十一章 结构体 SLIST * c_slist() int c; SLIST *h,*s,*r; h=(SLIST*)malloc(sizeof(SLIST); r=h; scanf(“%d”,&c); whlie(c!=-1) s=(SLIST *)malloc

18、(sizeof(SLIST); s-data=c; r-next=s; r=s; scanf(“%d”,&c); r-next=0; return h;指针h用于存放头结点的地址。指针s用于用来指向新生成的结点指针r总是指向链表中的尾结点。生成头结点生成头结点读入数据读入数据未读到数据结束标志时进入循环未读到数据结束标志时进入循环生成一个新结点生成一个新结点读入的数据存放到新结点的读入的数据存放到新结点的data中中新结点连到表尾新结点连到表尾r指向当前表尾指向当前表尾读入数据读入数据设置表尾结束符设置表尾结束符返回表头指针。返回表头指针。第十一章 结构体 顺序访问链表中的各数据域顺序

19、访问链表中的各数据域利用一个工作指针从头到尾依次指向链表中的每个结点。利用一个工作指针从头到尾依次指向链表中的每个结点。Void print_slist SLIST * p; p=head-next; p指向头结点后的第一个结点指向头结点后的第一个结点 if(p=0) printf(“is null”) 链表为空时链表为空时 else printf(“head”); do printf(“%d”,p-data); 输出当前结点中的数据中的值输出当前结点中的数据中的值 p=p=next; p指向下一个结点指向下一个结点 while(p!=0); printf(“-endn”) 第十一章 结构体 共同体共同体共同体和结构体的类型说明和变量的定义完全相同,不用的是共同的里所共同体和结构体的类型说明和变量的定义完全相同,不用的是共同的里所有成员占用同一块存储空间。有成员占用同一块存储空间。格式:除了把关键字换成格式:除了把关键字换成union外其他与结构体相同。外其他与结构体相同。变量的定义与结构体相同也有变量的定义与结构体相同也有4种方式种方式例:例:union un1 int I;

温馨提示

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

评论

0/150

提交评论