C语言入门经典(第四版)11-结构化数据
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11.1 数据结构:使用 11.1 数据结构:使用struct
关键字struct能定义各种类型的变量集合,称为结构(structure),并把它 关键字struct能定义各种类型的变量集合,称为结构(structure),并把它 们视为一个单元 . 定义结构类型和结构变量 访问结构成员 未命名的结构 结构数组 表达式中的结构 结构指针 为结构动态分配内存
C入门经典(第4版) 入门经典(
11.1.3 未命名的结构 11.1.3
不—定要给结构指定标记符名字.用一条语句声明结构和该结构的实例 时,可以省略标记符名字.在上一个例子中,声明了horse类型和该类型的实 时,可以省略标记符名字.在上一个例子中,声明了horse类型和该类型的实 例My_first_horse,也可以改为: My_first_horse,也可以改为: struct { /* Structure declaration and... */ int age; int height; char name[20]; char father[20]; char mother[20]; } My_first_horse; /* ...structure variable declaration combined */ 使用这种方法的最大缺点是不能在其他语句中定义这个结构的其他实例. 这个结构类型的所有变量必须在一行语句中定义.
C入门经典(第4版) 入门经典(
11.1.5 表达式中的结构 11.1.5
结构中的成员可以像一般变量那样用于表达式.以程序11.2中的结构为例, 结构中的成员可以像一般变量那样用于表达式.以程序11.2中的结构为例, 可以将它们用在下面的表达式中: My_horses[1].height = (My_horses[2].height + My_horses[3].height]/2; —匹马的高度是另两匹马的平均高度是没什么道理的,但这是一个合法 的语句.也可以在赋值语句中使用整个结构元素. My_horses[1] = My horses[2];
C入门经典(第4版) 入门经典(
11.1.4 结构数组 11.1.4
保存马匹数据的基本方法就是这样,但在处理50或100匹马如此大量的数据 保存马匹数据的基本方法就是这样,但在处理50或100匹马如此大量的数据 时会比较麻烦,此时需要一个更可靠的方法去处理大量的马匹数据.使用变量 也会遇到这个问题.此时解决方法是使用数组,这里也可以声明一个horse数 也会遇到这个问题.此时解决方法是使用数组,这里也可以声明一个horse数 组.
C入门经典(第4版) 入门经典( 11.2.5 结构中的位字段 11.
位字段(bit-fields)提供的机制允许定义变量来表示一个整数中的一个或多 位字段(bit-fields)提供的机制允许定义变量来表示一个整数中的一个或多 (bit 个位,这样,就不需要为每个位明确指定成员名称了.
C入门经典(第4版) 入门经典(
C入门经典(第4版) 入门经典( 第11章 结构化数据 11章
前面学习了如何声明和定义变量,使之包含各种类型的数据,如整数, 浮点数和字符等.学习了如何创建这些类型的数组及指针数组,这些指针指向 包含可用数据类型的内存位置.这些很有用,但是许多应用程序还需要一些更 灵活的功能 .
C入门经典(第4版) 入门经典(
C入门经典(第4版) 入门经典(
11.1.2 访问结构成员 11.1.2
现在知道如何定义结构及声明结构变量了,还必须引用结构的成员.结 构变量的名称不是一个指针,所以需要特殊的语法访问这些成员. 要引用结构成员,应在结构变量名称的后面加上一个句点,再加上成员 变量名称.例如,发现Dobbin隐瞒了它的年龄,事实上它比初始化的值年轻, 变量名称.例如,发现Dobbin隐瞒了它的年龄,事实上它比初始化的值年轻, 就可以将值修正如下: Dobbin.age = 12;
C入门经典(第4版)1.1.7
可以利用前面掌握的各种工具重写程序11.2,以更经济的方式使用内存. 可以利用前面掌握的各种工具重写程序11.2,以更经济的方式使用内存. 程序11.2的最初版本为包含50个horse结构的数组分配了内存,而实际上并不 程序11.2的最初版本为包含50个horse结构的数组分配了内存,而实际上并不 需要这么多内存. 要为结构动态分配内存,可以使用结构指针数组,其声明非常简单,如 下所示: struct horse *phorse[50]; 这行语句声明了50个指向horse结构的指针数组.该语句只给指针分配了 这行语句声明了50个指向horse结构的指针数组.该语句只给指针分配了 内存.还需要分配一些内存来存储每个结构的成员.
C入门经典(第4版) 入门经典( 11.2.2 声明结构中的结构 11.
可以在horse结构的定义中声明Date结构,如下: 可以在horse结构的定义中声明Date结构,如下: struct horse { struct Date { int day; int month; int year; } dob; int height; char name[20]; char father[20]; char mother[20]; };
C入门经典(第4版) 入门经典(
11.3.3 作为函数返回值的结构 11.
函数返回结构和返回一般数值一样,只是在函数原型中,要以正常的方 式指出函数返回的是结构,例如: struct horse my_fun(void); 这个函数原型说明,它是一个没有变元的函数,返回horse类型的结构. 这个函数原型说明,它是一个没有变元的函数,返回horse类型的结构. 可以像这样从函数返回一个结构,但比较方便的做法是返回结构指针
C入门经典(第4版) 入门经典( 11.2 再探结构成员 11.
前面说过,所有基本数据类型(包含数组) 前面说过,所有基本数据类型(包含数组)都可以成为结构的成员.除此之 外,还可以把一个结构作为另一个结构的成员,不仅指针可以是结构的成员, 结构指针也可以是结构的成员 . 将一个结构作为另一个结构的成员 声明结构中的结构 将结构指针用作结构成员 双向链表 结构中的位字段
C入门经典(第4版) 入门经典(
11.3.2 结构指针作为函数变元 11.
在调用函数时,传送给函数的是变元值的副本.如果变元是一个非常大 的结构,就需要相当多的时间,并占用结构副本所需的内存.在这种情况下, 应该使用结构指针作为变元.这可以避免占用内存,节省复制的时间,因为只 需复制指针.函数可以通过指针直接访问原来的结构.另外,使用指针给函数 传送结构,也提高了效率.重写siblings()函数,如下: 传送结构,也提高了效率.重写siblings()函数,如下: bool siblings(struct family *member1, struct family *member2) { if(strcmp(member1if(strcmp(member1->mother, member2->mother) == 0) member2return true; else return false; }
C入门经典(第4版) 入门经典(
11. 11.3.4 修改程序
下面创建一个例子,将结构指针作为变元和返回值.修改前一个例子( 下面创建一个例子,将结构指针作为变元和返回值.修改前一个例子(程序 11.6),在Family类型的结构中声明一些额外的指针p_to_pa和p_to_ma,如下 11.6),在Family类型的结构中声明一些额外的指针p_to_pa和p_to_ma,如下 所示: struct Family /* Family structure declaration */ { struct Date dob; char name[20]; char father[20]; char mother[20]; struct Family *next; /* Pointer to next structure */ struct Family *previous; /* Pointer to previous structure */ struct Family *p_to_pa; /* Pointer to father structure */ struct Family *p_to_ma; /* Pointer to mother structure */ };
将结构作为变元传给函数和传递一般变量没有什么不同.创建类似于horse的 将结构作为变元传给函数和传递一般变量没有什么不同.创建类似于horse的 结构,如下: struct family { char name[20]; int age; char father[20]; char mother[20]; };
C入门经典(第4版) 入门经典( 11.2.3 将结构指针用作结构成员 11.
任何指针都可以是结构的成员,包含结构指针在内.结构成员指针可以 指向相同类型的结构.例如,horse类型的结构可以含有一个指向horse类型结 指向相同类型的结构.例如,horse类型的结构可以含有一个指向horse类型结 构的指针.
C入门经典(第4版) 入门经典( 11.2.1 将一个结构作为另一个结构 11.
的成员
本章的开头为满足马饲养员的需要,设计了一个程序,处理每匹马的各 种数据,包括名字,身高和生日等,但程序11.1用年龄代替了生日.其部分原 种数据,包括名字,身高和生日等,但程序11.1用年龄代替了生日.其部分原 因是日期处理起来比较麻烦,要用3 因是日期处理起来比较麻烦,要用3个数值表示,还要处理闰年的问题.现在 准备将一个结构作为另一个结构的成员来处理日期 .
C入门经典(第4版) 入门经典(
11.1.6 结构指针 11.1.6
要获得结构的地址,就需要使用结构的指针.由于需要的是结构的地址, 因此需要声明结构的指针.结构指针的声明方式和声明其他类型的指针变量相 同,例如: struct horse *phorse; 这条语句声明了一个phorse指针,它可以存储horse类型的结构地址.现 这条语句声明了一个phorse指针,它可以存储horse类型的结构地址.现 在可以将phorse设置为一个特定结构的地址值,使用的方法和其他类型的指针 在可以将phorse设置为一个特定结构的地址值,使用的方法和其他类型的指针 完全相同,例如: phorse = &My_horses[1];
C入门经典(第4版) 入门经典(
11.1.1 定义结构类型和结构变量 11.1.1
可以将结构的声明和结构变量的声明分开.取代前面例子的语句如下: struct horse { int age; int height; char name[20]; char father[20]; char mother[20]; }; struct horse Dobbin = { 24, l7, "Dobbin", "Trigger", "Flossie" };
11. 11.3 结构与函数
结构表示C 结构表示C语言的一个强大特性,因此它与函数并用非常重要.现在探讨 如何把结构当成变元传递给函数,以及如何从函数中返回结构 . 结构作为函数的变元 结构指针作为函数变元 作为函数返回值的结构 修改程序 二叉树
C入门经典(第4版) 入门经典(
11.3.1 结构作为函数的变元 11.
C入门经典(第4版) 入门经典( 11.2.4 双向链表 11.
前一个例子创建的链表有一个缺点:只能往前走.其实,只需小小的修 改,就可以得到双向链表(doubly 改,就可以得到双向链表(doubly linked list),可以双向遍历链表.方法是除了 list),可以双向遍历链表.方法是除了 指向下一个结构的指针外,在每个结构中再添加一个指针,存储前一个结构的 地址 .
关键字struct能定义各种类型的变量集合,称为结构(structure),并把它 关键字struct能定义各种类型的变量集合,称为结构(structure),并把它 们视为一个单元 . 定义结构类型和结构变量 访问结构成员 未命名的结构 结构数组 表达式中的结构 结构指针 为结构动态分配内存
C入门经典(第4版) 入门经典(
11.1.3 未命名的结构 11.1.3
不—定要给结构指定标记符名字.用一条语句声明结构和该结构的实例 时,可以省略标记符名字.在上一个例子中,声明了horse类型和该类型的实 时,可以省略标记符名字.在上一个例子中,声明了horse类型和该类型的实 例My_first_horse,也可以改为: My_first_horse,也可以改为: struct { /* Structure declaration and... */ int age; int height; char name[20]; char father[20]; char mother[20]; } My_first_horse; /* ...structure variable declaration combined */ 使用这种方法的最大缺点是不能在其他语句中定义这个结构的其他实例. 这个结构类型的所有变量必须在一行语句中定义.
C入门经典(第4版) 入门经典(
11.1.5 表达式中的结构 11.1.5
结构中的成员可以像一般变量那样用于表达式.以程序11.2中的结构为例, 结构中的成员可以像一般变量那样用于表达式.以程序11.2中的结构为例, 可以将它们用在下面的表达式中: My_horses[1].height = (My_horses[2].height + My_horses[3].height]/2; —匹马的高度是另两匹马的平均高度是没什么道理的,但这是一个合法 的语句.也可以在赋值语句中使用整个结构元素. My_horses[1] = My horses[2];
C入门经典(第4版) 入门经典(
11.1.4 结构数组 11.1.4
保存马匹数据的基本方法就是这样,但在处理50或100匹马如此大量的数据 保存马匹数据的基本方法就是这样,但在处理50或100匹马如此大量的数据 时会比较麻烦,此时需要一个更可靠的方法去处理大量的马匹数据.使用变量 也会遇到这个问题.此时解决方法是使用数组,这里也可以声明一个horse数 也会遇到这个问题.此时解决方法是使用数组,这里也可以声明一个horse数 组.
C入门经典(第4版) 入门经典( 11.2.5 结构中的位字段 11.
位字段(bit-fields)提供的机制允许定义变量来表示一个整数中的一个或多 位字段(bit-fields)提供的机制允许定义变量来表示一个整数中的一个或多 (bit 个位,这样,就不需要为每个位明确指定成员名称了.
C入门经典(第4版) 入门经典(
C入门经典(第4版) 入门经典( 第11章 结构化数据 11章
前面学习了如何声明和定义变量,使之包含各种类型的数据,如整数, 浮点数和字符等.学习了如何创建这些类型的数组及指针数组,这些指针指向 包含可用数据类型的内存位置.这些很有用,但是许多应用程序还需要一些更 灵活的功能 .
C入门经典(第4版) 入门经典(
C入门经典(第4版) 入门经典(
11.1.2 访问结构成员 11.1.2
现在知道如何定义结构及声明结构变量了,还必须引用结构的成员.结 构变量的名称不是一个指针,所以需要特殊的语法访问这些成员. 要引用结构成员,应在结构变量名称的后面加上一个句点,再加上成员 变量名称.例如,发现Dobbin隐瞒了它的年龄,事实上它比初始化的值年轻, 变量名称.例如,发现Dobbin隐瞒了它的年龄,事实上它比初始化的值年轻, 就可以将值修正如下: Dobbin.age = 12;
C入门经典(第4版)1.1.7
可以利用前面掌握的各种工具重写程序11.2,以更经济的方式使用内存. 可以利用前面掌握的各种工具重写程序11.2,以更经济的方式使用内存. 程序11.2的最初版本为包含50个horse结构的数组分配了内存,而实际上并不 程序11.2的最初版本为包含50个horse结构的数组分配了内存,而实际上并不 需要这么多内存. 要为结构动态分配内存,可以使用结构指针数组,其声明非常简单,如 下所示: struct horse *phorse[50]; 这行语句声明了50个指向horse结构的指针数组.该语句只给指针分配了 这行语句声明了50个指向horse结构的指针数组.该语句只给指针分配了 内存.还需要分配一些内存来存储每个结构的成员.
C入门经典(第4版) 入门经典( 11.2.2 声明结构中的结构 11.
可以在horse结构的定义中声明Date结构,如下: 可以在horse结构的定义中声明Date结构,如下: struct horse { struct Date { int day; int month; int year; } dob; int height; char name[20]; char father[20]; char mother[20]; };
C入门经典(第4版) 入门经典(
11.3.3 作为函数返回值的结构 11.
函数返回结构和返回一般数值一样,只是在函数原型中,要以正常的方 式指出函数返回的是结构,例如: struct horse my_fun(void); 这个函数原型说明,它是一个没有变元的函数,返回horse类型的结构. 这个函数原型说明,它是一个没有变元的函数,返回horse类型的结构. 可以像这样从函数返回一个结构,但比较方便的做法是返回结构指针
C入门经典(第4版) 入门经典( 11.2 再探结构成员 11.
前面说过,所有基本数据类型(包含数组) 前面说过,所有基本数据类型(包含数组)都可以成为结构的成员.除此之 外,还可以把一个结构作为另一个结构的成员,不仅指针可以是结构的成员, 结构指针也可以是结构的成员 . 将一个结构作为另一个结构的成员 声明结构中的结构 将结构指针用作结构成员 双向链表 结构中的位字段
C入门经典(第4版) 入门经典(
11.3.2 结构指针作为函数变元 11.
在调用函数时,传送给函数的是变元值的副本.如果变元是一个非常大 的结构,就需要相当多的时间,并占用结构副本所需的内存.在这种情况下, 应该使用结构指针作为变元.这可以避免占用内存,节省复制的时间,因为只 需复制指针.函数可以通过指针直接访问原来的结构.另外,使用指针给函数 传送结构,也提高了效率.重写siblings()函数,如下: 传送结构,也提高了效率.重写siblings()函数,如下: bool siblings(struct family *member1, struct family *member2) { if(strcmp(member1if(strcmp(member1->mother, member2->mother) == 0) member2return true; else return false; }
C入门经典(第4版) 入门经典(
11. 11.3.4 修改程序
下面创建一个例子,将结构指针作为变元和返回值.修改前一个例子( 下面创建一个例子,将结构指针作为变元和返回值.修改前一个例子(程序 11.6),在Family类型的结构中声明一些额外的指针p_to_pa和p_to_ma,如下 11.6),在Family类型的结构中声明一些额外的指针p_to_pa和p_to_ma,如下 所示: struct Family /* Family structure declaration */ { struct Date dob; char name[20]; char father[20]; char mother[20]; struct Family *next; /* Pointer to next structure */ struct Family *previous; /* Pointer to previous structure */ struct Family *p_to_pa; /* Pointer to father structure */ struct Family *p_to_ma; /* Pointer to mother structure */ };
将结构作为变元传给函数和传递一般变量没有什么不同.创建类似于horse的 将结构作为变元传给函数和传递一般变量没有什么不同.创建类似于horse的 结构,如下: struct family { char name[20]; int age; char father[20]; char mother[20]; };
C入门经典(第4版) 入门经典( 11.2.3 将结构指针用作结构成员 11.
任何指针都可以是结构的成员,包含结构指针在内.结构成员指针可以 指向相同类型的结构.例如,horse类型的结构可以含有一个指向horse类型结 指向相同类型的结构.例如,horse类型的结构可以含有一个指向horse类型结 构的指针.
C入门经典(第4版) 入门经典( 11.2.1 将一个结构作为另一个结构 11.
的成员
本章的开头为满足马饲养员的需要,设计了一个程序,处理每匹马的各 种数据,包括名字,身高和生日等,但程序11.1用年龄代替了生日.其部分原 种数据,包括名字,身高和生日等,但程序11.1用年龄代替了生日.其部分原 因是日期处理起来比较麻烦,要用3 因是日期处理起来比较麻烦,要用3个数值表示,还要处理闰年的问题.现在 准备将一个结构作为另一个结构的成员来处理日期 .
C入门经典(第4版) 入门经典(
11.1.6 结构指针 11.1.6
要获得结构的地址,就需要使用结构的指针.由于需要的是结构的地址, 因此需要声明结构的指针.结构指针的声明方式和声明其他类型的指针变量相 同,例如: struct horse *phorse; 这条语句声明了一个phorse指针,它可以存储horse类型的结构地址.现 这条语句声明了一个phorse指针,它可以存储horse类型的结构地址.现 在可以将phorse设置为一个特定结构的地址值,使用的方法和其他类型的指针 在可以将phorse设置为一个特定结构的地址值,使用的方法和其他类型的指针 完全相同,例如: phorse = &My_horses[1];
C入门经典(第4版) 入门经典(
11.1.1 定义结构类型和结构变量 11.1.1
可以将结构的声明和结构变量的声明分开.取代前面例子的语句如下: struct horse { int age; int height; char name[20]; char father[20]; char mother[20]; }; struct horse Dobbin = { 24, l7, "Dobbin", "Trigger", "Flossie" };
11. 11.3 结构与函数
结构表示C 结构表示C语言的一个强大特性,因此它与函数并用非常重要.现在探讨 如何把结构当成变元传递给函数,以及如何从函数中返回结构 . 结构作为函数的变元 结构指针作为函数变元 作为函数返回值的结构 修改程序 二叉树
C入门经典(第4版) 入门经典(
11.3.1 结构作为函数的变元 11.
C入门经典(第4版) 入门经典( 11.2.4 双向链表 11.
前一个例子创建的链表有一个缺点:只能往前走.其实,只需小小的修 改,就可以得到双向链表(doubly 改,就可以得到双向链表(doubly linked list),可以双向遍历链表.方法是除了 list),可以双向遍历链表.方法是除了 指向下一个结构的指针外,在每个结构中再添加一个指针,存储前一个结构的 地址 .