c语言电子教案结构指针11

上传人:仙*** 文档编号:196222858 上传时间:2023-03-27 格式:PPT 页数:41 大小:351.50KB
收藏 版权申诉 举报 下载
c语言电子教案结构指针11_第1页
第1页 / 共41页
c语言电子教案结构指针11_第2页
第2页 / 共41页
c语言电子教案结构指针11_第3页
第3页 / 共41页
资源描述:

《c语言电子教案结构指针11》由会员分享,可在线阅读,更多相关《c语言电子教案结构指针11(41页珍藏版)》请在装配图网上搜索。

1、UNIX C编程编程yyyy-M-1age *第第11章章 结构体与共用体结构体与共用体知识点:知识点:结构体、共用体、枚举类型的定义、引用结构体、共用体、枚举类型的定义、引用用用typedef定义类型定义类型 结构体变量、数组、指针的使用结构体变量、数组、指针的使用利用结构体与指针处理链表利用结构体与指针处理链表 重点:重点:结构体、共用体的定义、引用结构体、共用体的定义、引用结构体变量、数组、指针的使用结构体变量、数组、指针的使用利用结构体与指针处理链表利用结构体与指针处理链表难点:难点:s利用结构体与指针处理链表利用结构体与指针处理链表UNIX C编程编程yyyy-M-2age *q 结

2、构体(结构体(struct)是一种构造数据类型(由基本数据类型派)是一种构造数据类型(由基本数据类型派生的)生的)q 可以将一些不同的数据类型组合在一起使用可以将一些不同的数据类型组合在一起使用q 是一种自定义的数据类型是一种自定义的数据类型11.1 结构体结构体UNIX C编程编程yyyy-M-3age *q 结构体类型定义结构体类型定义struct 结构体名结构体名 数据类型数据类型 成员名成员名1;数据类型数据类型 成员名成员名2;数据类型数据类型 成员名成员名n;11.1 结构体结构体struct是是关键字关键字,不能省略不能省略合法标识符可省合法标识符可省成员类型可以是基本型或构造型

3、成员类型可以是基本型或构造型注意不能忽略注意不能忽略;UNIX C编程编程yyyy-M-4age *v 例:例:structstudentint num;charname20;charsex;intage;floatscore;charaddr30;11.1 结构体结构体结构体类型定义描述结构结构体类型定义描述结构的组织形式的组织形式,不分配内存不分配内存UNIX C编程编程yyyy-M-5age *q 结构体变量的定义结构体变量的定义v 声明结构体类型后,定义变量声明结构体类型后,定义变量 struct 结构体名结构体名 类型标识符类型标识符 成员名成员名;类型类型标识符标识符 成员名成员名

4、;.;struct 结构体名结构体名 变量名表列变量名表列;11.1 结构体结构体struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;UNIX C编程编程yyyy-M-6age *v 声明类型的同时定义变量声明类型的同时定义变量 struct 结构体名结构体名 类型类型标识符标识符 成员名成员名;类型类型标识符标识符 成员名成员名;.变量名表列变量名表列;11.1 结构体结构体struct student int num;char name20;

5、char sex;int age;float score;char addr30;stu1,stu2;UNIX C编程编程yyyy-M-7age *v 直接定义结构体类型变量直接定义结构体类型变量 struct 类型标识符类型标识符 成员名成员名;类型标识符类型标识符 成员名成员名;.变量名表列变量名表列;11.1 结构体结构体struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;这种方式没有定义结构类型,这种方式没有定义结构类型,以后无法利用这一结构类型来定义以后无法利用这一结构类型来定义其

6、他的变量。实际应用不采用其他的变量。实际应用不采用UNIX C编程编程yyyy-M-8age *11.1 结构体结构体2Byte20Byte1Byte2Byte4Byte30Bytenumname20sexagescoreaddr30每个结构变量均占每个结构变量均占连续的连续的59ByteUNIX C编程编程yyyy-M-9age *v 结构体的嵌套结构体的嵌套结构体的成员也可以是结构体结构体的成员也可以是结构体11.1 结构体结构体例例struct date int month;int day;int year;struct studentint num;char name20;struct

7、 date birth;stu;numname20birthmonthdayyear也可也可struct studentint num;char name20;struct date int month;int day;int year;birth;stu;UNIX C编程编程yyyy-M-10age *q 结构体变量的引用结构体变量的引用v 一个结构体变量由若干个成员组成。一个结构体变量由若干个成员组成。v 结构体变量的引用是通过引用其成员的形式来实现的结构体变量的引用是通过引用其成员的形式来实现的 结构变量名结构变量名.结构成员名结构成员名 stu1.score,stu2.namev 每个

