资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C语言程序设计 第9章 结构体,第9章 结构体,主要内容 9.1 结构体类型 9.2 结构体变量 9.3 结构体数组 9.4 结构体指针 9.5 链表概述 9.6 链表的基本操作,9.1 结构体类型,9.1.1 结构体类型概述 9.1.2 结构体类型定义,9.1.1 结构体类型概述,学生信息表与结构体数据 在程序中使用结构体数据的一般过程 针对具体的组合数据,定义专门的结构体数据类型。 使用定义好的数据类型,定义要使用的结构体变量。 使用定义的结构体变量存储和表示结构体数据。,9.1.2结构体类型定义,定义结构体类型的一般格式 struct 结构体名 成员表 ; 说明: “结构体名”是用户定义的结构体的名字,在以后定义结构体变量时,使用该名字进行类型标识。 “成员表”是对结构体数据中每一个数据项的变量说明,其格式与说明一个变量的一般格式相同,如下: 数据类型名 成员名; “struct”是关键字,“struct结构体名”是结构体类型标识符,在类型定义和类型使用时“struct”都不能省略。 结构体名称可以省略,此时定义的结构体称为无名结构体。,9.1.2结构体类型定义,如下是对学生组合数据的结构体类型定义: struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ int score; /* 成绩 */ char addr30; /* 地址 */ ;,9.1.2结构体类型定义,当结构体的成员又是结构体时,称为结构体的嵌套。 struct date int month; int day; int year; ; struct stud int num; char name20; char sex; int age; struct date birthday; char addr30; stud1,stud2;,9.2结构体变量,9.2.1 定义结构体变量 9.2.2 引用结构体成员 9.2.3 结构体变量初始化,9.2.1 定义结构体变量, 先定义结构体类型,再定义结构体变量。 一般格式 struct 结构体类型名称 结构体变量名; 如: struct student student1,student2;,9.2.1 定义结构体变量, 在定义结构体类型的同时定义结构体变量。 一般格式如下: struct 结构体名 成员表 结构体变量1, 结构体变量2,结构体变量n; 例如: struct student int num; char name20; char sex; int age; int score; char addr30; student1, student2;,9.2.1 定义结构体变量, 不定义结构体类型名,直接定义结构体类型变量。 一般格式如下: struct 成员表; 结构体变量1,结构体变量2,结构体变量n; 例如: struct int num; char name20; char sex; int age; int score; char addr30; student1, student2;,9.2.2引用结构体成员,引用结构体成员的一般格式 结构体变量名.成员名称 如: student1.age “.”是结构体成员运算符,“.”操作的优先级在语言中是最高的,其结合性为从左到右。,9.2.2引用结构体成员,例9-1 输入一个学生的一组数据,然后输出其姓名、年龄和地址。,程序9-1,说明: 对结构体变量进行输入输出时,只能以成员引用的方式进行,不能对结构体变量进行整体的输入输出。 当成员又是一个结构体类型时,若要引用它的成员,要从高到低逐级引用。如: stud1.birthday.month 与其他变量一样,结构体变量成员可以进行各种运算。,9.2.3结构体变量初始化,结构体变量的初始化,是在定义结构体变量的同时,对其成员赋初值。 结构体变量初始化的一般形式 struct 结构体名 结构体变量=初始化数据; 说明: “ ”中的初始化数据用逗号“,”分隔。 初始化数据的个数与结构体成员的个数应相同,它们是按成员的先后顺序一一对应赋值的。 每个初始化数据必须符合与其对应的成员的数据类型。,例如: struct student int num; char name20; char sex; int age; int score; char addr30; stu=9901,“liujia“,M,19,87,“shanghai“;,9.3结构体数组,9.3.1 结构体数组概述 9.3.2 结构体数组的初始化 9.3.3 结构体数组的应用,9.3.1 结构体数组概述,数组元素是结构体类型的数组,称为结构体数组。定义方法与其他结构体变量的定义方法相同 。 先定义结构体类型,然后用结构体类型定义数组变量。 如: struct student information100; 引用结构体数组成员的一般格式: 结构体数组名下标.成员名 如: information20.score=91; 定义结构体类型的同时,定义数组变量。 定义无类型名的结构体数组变量。 例如: struct int year; int month; int day; date110,date210;,9.3.2结构体数组的初始化,结构体数组的初始化,就是在定义结构体数组的同时,为结构体数组元素赋初值。 例如: struct student info3= 9901,“liujia“,M,19,87,“shanghai“, 9902,“wangkai“,M,18,89,“beijing“, 9903,“xiaohua“,F,20,81,“qingdao“;,9.3.3 结构体数组的应用,例9-2 按照表9-1的数据情况,输入一个班级的学生信息,并进行如下处理: 把学习成绩在85以上的学生找出来,并输出这部分学生如下信息:姓名、成绩、地址。 分别统计出男生和女生人数。 分析: 这个问题可以分成三个步骤处理: 定义一个结构体类型,并用它定义一个存储学生信息的结构体数组; 向结构体数组中输入学生数据; 统计,并输出结果。,程序9-2,9.4 结构体指针,指向结构体变量的指针,称为结构体指针。与其他类型的指针一样,结构体指针既可以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针还可以作函数的参数。,9.4.1结构体指针变量的定义及使用,定义结构体指针变量的一般形式: struct 结构体名 *结构体指针变量名; 例如: struct student *p,*q; struct student stud1,info10; p= /* q指向结构体数组变量info */,9.4 结构体指针,指向结构体变量的指针,称为结构体指针。与其他类型的指针一样,结构体指针既可以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针还可以作函数的参数。,9.4.1结构体指针变量的定义及使用,定义结构体指针变量的一般形式: struct 结构体名 *结构体指针变量名; 例如: struct student *p,*q; struct student stud1,info10; p= /* q指向结构体数组变量info */,9.4.1结构体指针变量的定义及使用,对指向结构体数组的指针,当指针进行加1或减1运算时,其结果就是将指针指向上一个或者下一个结构体数组元素。,9.4.1结构体指针变量的定义及使用,例9-4 结构体指针用法示例。 #include “stdio.h“ #include “string.h“ struct stud char *number; char name20; int score; ; main() struct stud student,*p; p= ,9.4.1结构体指针变量的定义及使用,例9-5指向结构体数组指针的应用示例。 #include “stdio.h“ struct stud char *number; char name20; int score; stu3=“990103“,“xiaohua“,81,“990104“,“zhangli“,82,“990105“,“wangfeng“,88; main() struct stud *p; printf(“nstudent No. name scoren“); for(p=stu;pnumber,p-name,p-score); ,9.4.2结构体指针作函数的参数,例9-8用结构体指针作函数的参数,改写例9-7的程序。 #include “stdio.h“ #define N 5 /* 全班学生数 */ struct stu_info char num7; /* 学生学号 */ int score; stu=“990101“,87,“990102“,89,“990103“,81,“990104“,82,“990105“,88; main ( ) void sort_stu(struct stu_info *,int); /* 排序函数声明 */ int i; sort_stu(stu,N); for(i=0;iN;i+) /* 输出结构体数组元素 */ printf(“%-10s%dn“,stui.num,stui.score); void sort_stu(struct stu_info *p,int n) int i,j; struct stu_info temp; /* 定义结构体变量,用于结构体数据的交换 */ for(i=1;in;i+) /* 冒泡法排序,降序 */ for (j=0;jN-i;j+) if(pj.scorepj+1.score) /* 交换两个结构体元素的数据 */ temp=pj; pj=pj+1; pj+1=temp; ,9.5链表概述,9.5.1 链表的概念 9.5.2 链表的特点 9.5.3 定义链表结构,9.5.1 链表的概念,链表是结构体最重要的应用,它是一种非固定长度的数据结构,是一种动态存储技术,它能够根据数据的结构特点和数量使用内存,尤其适用于数据个数可变的数据存储。 使用链表存储表9-1中前3个学生数据。,9.5.2 链表的特点, 链表中的结点具有完全相同的结构,每一个结点存储一个独立的结构体数据; 链表的结点由系统随机分配,它们在内存中的位置可能是相邻的,也可能是不相邻的,结点之间的联系是通过指针域实现的; 为了能准确的定位第一个结点,每个链表要有一个表头指针,从第一个结点开始,沿指针链能遍历链表中的所有结点; 链表中的结点是在需要时用calloc()申请的,当不再需要时,应有free()函数释放所占用的内存段。 一个链表不需要事先说明它要包括的结点数目,在需要存储新的数据时,就可增加结点,需要删除数据时,就减少结点,链表结点是动态变化的。,9.5.3 定义链表结构,要定义一个链表结点的结构,需要包括两个方面: 定义数据存储所对应的各个成员; 定义指向其他结点的指针成员。 例如: 假若要用链表逐个存储一批整数,其结点结构可定义如下: struct node int data; struct node *next; /* 指向struct node类型
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号