《结构体与共用体链表课件.ppt》由会员分享,可在线阅读,更多相关《结构体与共用体链表课件.ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、结构体与共用体链表第1页,此课件共56页哦内容提要内容提要结构体类型的定义结构体类型的定义结构体类型变量结构体类型变量结构体类型数组结构体类型数组结构体类型指针结构体类型指针结构体与函数结构体与函数链表链表第2页,此课件共56页哦 11.1 概述概述n问题定义:问题定义:有时需要将不同类型的数据组合成一个有机有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:的整体,以便于引用。如:一个学生有学号一个学生有学号/姓名姓名/性别性别/年龄年龄/地址等属性地址等属性 int num;char name20;char sex;int age;char addr30;应当把它们组织成一个组合
2、项,在一个组合应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)项中包含若干个类型不同(当然也可以相同)的数据项。的数据项。图图11-111-1100101 Li Fun M 18 Beijing Num name sex age addr第3页,此课件共56页哦结构体类型的定义结构体类型的定义结构体结构体结构体是一种构造数据类型结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体用途:把不同类型的数据组合成一个整体-自定义数据类自定义数据类型型结构体类型定义结构体类型定义struct 结构体名结构体名 类型标识符类型标识符 成员名成员名1;类型标识符类型标
3、识符 成员名成员名2;.;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体第4页,此课件共56页哦结构体类型的定义结构体类型的定义定义结构体类型,描述下列数据定义结构体类型,描述下列数据 (1)(1)学生情况学生情况:包含学生的学号、包含学生的学号、姓名、姓名、性别、性别、年龄、年龄、C C语言课程成绩语言课程成绩:struct studentint no;/*学号学号*/char name10;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float score;/*C成绩成绩*/;注:注:;不能省不能省结构体类型定义描
4、述结构的组织形式,不分配内存第5页,此课件共56页哦如考虑如考虑1010门课程成绩,门课程成绩,加上总成绩与平均成加上总成绩与平均成绩,可作如下定义绩,可作如下定义:struct studentint no;/*学号学号*/char name10;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float score10;/*10门课程成绩门课程成绩*/float tcj,acj;/*总成绩,总成绩,平均成绩平均成绩*/;第6页,此课件共56页哦定义结构体类型,描述下列数据定义结构体类型,描述下列数据 (2)(2)个人数据个人数据:包含姓名、性别、年龄、身高、
5、体重、住址包含姓名、性别、年龄、身高、体重、住址:struct personchar name20;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float height;/*身高身高*/float weight;/*体重体重*/char addr50;/*住址住址*/;第7页,此课件共56页哦(3)(3)日期结构体类型包括年、日期结构体类型包括年、月、日月、日:struct dateint year;/*年年*/month;/*月月*/day;/*日日*/;(4)(4)如职工信息结构体类型如职工信息结构体类型:struct personchar name2
6、0;/*姓名姓名*/char address40;/*地址地址*/float salary;/*工资工资*/float cost;/*扣款扣款*/struct date hiredate;/*聘任日期聘任日期*/;结构体类型可以嵌套定义即一个结构体类型中的某些成员又是其他结构体类型第8页,此课件共56页哦结构体类型变量的定义结构体类型变量的定义(1)先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量一般形式:一般形式:例例 struct student int num;char name20;char sex;int age;float score;char addr30;s
7、truct student stu1,stu2;struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct 结构体名结构体名 变量名表列;变量名表列;例例#define STUDENT struct student STUDENT int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;第9页,此课件共56页哦结构体类型变量的定义结构体类型变量的定义(2)定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量一般形
8、式:一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;第10页,此课件共56页哦结构体类型变量的定义结构体类型变量的定义(3)直接定义结构体变量直接定义结构体变量一般形式:一般形式:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例例 struct int num
9、;char name20;char sex;int age;float score;char addr30;stu1,stu2;用无名结构体直接定义变量,只能一次,不能在再需要时使用所定义的结构体类型。第11页,此课件共56页哦结构体类型声明的说明结构体类型声明的说明说明说明结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同类型类型:不分配内存不分配内存;变量变量:分配内存分配内存类型类型:不能赋值、存取、运算不能赋值、存取、运算;变量变量:可以可以对于结构体中的成员,可以单独使用,它的作用与地位相当于普通变量。对于结构体中的成员,可以单独使用,它的作用与地位相当于普通变量。结构体可
10、嵌套,其成员也可以是一个结构体变量。结构体可嵌套,其成员也可以是一个结构体变量。结构体成员名与程序中其它变量名可相同,两者不代表同一对象,不会混淆。结构体成员名与程序中其它变量名可相同,两者不代表同一对象,不会混淆。例例 struct date int month;int day;int year;struct student int num;char name20;struct date birthday;stu;numnamebirthdaymonthdayyear例例 struct student int num;char name20;struct date int month;int
11、 day;int year;birthday;stu;numnamebirthdaymonthdayyear第12页,此课件共56页哦结构体变量的使用结构体变量的使用(1)由结构体变量名引用其成员由结构体变量名引用其成员结构体变量结构体变量不能整体引用不能整体引用,只能引用变量只能引用变量成员成员可以将可以将一个结构体变量赋值给另一个结构体变量一个结构体变量赋值给另一个结构体变量结构体嵌套时结构体嵌套时逐级引用逐级引用引用方式:引用方式:结构体变量名结构体变量名.成员名成员名成员(分量)运算符优先级:1结合性:从左向右例例 struct student int num;char name20;
12、char sex;int age;float score;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例例 struct student int n
13、um;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()例例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例例 struct student int num;char name20;char sex;int age;float score;char addr
14、30;stu1,stu2;if(stu1=stu2).()第13页,此课件共56页哦结构体变量的初始化(结构体变量的初始化(1)形式一形式一: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”;第14页,此课件共56
15、页哦结构体变量的初始化(结构体变量的初始化(2)形式二形式二:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;第15页,此课件共56页哦结构体变量的初始化(结构体变量的初始化(3)形式三形式三:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;
16、成员名;.结构体变量结构体变量=初始数据初始数据;例例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;第16页,此课件共56页哦例例 9.1 求某同学上学期求某同学上学期8门课程的总成绩与平均成绩。门课程的总成绩与平均成绩。程序如下:程序如下:main()int i;struct st char xm8;float cj9;float tcj,acj;stu;第17页,此课件共56页哦scanf(“%s”,stu.xm););/*输入输入*/
17、for(i=1;i=8;i+)scanf(“%f”,&stu.cji);stu.tcj=0.0;/*求总成绩求总成绩*/for(i=1;i=8;i+)stu.tcj+=stu.cji;stu.acj=stu.tcj/8;/*求平均成绩求平均成绩*/printf(“%s的总成绩的总成绩=%6.2f,平均成绩平均成绩=%6.2f”,stu.xm,stu.tcj,stu.acj);输入数据:输入数据:CHEN 80 86 79 98 88 72 96 66运行结果:运行结果:CHEN的总成绩的总成绩=577.00,平均成绩平均成绩=72.13第18页,此课件共56页哦结构体变量的输入与输出结构体变量
18、的输入与输出C语言不能把结构体变量作为一个整体进行语言不能把结构体变量作为一个整体进行输入或输出,应该按成员变量输入输出。输入或输出,应该按成员变量输入输出。例如,若有一个结构体变量:例如,若有一个结构体变量:structchar name15;char addr20;long num;stud=“wang dawei”,“125 Beijing Road”,3021118;第19页,此课件共56页哦由于变量stud包含两个字符串数据和一个长整型数据,因此输出stud变量,应该使用如下方式:printf(“%s,%s,%ldn”,stud.name,stud.addr,stud.num);输入
19、stud变量的各成员值,则用:scanf(“%s%s%ld”,stud.name,stud.addr,&stud.num);第20页,此课件共56页哦结构体数组结构体数组 一个结构体变量中可以存放一组数一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分都
20、是一个结构体类型的数据,它们都分别包括各个成员(分量)项。别包括各个成员(分量)项。第21页,此课件共56页哦结构体类型数组结构体类型数组结构体数组的定义结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex;int age;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumname
21、sexagestu0stu125B第22页,此课件共56页哦结构体数组初始化与引用结构体数组初始化与引用结构体数组初始化结构体数组初始化例例 struct int num;char name20;char sex;int age;stu=,;顺序初始化顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;例例 struct student int num;char name20;c
22、har sex;int age;stu=,;分行初始化分行初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;全部初始化时维数可省结构体数组引用结构体数组引用引用方式:引用方式:结构体数组名结构体数组名下标下标.成员名成员名 struct student int num;char name20;char sex;int age;str3;stu1.age+;strcpy(stu0.n
23、ame,”ZhaoDa”);第23页,此课件共56页哦引用结构体数组元素有如下规则:(1)引用某一元素的一个成员。studentsi.num(2)可以将一个结构体数组元素赋给同一结构体类型数组中的另一个元素,或赋给同一类型的变量。例如:struct student students3,student1;Student1=students0;Students2=students1;Students1=student1;(3)不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员对象进行输入输出。Scanf(“%s”,students0.name);Printf(“%ld”,stude
24、nts0.num);第24页,此课件共56页哦例例 统计候选人选票统计候选人选票struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i成员名成员名结构体变量名结构体变量名.成员名成员名指向运算符优先级:1结合方向:从左向
25、右例例 指向结构体的指针变量指向结构体的指针变量main()struct student long int num;char name20;char sex;float score;stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,Li Lin);p-sex=M;p-score=89.5;printf(nNo:%ldnname:%snsex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score);例例 int n;int *p=&n;*p=10;n=10struct student stu1;stru
26、ct student *p=&stu1;stu1.num=101;(*p).num=101第27页,此课件共56页哦总结:结构体成员变量引用方式总结:结构体成员变量引用方式结构体变量结构体变量.成员名成员名(*p).成员名成员名p-成员名成员名其中,其中,-称为指向运算符称为指向运算符请分析下列几种运算:请分析下列几种运算:p-np-n+p-n第28页,此课件共56页哦-得到指向的结构体变量中的成员的值。得到指向的结构体变量中的成员的值。-得到指向的结构体变量中的成员的得到指向的结构体变量中的成员的值,用完该值后使它加。值,用完该值后使它加。-得到指向的结构体变量中的成员得到指向的结构体变量中
27、的成员的值加,然后再使用它。的值加,然后再使用它。第29页,此课件共56页哦指向结构体数组的指针指向结构体数组的指针例例#include struct studentint num;char name20;char sex;int age;struct student stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,WangMing,F,20;void main()struct student*p;for(stu;stu;p)printf(%5d%-20s%2c%4dn,p-num,p-name,p-sex,p-age);运行结果:运行结果:
28、LiLin 18 Zhang Fun 19 WangMing 20第30页,此课件共56页哦程序分析:程序分析:是指向是指向struct studentstruct student结构体类型数据的指针变结构体类型数据的指针变量。在量。在forfor语句中先使的初值为语句中先使的初值为stustu,也就是数组,也就是数组stustu第一个元素的起始地址。在第一次循环中输出第一个元素的起始地址。在第一次循环中输出stu0stu0的各个的各个成员值。然后执行,使自加。加意味着成员值。然后执行,使自加。加意味着p p所所增加的值为结构体数组增加的值为结构体数组stustu的一个元素所占的字节数。执的一
29、个元素所占的字节数。执行行+后后p p的值等于的值等于stu stu 1 1,指向,指向stu1stu1。在第二次循。在第二次循环中输出环中输出stu1stu1的各成员值。在执行后的各成员值。在执行后,p,p的值等的值等于于stu+2stu+2,再输出,再输出stu 2stu 2的各成员值。在执行的各成员值。在执行+后,后,的值变为的值变为stu+stu+,已不再小于已不再小于stu+3stu+3了,不再执行循环。了,不再执行循环。第31页,此课件共56页哦注意:注意:(1)(1)如果的初值为如果的初值为stustu,即指向第一个元素,即指向第一个元素,则加后则加后p p就指向下一个元素。例如
30、就指向下一个元素。例如:(+p)(+p)-num-num先使自加,然后得到它指向的先使自加,然后得到它指向的元素中的元素中的numnum成员值(即成员值(即1010210102)。)。(p+)-num(p+)-num先得到先得到-num-num的值(即的值(即1010110101),),然后使自加,指向然后使自加,指向stu1stu1。请注意以上二者的不同。请注意以上二者的不同。第32页,此课件共56页哦注意:注意:(2)(2)程序已定义了是一个指向程序已定义了是一个指向struct studentstruct student类类型数据的指针变量,它用来指向一个型数据的指针变量,它用来指向一个
31、struct studentstruct student类类型的数据型的数据,不应用来指向不应用来指向stustu数组元素中的某一成员。数组元素中的某一成员。例如例如:1 1a a;如果要将某一成员的地址赋给如果要将某一成员的地址赋给p p,可以用强制类型转,可以用强制类型转换,先将成员的地址转换成换,先将成员的地址转换成p p的类型。的类型。例如:(例如:(*)0 0a a;第33页,此课件共56页哦结构体变量作为函数参数结构体变量作为函数参数 用结构体变量的成员作参数用结构体变量的成员作参数-值传递值传递用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数-地址传递地址传递
32、用结构体变量作参数用结构体变量作参数-多值传递多值传递,效率低,效率低第34页,此课件共56页哦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(
33、struct data parm)printf(parm.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);例例 用结构体变量作函数参数用结构体变量作函数参数第35页,此课件共56页哦struct data int a,b,c;main()void func(struct data
34、*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(&arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm)printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Proces
35、s.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);例例 用结构体指针变量作函数参数用结构体指针变量作函数参数第36页,此课件共56页哦结构体变量作为函数参数结构体变量作为函数参数总结总结注意:注意:ANSI CANSI C允许用整个结构体作为函数的参数传递,但是必须允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同保证实参与形参的类型相同把一个完整的结构体变量作为参数传递,虽然合法,但
36、要将全把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,开销大,因此一部成员值一个一个传递,既费时间又费空间,开销大,因此一般不采用般不采用在函数中要结构体中成员变量的值,需要传结构体指针变量或在函数中要结构体中成员变量的值,需要传结构体指针变量或结构体地址结构体地址第37页,此课件共56页哦函数的返回值为结构体类型函数的返回值为结构体类型 struct student input()/*输入一个学生的数据输入一个学生的数据*/int i;struct student stud;scanf(%ld,&stud.no);/*输入学号输入学号*/gets
37、(stud.name);/*输入学生姓名输入学生姓名*/for(i=0;i3;i+)/*输入学生的输入学生的3门成绩门成绩*/scanf(%f,&stud.scorei);return stud;/*返回结构体数据返回结构体数据*/函数的返回值可以是结构体类型。例如,定义了结构体数组:函数的返回值可以是结构体类型。例如,定义了结构体数组:struct student stud100;数据输入可由如下形式的语句实现:数据输入可由如下形式的语句实现:for(i=0;idata=ai;pai p-next=head;第48页,此课件共56页哦建立链表操作建立链表操作(从链头到链尾从链头到链尾)ai-
38、1.p-next=q;q=malloc(sizeof(struct node);q-data=ai;aiq q-next=NULL;p p=q;第49页,此课件共56页哦链表的插入操作链表的插入操作.aiai+1.p-next=q;q=malloc(sizeof(struct node);q-data=x;p if(p满足插入条件满足插入条件)qx q-next=p-next;第50页,此课件共56页哦链表的删除操作链表的删除操作.ai-1aiai+1.p-next=q-next;free(q);q=p-next;pq if(p-next满足删除条件满足删除条件)第51页,此课件共56页哦链表
39、的输出操作链表的输出操作.ai-1aiai+1.p=p-next;p p=head;while(p)printf(%d,p-data);第52页,此课件共56页哦链表的查找操作链表的查找操作.ai-1aiai+1.p2=p1;p1=p1-nxet;p1 p1=head;while(num!=p1-num&p1!=NULL)if(p1!=NULL)printf(find:%ld%5.2fn,num,p1-score);p2第53页,此课件共56页哦本章结束本章结束再见!再见!同学们:同学们:第54页,此课件共56页哦arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)第55页,此课件共56页哦arga:18b:5c:90(main)arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parm*arga:18b:5c:90(main)(func)parm*第56页,此课件共56页哦
限制150内