1、第九章第九章 结构体与链表结构体与链表内容提要内容提要 结构体类型的定义结构体类型的定义 结构体类型变量结构体类型变量 结构体类型数组结构体类型数组 结构体类型指针结构体类型指针 结构体与函数结构体与函数 链表链表C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体概述结构体概述(1)结构体结构体 结构体是结构体是一种构造数据类型一种构造数据类型 用途:把不同类型的数据组合成一个整体用途:把不同类型的数据组合成一个整体-自定义数据自定义数据类型类型 结构体类型定义结构体类型定义struct 结构体
2、名结构体名 类型标识符类型标识符 成员名成员名1;类型标识符类型标识符 成员名成员名2;.;成员类型可以是成员类型可以是基本型或构造型基本型或构造型struct是是关键字关键字,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体概述结构体概述(2)定义结构体类型,描述下列数据定义结构体类型,描述下列数据 (1)(1)学生情况学生情况:包含学生的学号、包含学生的学号、姓名、姓名、性别、性别、年龄、年龄、C C语言语言课程成绩课程成绩
3、:struct studentint no;/*学号学号*/char name10;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float score;/*C成绩成绩*/;注:注:;不能省不能省结构体类型定义描述结构结构体类型定义描述结构的组织形式的组织形式,不分配内存不分配内存C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页如考虑如考虑1010门课程成绩,门课程成绩,加上总成绩与平均加上总成绩与平均成绩,可作如下定义成绩,可作如下定义:struct stude
4、ntint no;/*学号学号*/char name10;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float score10;/*10门课程成绩门课程成绩*/float tcj,acj;/*总成绩,总成绩,平均成绩平均成绩*/;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 定义结构体类型,描述下列数据定义结构体类型,描述下列数据 (2)(2)个人数据个人数据:包含姓名、性别、年龄、身高、体重、包含姓名、性别、年龄、身高、体重、住址住址:struct pe
5、rsonchar name20;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float height;/*身高身高*/float weight;/*体重体重*/char addr50;/*住址住址*/;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页(3)(3)日期结构体类型包括日期结构体类型包括年、月、日年、月、日:struct dateint year;/*年年*/month;/*月月*/day;/*日日*/;(4)(4)如职工信息结构体类型如职工信息结构体
6、类型:struct personchar name20;/*姓名姓名*/char address40;/*地址地址*/float salary;/*工资工资*/float cost;/*扣款扣款*/struct date hiredate;/*聘任日期聘任日期*/;结构体类型可以嵌套定义即一个结结构体类型可以嵌套定义即一个结构体类型中的某些成员又是其他结构体类型中的某些成员又是其他结构体类型构体类型C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体类型变量的定义结构体类型变量的定义(1)先定义结
7、构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量一般形式:一般形式:例例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct 结构体名结构体名 变量名表列变量名表列;例例#define STUDENT struct student STUDENT int num;char name20;char sex;int
8、 age;float score;char addr30;STUDENT stu1,stu2;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体类型变量的定义结构体类型变量的定义(2)定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量一般形式:一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例例 struct student int num;char name20;char sex;i
9、nt age;float score;char addr30;stu1,stu2;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体类型变量的定义结构体类型变量的定义(3)直接定义结构体变量直接定义结构体变量一般形式:一般形式:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名表列变量名表列;例例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu
10、2;用用无名结构体无名结构体直接定义直接定义变量变量只能一次只能一次C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体类型声明的说明结构体类型声明的说明 说明说明结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同 类型类型:不分配内存不分配内存;变量变量:分配内存分配内存 类型类型:不能赋值、存取、运算不能赋值、存取、运算;变量变量:可以可以结构体可嵌套结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期结构体
11、类型及变量的作用域与生存期例例 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 day;int year;birthday;stu;numnamebirthdaymonthdayyearC C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言
12、程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量的使用结构体变量的使用(1)由结构体变量名引用其成员由结构体变量名引用其成员结构体变量结构体变量不能整体引用不能整体引用,只能引用变量只能引用变量成员成员可以将可以将一个结构体变量赋值给另一个结构体变量一个结构体变量赋值给另一个结构体变量结构体嵌套时结构体嵌套时逐级引用逐级引用引用方式:引用方式:结构体变量名结构体变量名.成员名成员名成员成员(分量分量)运算符运算符优先级优先级:1 1结合性结合性:从左向右从左向右例例 struct student int num;char name20;char sex;int age;
13、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 num;char name20;ch
14、ar 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 addr30;stu1,stu2;if(s
15、tu1=stu2).()C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量的初始化(结构体变量的初始化(1)形式一形式一:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;例例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wan
16、g Lin”,M,19,“200 Beijing Road”;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量的初始化(结构体变量的初始化(2)形式二形式二:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“
17、200 Beijing Road”;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量的初始化(结构体变量的初始化(3)形式三形式三:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;C C语言程序设计语言程
18、序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量存储分配示意图结构体变量存储分配示意图stru110001020100110231026name20sexagescoreC C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例 9.1 求某同学上学期求某同学上学期8门课程的总成绩与平均成绩。门课程的总成绩与平均成绩。程序如下:程序如下:main()int i;struct st char xm8;float cj9;flo
19、at tcj,acj;stu;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页scanf(%s,stu.xm););/*输入输入*/for(i=1;i=8;i+)scan(%f,&stu.cji););stu.tcj=0.0;/*求总成绩求总成绩*/for(i=1;i=8;i+)stu.tcj+=stu.cji;stu.acj=stu.tcji/8;/*求平均成绩求平均成绩*/printf(%s总成绩总成绩=%6.2f,平均成绩平均成绩=%6.2f,stu.tcj,stu.acj););输入数据:输
20、入数据:CHEN 80 86 79 98 88 72 96 66运行结果:运行结果:CHEN的总成绩的总成绩=577.00,平均成绩平均成绩=72.13C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体类型数组结构体类型数组 结构体数组的定义结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex;int age;struct student stu2;形式二:struct student int num;char name20;c
21、har sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumnamesexagestu0stu125BC C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体数组初始化与引用结构体数组初始化与引用 结构体数组初始化结构体数组初始化例例 struct int num;char name20;char sex;int age;stu=,;顺序初始化顺序初始化:struct student
22、 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;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
23、,“Liu Yan”,F,19;全部初始化时维数可省全部初始化时维数可省 结构体数组引用结构体数组引用引用方式:引用方式:结构体数组名结构体数组名下标下标.成员名成员名 struct student int num;char name20;char sex;int age;str3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例 统计候选人选票统计候选人选票struct person char name20;int co
24、unt;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结合方向:从左向右例例 指向结构体的指针变量指向结构体的指针变量main()struct student long int num;char name20;ch
25、ar 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;struct student *p=&stu1;stu1.num=101;(*p).num=101C C语言程序设计语言程序设计C C语言程序设计语言程
26、序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页总结:结构体成员变量引用方式总结:结构体成员变量引用方式结构体变量结构体变量.成员名成员名(*p).成员名成员名p-成员名成员名其中,其中,-称为指向运算符称为指向运算符 请分析下列几种运算:请分析下列几种运算:p-np-n+p-nC C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页指向结构体数组元素的指针指向结构体数组元素的指针例例 指向结构体数组的指针指向结构体数组的指针struct student int n
27、um;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);numnamesexagestu0pstu1stu2p+1C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量作为函数参数结构体变量作为函数参数 用结构体变量的成员作参数用结构体变量的成员作
28、参数-值传递值传递用指向结构体变量或数组的指针作参用指向结构体变量或数组的指针作参数数-地址传递地址传递用结构体变量作参数用结构体变量作参数-多值传递多值传递,效,效率低率低C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页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.
29、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(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,pa
30、rm.c);printf(Return.n);例例 用结构体变量作函数参数用结构体变量作函数参数C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页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()
31、.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(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);例例 用结构体指
32、针变量作函数参数用结构体指针变量作函数参数C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页结构体变量作为函数参数结构体变量作为函数参数 总结总结注意:注意:ANSI CANSI C允许用整个结构体作为函数的参数传递,允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同但是必须保证实参与形参的类型相同把一个完整的结构体变量作为参数传递,虽然合法,把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,但要将全部成员值一个一个传递,既费时间又费空间,
33、开销大,因此一般不采用开销大,因此一般不采用在函数中要结构体中成员变量的值,需要传结构体指在函数中要结构体中成员变量的值,需要传结构体指针变量或结构体地址针变量或结构体地址C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页函数的返回值为结构体类型函数的返回值为结构体类型 struct student input()/*输入一个学生的数据输入一个学生的数据*/int i;struct student stud;scanf(%ld,&stud.no);/*输入学号输入学号*/gets(stud.name)
34、;/*输入学生姓名输入学生姓名*/for(i=0;i3;i+)/*输入学生的输入学生的3门成绩门成绩*/scanf(%f,&stud.scorei);return stud;/*返回结构体数据返回结构体数据*/函数的返回值可以是结构体类型。例如,定义了结构体数组:函数的返回值可以是结构体类型。例如,定义了结构体数组:struct student stud100;数据输入可由如下形式的语句实现:数据输入可由如下形式的语句实现:for(i=0;idata=ai;for(i=0;inext=head;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言
35、程序设计语言程序设计上一页上一页下一页下一页建立链表操作建立链表操作(从链头到链尾从链头到链尾)ai-1.p-next=q;q=malloc(sizeof(struct node);q-data=ai;for(i=0;inext=NULL;p p=q;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页链表的插入操作链表的插入操作.aiai+1.p-next=q;q=malloc(sizeof(struct node);q-data=x;p if(p满足插入条件满足插入条件)qx q-next=p-ne
36、xt;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页链表的删除操作链表的删除操作.ai-1aiai+1.p-next=q-next;free(q);q=p-next;pq if(p-next满足删除条件满足删除条件)C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页链表的输出操作链表的输出操作.ai-1aiai+1.p=p-next;p while(p)printf(%d,p-data);C C语言程序设
37、计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页链表的查找操作链表的查找操作.ai-1aiai+1.p2=p1;p1=p1-nxet;p1 while(num!=p1-num&p1!=NULL)printf(find:%ld%5.2fn,num,p1-score);p2C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页再见!再见!同学们:同学们:C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计
38、语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页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)C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页arga:18b:5c:90(main)arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parm*arga:18b:5c:90(main)(func)parm*