收藏 分享(赏)

第10章 结构体和链表.ppt

上传人:weiwoduzun 文档编号:5015880 上传时间:2019-01-30 格式:PPT 页数:47 大小:730KB
下载 相关 举报
第10章 结构体和链表.ppt_第1页
第1页 / 共47页
第10章 结构体和链表.ppt_第2页
第2页 / 共47页
第10章 结构体和链表.ppt_第3页
第3页 / 共47页
第10章 结构体和链表.ppt_第4页
第4页 / 共47页
第10章 结构体和链表.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、1,第十章 结构体与共用体,主讲:计算机应用教研室,本章内容:,10.1 结构体概述10.2 结构体类型的声明10.3 结构体变量的定义10.4 结构体变量的引用10.5 结构体变量的初始化10.6 结构体数组10.7 指向结构体类型的指针10.8 链表10.9 用typedef定义类型,10.1 结构体概述,结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体,例如: struct student int num;char name30;char sex;int age;int score; ;,10.2 结构体类型的声明,声明结构体类型的一般形式:,struct 结构体名 类型标

2、识符 成员名;类型标识符 成员名;. ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,例 struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型定义描述结构 的组织形式,不分配内存,结构体类型定义的作用域,10.3 结构体变量的定义,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 变量名表列;,1 先定义结构体类型,再定义结构体变量一般形式:,例 struct student int n

3、um;char name20;char sex;int age;float score;char addr30; struct student stu1,stu2;,2 定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,3 直接定义结构体变量 一般形式:,struct 类型标识符 成员名;类型标识符 成员名;. 变量名表列;,例 struc

4、t int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义 变量只能一次,说明: 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型的变量所占用的存储空间是它的各个成员所占用的存储空间的总和,10.4 结构体变量的引用,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,一般情况下,结构体变量不能整体引用,只能引用变量成员 引用方式: 结构体变量

5、名.成员名,10.4 结构体变量的初始化 形式一:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式二:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct student int num;char name2

6、0;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式三:,struct 类型标识符 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,例10.1 对结构变量初始化。,#include “stdio.h“ main() struct student int num;char nam

7、e20;char sex;float score;stu=102,“Zhang Ping“,M,78.5;printf(“Number=%dnName=%snSex=%cnScore=%fn“,stu.num,stu.name,stu.sex,stu.score); ,程序运行结果如下: Number=102 Name=Zhang Ping Sex=M Score=78.500000,若将程序中初始化部分改为: struct student ;stu=102,“Zhang Ping“;则程序运行结果如下: Number=102 Name=Zhang Ping Sex= Score=0.0000

8、00,如果成员仍然是结构体类型,初始化时按最低层的成员类型提供数据。例如:struct student int num;char name20;char sex;struct dateint month;int day;int year; birthday;int score; stu1=80351,“Li Hua“,“male“,12,23,1990,87;,10.6 结构体数组 10.6.1 结构体数组的定义,形式一: struct student int num;char name20;char sex;int age; struct student stu2;,形式二:struct s

9、tudent int num;char name20;char sex;int age;stu2;,形式三:struct int num;char name20;char sex;int age;stu2;,10.6.2 结构体数组初始化,例 struct int num;char name20;char sex;int age;stu =,;,struct student int num;char name20;char sex;int age; struct student stu3=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,

10、F,19;,例 struct student int num;char name20;char sex;int age;stu =,;,10.6.3 结构体数组元素的引用,引用方式:结构体数组名下标.成员名,例10.2 用结构体数组存储4位学生的信息,包括姓名、学号和成绩。按学号从小到大的顺序从键盘输入学生的信息,再按成绩从高到低的顺序输出各学生的全部信息。,#include “stdio.h“ #include “string.h“ main() struct studentint num;char name20; float score;stu4,t;int i,j,k;printf(“请

