220 likes | 361 Views
第 10 章 结构体及用户定义类型. 合肥师范学院计算机科学与技术系. 主要知识点. 10.1 自定义类型标识符 10.2 结构体的定义与引用 10.3 链表. 例如 : typedef int INTEGER ; typedef float REAL;. 又如 : typedef int ARRAY[100]; ARRAY a, b, c;. 所以有 : int i; float x;. 等价与. 等价于. int a[100],b[100],c[100];. INTEGER i ; REAL x;.
E N D
第10章 结构体及用户定义类型 合肥师范学院计算机科学与技术系
主要知识点 10.1 自定义类型标识符 10.2 结构体的定义与引用 10.3 链表
例如: typedef int INTEGER; typedef float REAL; 又如: typedef int ARRAY[100]; ARRAY a, b, c; 所以有: int i; float x; 等价与 等价于 int a[100],b[100],c[100]; INTEGER i ; REAL x; §10.1 自定义类型标识符 一般格式: typedef 原类型名 新类型名
定义一个新类型的步骤: 1、先按定义变量的方法写出定义语句; 如: int a[10]; 2、将变量名用新类型名替换; 如: int ARRAY[10]; 3、在最前面加typedef; 如: typedefint ARRAY[10]; 4、然后可以用新类型名定义变量。 如: ARRAYa,b,c;
§10.2 结构体的定义与引用 • 数组可以表示一组类型相同的数据。 • 在实际中,通常需要通过一组不同类型的数据共同来描述某个实体。如:学生个人资料(学号、姓名、性别、年龄和学习成绩)。 • C 语言提供的结构体就是这样一种数据类型,它由一组称为成员(域或元素)的数据成分组成,其中每个成员可以具有不同的类型,用来存放类型不同但又相互有关的数据。 • 结构体类型:是一种C语言没有定义、用户可以根据实际需要自己定义的构造型数据类型。
10.2.1 结构体类型的定义 结构体数据类型说明的一般格式: struct 结构体类型标识符 { 类型名1 结构成员名表1; 类型名2 结构成员名表2; …… 类型名n 结构成员名表n; }; 如:描述学生基本信息 struct student { int num; char name[20]; char sex; int age; float score; } 如:表示日期 struct date { int month, day, year ;}
struct student { int num; char name[10]; char sex; int age; struct date { int year; int month; int day; }birthday; float score; } 结构体类型说明可以嵌套 如: 学生基本情况 struct student { int num; char nume[20]; char sex; int age; struct date birthday; float score; } 经上面定义之后: struct student 和int , float 等标准类型标识符一样可用来定义变量、数组、指针变量等
10.2.2 结构体类型变量、数组和指针变量的定义 方法1: 先定义结构体类型,再定义结构体变量 如: struct student { int num; char nume[20]; char sex; int age; float score; } struct student std, *pstd, pers[3]; 如: struct student { int num; char name[20]; char sex; int age; float score; } std,*pstd, pers[3]; 方法2:在定义结构体类型的 同时定义结构体变量
10.2.3 结构体类型变量、数组和指针变量的引用 如: struct student { long num; char name[20]; char sex; int age; float score; }std,pers[5],*sp=&std; • 对结构体成员的引用 • 结构体变量名. 成员名 • (*指针变量名).成员名 • 指针变量名->成员名 std.num=10101; 等价于 sp->num=10101; std.sex=’M’; 等价于 (*sp).sex=’M’; std.score=75+8; 等价于 (*sp).score=75+8; std.age++; 等价于 sp->age++;
【例10.2】 某学习小组有N名同学,已知每个同学的学号和《C语言》课程的成绩,打印最高分同学的所有信息和小组的平均成绩。
【例10.3】指向结构体变量的指针变量的应用。【例10.3】指向结构体变量的指针变量的应用。
a1 an … head ^ §10.3 用指针处理链表 1.链表概述 链表作为一种常用的、能够实现动态存储分配的数据结构,在《数据结构》课程中有详细介绍。下面从应用角度,对链表作一简单介绍。下图所示为单链表结构模型。 (1)头指针变量head──指向链表的首结点。 (2)每个结点由2个域组成: 数据域──存储结点本身的信息。 指针域──指向后继结点的指针。 (3)尾结点的指针域置为NULL(空),作为链表结束的标志
a1 a2 an … head ^ C语言对链表结点的结构描述在C语言中,用结构类型来描述结点结构。例如: struct slist { int data; /*数据域*/ struct slist *next; /*指针域*/ }; typedef struct slist SLIST; 用于动态分配空间的标准函数 malloc(size);在内存的动态区申请一个长度为size的存储单元 calloc(n,size);在内存的动态区申请n个长度为size的存储单元 free(*ptr);释放由ptr指向的存储单元
2. 链表的建立 例10.4 编写一个creat( )函数用于建立一个有5名学生基本数据的单向链表。 其算法步骤为: (1) 定义一个描述学生基本数据的结构体类型。 (2) 定义三个指向结构体的指针p,q和head。其中head为头指针;p为当前结点的指针;q为当前链表的表尾结点指针。 (3) 建立第一个结点 (4) 建立其它节点并完成与当前链表的链接。 重复步骤(4)就可以完成链表的建立。
例10.5 编写输出链表的函数print( ) 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域将搜索到的每个节点的数据域的值输出 3. 链表的输出
4. 链表的删除 例10.6 编写函数delete( )实现链表的删除操作 基本思路: 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为num的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。
5. 链表的插入 例10.7 编写插入结点的函数insert( ),实现在有序链表中结点的插入操作(假设链表按照num(学号)从小到大顺序排列)。 基本思路: 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到值为x的节点,然后将新结点y插入。