8、结构体成员都可当做一个变量来使用每个结构体成员都可当做一个变量来使用v 结构体变量的成员使用方法与普通内存变量一样。可以对结构体变量的成员使用方法与普通内存变量一样。可以对其赋值、参与运算或作为函数的参数。其赋值、参与运算或作为函数的参数。stu1.score=60;scanf(%f,&stu1.score);stu2=stu1;printf(“stu2.name=%sn”,stu2.name);stu.birth.day=20;11.1 结构体结构体UNIX C编程编程yyyy-M-11age *q 结构体变量的初始化结构体变量的初始化v 在定义结构体类型的同时定义结构体变量,并初始化在定义

9、结构体类型的同时定义结构体变量,并初始化11.1 结构体结构体例例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1=1,Mike,M,20,89,52 Xuefu Road;UNIX C编程编程yyyy-M-12age *v 先定义结构体类型,再定义结构体变量并初始化先定义结构体类型,再定义结构体变量并初始化11.1 结构体结构体例例 struct student int num;char name20;char sex;int age;float score;char addr3

10、0;;struct student stu1=1,Mike,M,20,89,52 Xuefu Road;struct student stru2=2,Ros,F,19,90,52 Xuefu Road;UNIX C编程编程yyyy-M-13age *q 结构体数组结构体数组v 数组的每个元素都是结构体类型的数据数组的每个元素都是结构体类型的数据v 定义结构体数组(与定义结构体变量一样,有三种形式)定义结构体数组(与定义结构体变量一样,有三种形式)11.1 结构体结构体例例 struct student int num;char name20;char sex;int age;float sco

11、re;char addr30;struct student stu3;numname20sexagescoreaddr30stu0stu1stu2177Byte UNIX C编程编程yyyy-M-14age *v 结构体数组的初始化结构体数组的初始化11.1 结构体结构体例例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu3=1,Mike,M,18,87.5,103 Beijing Road,2,John,M,19,99,130 Shanghai Roa

12、d,3,Rose,F,20,78.5,10 Zhongshan Road;例例 对候选人得票的统计程序。设有对候选人得票的统计程序。设有3个候选人,每次输入一个得个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。票的候选人的名字,要求最后输出各人得票结果。UNIX C编程编程yyyy-M-15age *q 指向结构体变量的指针指向结构体变量的指针v 定义形式定义形式 struct 结构体名结构体名 *结构体指针结构体指针名名;11.1 结构体结构体例例 struct student int num;char name20;char sex;int age;float scor

13、e;char addr30;struct student s,*p;p=&s;pnumname20sexagescoreaddr20sp-nump-namep-sexp-agep-scorep-addr引用成员引用成员(*p).num(*p).name(*p).sex(*p).age(*p).score(*p).addr引用成员引用成员s.nums.names.sexs.ages.scores.addr引用成员引用成员UNIX C编程编程yyyy-M-16age *q 指向结构体数组的指针指向结构体数组的指针11.1 结构体结构体numname20sexagescoreaddr30stu0st

14、u1stu2pstup+1p+2printf(%5d%-20s%2c%4dn,p-num,p-name,p-sex,p-age);UNIX C编程编程yyyy-M-17age *q 用结构体变量作函数参数用结构体变量作函数参数v 用结构体变量的成员作参数用结构体变量的成员作参数 与基本类型变量作为函数实参用法相同,与基本类型变量作为函数实参用法相同,传值方式传值方式v 用结构体变量作参数用结构体变量作参数 形参与实参都定义为同类型结构体变量形参与实参都定义为同类型结构体变量 实参把结构体变量的成员传递给形参对应的成员,是实参把结构体变量的成员传递给形参对应的成员,是传传值方式,值方式,多值传递

15、多值传递 例:有一个结构体变量例:有一个结构体变量stu,内含学生学号、姓名和,内含学生学号、姓名和3门课门课的成绩。要求在的成绩。要求在main函数中赋以值,在另一函数函数中赋以值,在另一函数print中将中将它们打印输出。今用结构体变量作函数参数。它们打印输出。今用结构体变量作函数参数。11.1 结构体结构体UNIX C编程编程yyyy-M-18age *q 用指向结构体的指针作为函数参数用指向结构体的指针作为函数参数v 结构体指针做函数参数,结构体指针做函数参数,传地址传地址11.1 结构体结构体v 结构体数组作函数参数结构体数组作函数参数 例:例:打印打印2名学生的名学生的3门成绩门成