11、输入四个学生的学号、姓名和成绩:n“);for(i=0;i4;i+)scanf(“%d%s%f“,for(i=0;istuj.score) k=j;if(i!=k)t=stui;stui=stuk;stuk=t; printf(“按成绩由低到高的顺序输出四个学生的学号、姓名和成绩:n“);for(i=0;i4;i+)printf(“%-5d%-10s%-5.2fn“,stui.num,stui.name,stui.score); ,10.7 指向结构体类型的指针10.7.1 指向结构体变量的指针 1 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,

12、2 使用结构体指针变量引用成员形式,例 int n;int *p= n=10,struct student stu1; struct student *p= (*p).num=101,存放结构体变量在内存的起始地址,例10.3 指向结构体变量的指针的应用。,#include “stdio.h“ #include “string.h“ main() struct studentint num;char name20;char sex;float score;图10.4 指向结构体变量的指针;struct student stu;struct student *p;p= ,10.7.2指向结构体数

13、组的指针,例10.3 指向结构体数组的指针的应用,struct student int num;char name20;char sex;int 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.6.3 用指向结构体的指针作函数参数,1结构体变量的成

14、员作为函数参数,【例10.5】结构体变量的成员作为函数参数。#include “stdio.h“#include “string.h“struct STU char name10; int num; void f(char *name, int num) struct STU s2=“SunDan“,20044,“Penghua“,20045;num=s0.num;strcpy(name,s0.name); main() struct STU s2=“YangSan“,20041,“LiSiGuo“,20042,*p;p= ,程序运行结果为: SunDan 20042,例10.6 用结构体变量

15、作函数参数,struct data int a, b, c; ; main() void func(struct data);struct data arg;arg.a=27; arg.b=3; arg.c=arg.a+arg.b;printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c);printf(“Call Func()n“);func(arg);printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); void func(struct data parm) printf(“pa

16、rm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c);printf(“Process.n“);parm.a=18; parm.b=5; parm.c=parm.a*parm.b;printf(“parm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c);printf(“Return.n“); ,例10.7 用结构体变量作为函数参数。,#include “stdio.h“ #include “string.h“ struct student char name9;char sex; float sc

17、ore2; ; struct student f(struct student a) struct student b=“Zhao“,m,85.0,90.0;int i; strcpy(a.name,b.name); a.sex=b.sex; for(i=0;i2;i+)a.scorei=b.scorei; return a; void main() struct student c=“Qian“,f,95.0,92.0,d; d=f(c); printf(“%s,%c,%2.0f,%2.0fn“,d.name,d.sex,d.score0,d.score1); ,例10.8 用结构体指针变量