16、绩UNIX C编程编程yyyy-M-19age *q链表是一种常见的数据结构,是可以动态地分配存储空间链表是一种常见的数据结构,是可以动态地分配存储空间的一种结构。的一种结构。q数组是一种静态地分配存储空间的方式数组是一种静态地分配存储空间的方式11.2用指针处理链表用指针处理链表head1249C10211475DNULL1021B14751356A13561249ABCDpq链表的构成:链表的构成:v 头指针,存放一个地址,指向链表的第一个元素头指针,存放一个地址,指向链表的第一个元素v 链表中每个元素称为一个链表中每个元素称为一个“结点结点”,每个结点包括两部,每个结点包括两部分:用户数

17、据和指向下一个结点的地址分:用户数据和指向下一个结点的地址v 最后一个元素称为最后一个元素称为“表尾表尾”,其地址为,其地址为NULL(空地址)(空地址)UNIX C编程编程yyyy-M-20age *#include struct node /*定义结点类型定义结点类型*/char data;/*数据域数据域*/struct node*next;/*指向下一个结点的指针域指向下一个结点的指针域*/a,b,c,d,*head,*p;11.2用指针处理链表用指针处理链表head?C?1475D?1021B?1356A?1249head=&a;a.next=&b;b.next=&c;c.next=

18、&d;d.next=NULL;p=head;headC1475DNULL1021B1356A1249pdo printf(%c-,p-data);p=p-next;while(p!=NULL);ppppNULL静态链表:静态链表:需要的节点事先建立需要的节点事先建立UNIX C编程编程yyyy-M-21age *q 动态链表动态链表v 所需函数所需函数11.2用指针处理链表用指针处理链表函数名函数名函数原型函数原型功能功能返回值返回值mallocvoid*malloc(unsigned size)分配分配size字节的字节的存储区存储区所分配的内存所分配的内存区起始地址区起始地址freevoi

19、d free(*p)释放释放p所指的内所指的内存区存区无无v 定义节点类型定义节点类型#define NULL 0 /*空地址空地址*/#define LEN sizeof(struct node)/*结点长度结点长度*/struct node int data;struct node*next;int n;/*表示结点个数表示结点个数*/UNIX C编程编程yyyy-M-22age *q 建立动态链表建立动态链表11.2用指针处理链表用指针处理链表struct node*creat(void)struct node*head,*p,*q;n=0;p=(struct node*)malloc(

20、LEN);scanf(“%d”,&p-data);head=NULL;while(p-num!=0)n+;if(n=1)head=p;/*头指针指向第一个结点头指针指向第一个结点*/else q-next=p;/*链入新结点链入新结点*/q=p;/*q指针总是指向链表的最后一个结点指针总是指向链表的最后一个结点*/p=(struct node*)malloc(LEN);scanf(“%d”,&p-data);q-next=NULL;/*处理尾结点的指针域处理尾结点的指针域*/return(head);1p headq1p3pqq3p5pqq5p0p main()struct node*head

21、;head=creat();UNIX C编程编程yyyy-M-23age *q 输出链表输出链表11.2用指针处理链表用指针处理链表void print(struct node*head)struct node*p;p=head;if(head!=NULL)do printf(%d,p-data);p=p-next;while(p!=NULL);main()struct node*head;head=creat();print(head);31phead5 ppppppNULLUNIX C编程编程yyyy-M-24age *q 链表的删除链表的删除(删除删除p p所指的结点所指的结点)11.2

22、用指针处理链表用指针处理链表31phead5 head=p-next;free(p);31qhead5 pq-next=p-next;free(p);53head pp1qhead5 UNIX C编程编程yyyy-M-25age *q 链表的插入(在链表的插入(在q q所指结点前插入新结点所指结点前插入新结点*s s)11.2用指针处理链表用指针处理链表31qhead5 0 s31qhead5 s=(struct node*)malloc(LEN);scanf(%d,&s-data);s-next=q;head=s;UNIX C编程编程yyyy-M-26age *11.2用指针处理链表用指针处

23、理链表31phead5 qs=(struct node*)malloc(LEN);scanf(%d,&s-data);s-next=q;p-next=s;s2UNIX C编程编程yyyy-M-27age *q 与结构体类似,共用体也是一种构造数据类型与结构体类似,共用体也是一种构造数据类型q 共用体中有多个成员共用体中有多个成员q 共用体中的多个成员共用一个存储空间共用体中的多个成员共用一个存储空间11.3共用体共用体q 共用体的定义共用体的定义 union 共用体名共用体名 类型标识符类型标识符 成员名成员名;类型标识符类型标识符 成员名成员名;.;UNIX C编程编程yyyy-M-28ag

24、e *11.3共用体共用体q共用体变量的定义共用体变量的定义(与结构体变量的定义一致与结构体变量的定义一致)v 可在定义共用体类型时直接定义共用体变量可在定义共用体类型时直接定义共用体变量v 不定义共用体类型直接定义共用体变量不定义共用体类型直接定义共用体变量v union 共用体名共用体名 共用体变量名共用体变量名;v 例:例:union data int i;char ch;float f;a;fchia共用体变量任何时刻共用体变量任何时刻只有只有一个成员一个成员存在存在UNIX C编程编程yyyy-M-29age *q 共用体变量的引用共用体变量的引用union data int i;c

25、har ch;float f;union data a,b,c,*p,d3;11.3共用体共用体v a.i a.ch a.fv p-i p-ch p-fv(*p).i (*p).ch (*p).fv d0.i d0.ch d0.fv 不能引用共用体变量,只能不能引用共用体变量,只能引用其成员引用其成员v 共用体变量中起作用的成员是共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员v 不能不能在定义共用体变量时在定义共用体变量时初始化初始化UNIX C编程编程yyyy-M-30age *例:例:设有若干个人员的数据,输入数据并输出。其中有学生设有若干个人员的数据,输入数据并输出。其中

26、有学生和教师。学生的数据中包括:姓名、号码、性别、职业、和教师。学生的数据中包括:姓名、号码、性别、职业、班班级级。教师的数据包括:姓名、号码、性别、职业、。教师的数据包括:姓名、号码、性别、职业、职务职务。11.3共用体共用体UNIX C编程编程yyyy-M-31age *q 枚举就是当变量只有几种可能值时,将变量的值一一列举枚举就是当变量只有几种可能值时,将变量的值一一列举出来,此时变量的取值只限于列出的值出来,此时变量的取值只限于列出的值q 如一周内的如一周内的Sun Sat,一年中的,一年中的Jan Dec等等 q 枚举类型、变量的定义枚举类型、变量的定义 enum 类型名类型名 枚举

27、值表枚举值表 变量名表变量名表;11.4枚举类型枚举类型UNIX C编程编程yyyy-M-32age *q 例:例:enum weekdaysun,mon,tue,wed,thu,fri,sat;v enum weekday workday,week_end;v workday和和week_end被定义为枚举变量,它们的值只被定义为枚举变量,它们的值只能是能是sun到到sat之一。例如:之一。例如:workday=mon;week_end=sun;q 说明说明:v 在在C编译中,对枚举元素按常量处理,故称枚举常量。编译中,对枚举元素按常量处理,故称枚举常量。不能对它们赋值。例如不能对它们赋值。

28、例如:sun=0;mon=1;是错误的是错误的。v 枚举元素作为常量,它们是有值的,枚举元素作为常量,它们是有值的,C语言编译按定义语言编译按定义时的顺序使它们的值为时的顺序使它们的值为0,1,2,。sun的值为的值为0,mon的值的值为为1sat为为6。如果有赋值语句。如果有赋值语句:workday=mon;workday变量的值为变量的值为1,可以输出。可以输出。11.4枚举类型枚举类型UNIX C编程编程yyyy-M-33age *v 可以改变枚举元素的值可以改变枚举元素的值如如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,satworkday;定义定

29、义sun为为7,mon=1,以后顺序加以后顺序加1,sat为为6。v 枚举值可以用来做判断比较枚举值可以用来做判断比较如如:if(workday=mon)if(workdaysun)枚举值的比较规则是按其在定义时的顺序号比较。枚举值的比较规则是按其在定义时的顺序号比较。v 一个整数不能直接赋给一个枚举变量一个整数不能直接赋给一个枚举变量如:如:workday=2;是不对的。它们属于不同的类型。应先是不对的。它们属于不同的类型。应先进行强制类型转换才能赋值。进行强制类型转换才能赋值。如:如:workday=(enum weekday)2;11.4枚举类型枚举类型UNIX C编程编程yyyy-M-

30、34age *例例 口袋中有红、黄、蓝、白、黑口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每种颜色的球若干个。每次从口袋中先后取出次从口袋中先后取出3个球,问得到个球,问得到3种不同色的球的可能取种不同色的球的可能取法,打印出每种排列的情况。法,打印出每种排列的情况。11.4枚举类型枚举类型UNIX C编程编程yyyy-M-35age *q typedef可以用来声明新的类型名来代替已有的类型名可以用来声明新的类型名来代替已有的类型名v 将系统已有的类型定义为新名将系统已有的类型定义为新名typedef int INTEGER;INTEGER i,j,k;/*相当于相当于int i,j,k;

31、*/v 可以声明数组类型、定符串类型可以声明数组类型、定符串类型typedef int ARRAY10;ARRAY a,b,c,d;/*相当于相当于int a10,b10,c10,d10;*/11.5用用typedef定义类型定义类型UNIX C编程编程yyyy-M-36age *将用户定义的类型定义一个新名将用户定义的类型定义一个新名typedef struct int month;int day;int year;DATE;DATE birthday,*p;/*birthday和和*p均为结构类型变量均为结构类型变量*/11.5用用typedef定义类型定义类型v 说明说明:typedef

32、 没有创造没有创造新数据类型新数据类型 typedef 是定义类型是定义类型,不能定义变量不能定义变量 typedef 与与 define 不同不同 define预编译时处理预编译时处理,简单字符置换简单字符置换 typedef编译时处理编译时处理,为已有类型命名为已有类型命名 UNIX C编程编程yyyy-M-37age *11.1 定义一个结构体变量定义一个结构体变量(包括年、月、日包括年、月、日)。计算该日在本。计算该日在本年中是第几天?注意闰年问题。年中是第几天?注意闰年问题。11.2 写一个函数写一个函数days,实现上面的计算。由主函数将年、,实现上面的计算。由主函数将年、月、日传

33、递给月、日传递给days函数,计算后将日子数传回主函数输出。函数,计算后将日子数传回主函数输出。11.3 编写一个函数编写一个函数print,打印一个学生的成绩数组,该数,打印一个学生的成绩数组,该数组中有组中有5个学生的数据记录,每个记录包括个学生的数据记录,每个记录包括num、name、score3,用主函数输入这些记录,用,用主函数输入这些记录,用print函数输出这些记函数输出这些记录。录。习题习题UNIX C编程编程yyyy-M-38age *11.4 在上题的基础上,编写一个函数在上题的基础上,编写一个函数input,用来输入,用来输入5个个学生的数据记录。学生的数据记录。11.5

34、 有有10个学生,每个学生的数据包括学号、姓名、个学生,每个学生的数据包括学号、姓名、3门课门课的成绩,从键盘输入的成绩,从键盘输入10个学生数据,要求打印出个学生数据,要求打印出3门课总平门课总平均成绩,以及最高分的学生的数据均成绩,以及最高分的学生的数据(包括学号、姓名、包括学号、姓名、3门课门课成绩、平均分数成绩、平均分数)。11.6 编写一个函数编写一个函数new,对,对n个字符开辟连续的存储空间,个字符开辟连续的存储空间,此函数应返回一个指针此函数应返回一个指针(地址地址),指向字符串开始的空间。,指向字符串开始的空间。new(n)表示分配表示分配n个字节的内存空间。见图个字节的内存

35、空间。见图11.29。习题习题UNIX C编程编程yyyy-M-39age *图图11.29习题习题UNIX C编程编程yyyy-M-40age *11.7 写一函数写一函数free,将上题用,将上题用new函数占的空间释放。函数占的空间释放。free(p)表示将表示将p(地址地址)指向的单元以后的内存段释放。指向的单元以后的内存段释放。11.8 已有已有a、b两个链表,每个链表中的结点包括学号、成两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。绩。要求把两个链表合并,按学号升序排列。11.9 有两个链表有两个链表a和和b,设结点中包含学号、姓名。从,设结点中包含学号、姓名。从a链表链表中删去与中删去与b链表中有相同学号的那些结点。链表中有相同学号的那些结点。习题习题UNIX C编程编程yyyy-M-41age *11.10 建立一个链表,每个结点包括:学号、姓名、性别、建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。此年龄,则将此结点删去。习题习题

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!