18、作函数参数,struct data int a, b, c; ; main() void func(struct data *parm);struct data arg;arg.a=27; arg.b=3; arg.c=arg.a+arg.b;printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c);printf(“Call Func()n“);func( ,例10.9 结构体变量的地址作为函数参数。,#include “stdio.h“ #include “string.h“ struct S int n; int a20; ; void

19、 f(struct S *p) int i,j,t;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(p-aip-aj) t=p-ai; p-ai=p-aj; p-aj=t; main() int i;struct S s=10,2,3,1,6,8,7,5,4,10,9;f( ,例10.10 用结构体数组名作为函数参数实参。,#include “stdio.h“ #include “string.h“ struct STU char name10; int num; float TotalScore; void f(struct STU *p) struct STU s2=

20、“SunDan“,20044,550,“Penghua“,20045,537, *q=s;+p;+q;*p=*q; main() struct STU s3=“YangSan“,20041,703,“LiSiGuo“,20042,580;f(s);printf(“%s %d %3.0fn“, s1.name, s1.num, s1.TotalScore); ,10.8 链表,10.8.1链表概述1.链表的含义 当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构,这种数据结构就称为链表。,2. 单链表的结构 (1)头指针变量hea

21、d指向链表的首结点。 (2)每个结点由2个域组成:1)数据域存储结点本身的信息。2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。 (4)链表数据结构的实现,必须利用指针变量。 (5)链表中的元素在内存中存放顺序不一定是连续的。,3 语言对链表结点的结构描述 在语言中,用结构体类型来描述结点链表结点的结构。 例如: struct student int num;float score;struct student *next; /*指针域,由next指针来连接各节点*/ ;,10.8.2 处理动态链表所需的函数1、malloc函数 (1)函数原型:

22、void *malloc(unsigned int size); (2)作用:在内存中动态的分配一个长度为size的连续空间。 2、calloc函数 (1)函数原型:void *calloc(unsigned n,unsigned size); (2)作用:在内存中分配n个长度为size的连续空间。 3、free函数 (1)函数原型:void free(void *p); (2)作用:释放由指针p指向的内存区域。,10.8.3 单链表,1 头插法建立单链表,struct student long num;int score;struct student *next; ; int n; stru

23、ct student *creat( ) struct student * head ,*p; printf(“输入各条记录,学号为0表示结束n“);n=0;head=NULL;p=( struct student *)malloc(sizeof(struct student);scanf(“%ld %d“, ,1 尾插法建立单链表,int n; struct student * creat( ) struct student * head,*tail;struct student *p; printf(“输入各条记录,学号为0表示结束n“); n=0;head=NULL; tail=head

24、; p=( struct student *)malloc(sizeof(struct student); scanf(“%ld %d“, ,2 输出链表 例10.12 编写输出链表函数。void print(struct student *head) struct student *p; if(head=NULL)printf(“There are no record“);elsep=head;printf(“There are %d records,they are:n “,n);do printf(“%10ld %10dn“,p-num,p-score);p=p-next;while(p

25、!=NULL); ,3 查找 例10.14 编写查找函数。struct student * search(struct student *head,long num) struct student *p=head; while(p!=NULL) if(p-num!=num)p=p-next;else break;return(p) ; ,4 对链表的插入操作 例10.16 编写插入函数,用来在单向动态链表中插入结点。 struct student * insert(struct student *head,struct student *s) struct student *p,*q1,*q2

26、;p=s; q1=head;if(head=NULL) head=p; p-next=NULL; else while(p-numq1-num) ,5 对单链表的删除操作 例10.17 编写删除结点的函数。 struct student * delete(struct student *head,long num) struct student *p1, *p2; if(head=NULL) printf(“list is null!“); return(head); p1=head;while(p1-num!=num) ,10.8.4 双向链表,struct stu int num;int

27、score;struct stu *next,*prior; ,图10.19 双链表结构示意图,1双向链表的建立,struct student *creat() struct student *head,*p;printf(“输入各条记录,学号为0表示结束n“);n=0; head=NULL;p=(struct student *)malloc(sizeof(struct student);scanf(“%ld %d“,2双向链表的插入操作,struct student *insert(struct student *head,struct student *s) struct student

28、 *q1,*q2;if(head=NULL) head=s;s-next=NULL;s-prior=NULL; else q1=head; while(s-numq1-num),3双向链表的删除操作,struct student *del(struct student *head,long num) struct student *p;if(head=NULL) printf(“list is null!“); return(head); p=head;while(p-num!=num),10.9 用typedef定义类型 功能:用自定义名字为已有数据类型命名 类型定义简单形式: typede

29、f type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c; REAL f1,f2;,说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同,define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名,typedef定义类型步骤 按定义变量方法先写出定义体 例如 int i; 将变量名换成新类型名 例如 int IN

30、TEGER; 最前面加typedef 例如 typedef int INTEGER; 用新类型名定义变量 例如 INTEGER i,j;,例 定义数组类型int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c;, int a100,b100,c100;,例 定义指针类型char *str; char *STRING; typedef char *STRING; STRING p,s10;, char *p; char *s10;,例 定义函数指针类型int (*p)(); int (*POWER)(); typedef int (*P

31、OWER)(); POWER p1,p2;, int (*p1)(),(*p2)();,例 定义结构体类型struct date int month;int day;int year;d;,例 定义结构体类型struct date int month;int day;int year;DATE;,例 定义结构体类型 typedef struct date int month;int day;int year;DATE;,例 定义结构体类型DATE birthday, *p;, struct date int month;int day;int year;birthday, *p;,类型定义可嵌套,例 typedef struct club char name20;int size;int year;GROUP;typedef GROUP *PG; PG pclub;, GROUP *pclub; struct club *pclub;,GROUP为结构体类型 PG为指向GROUP的指针类型,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报