C语言程序设计结构体_第1页
C语言程序设计结构体_第2页
C语言程序设计结构体_第3页
C语言程序设计结构体_第4页
C语言程序设计结构体_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 n9.1 结构体类型结构体类型n9.2 结构体变量结构体变量n9.3 结构体数组结构体数组n9.4 结构体指针结构体指针n9.5 链表概述链表概述n9.6 链表的基本操作链表的基本操作n学生信息表与结构体数据学生信息表与结构体数据n在程序中使用结构体数据的一般过程在程序中使用结构体数据的一般过程u 针对具体的组合数据,定义专门针对具体的组合数据,定义专门的结构体数据类型。的结构体数据类型。u 使用定义好的数据类型,定义要使用定义好的数据类型,定义要使用的结构体变量。使用的结构体变量。u 使用定义的结构体变量存储和表使用定义的结构体变量存储和表示结构体数据。示结构体数据。n定义结构体类型的一般

2、格式定义结构体类型的一般格式struct 结构体名结构体名 成员表成员表;说明:说明: “结构体名结构体名”是用户定义的结构体的名字,在以后定义结构体变是用户定义的结构体的名字,在以后定义结构体变量时,使用该名字进行类型标识。量时,使用该名字进行类型标识。 “成员表成员表”是对结构体数据中每一个数据项的变量说明,其格式是对结构体数据中每一个数据项的变量说明,其格式与说明一个变量的一般格式相同,如下:与说明一个变量的一般格式相同,如下:数据类型名数据类型名 成员名成员名; “struct”是关键字,是关键字,“struct结构体名结构体名”是结构体类型标识符,是结构体类型标识符,在类型定义和类型

3、使用时在类型定义和类型使用时“struct”都不能省略。都不能省略。 结构体名称可以省略,此时定义的结构体称为无名结构体。结构体名称可以省略,此时定义的结构体称为无名结构体。如下是对学生组合数据的结构体类型定义:如下是对学生组合数据的结构体类型定义:struct student int num; /* 学号学号 */ char name20; /* 姓名姓名 */ char sex; /* 性别性别 */ int age; /* 年龄年龄 */ int score; /* 成绩成绩 */ char addr30; /* 地址地址 */;当结构体的成员又是结构体时,称为当结构体的成员又是结构体时

4、,称为结构体的嵌套结构体的嵌套。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; 先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。n一般格式一般格式struct 结构体类型名称结构体类型名称 结构体变量名;结构体变量名;如:如:struct student student1,student2; 在定义结构体类型的同时定义结构体变量。在定义结

5、构体类型的同时定义结构体变量。n一般格式如下:一般格式如下:struct 结构体名结构体名 成员表成员表结构体变量结构体变量1, 结构体变量结构体变量2,结构体变量,结构体变量n;例如:例如:struct studentint num; char name20;char sex;int age; int score;char addr30; student1, student2; 不定义结构体类型名,直接定义结构体类型变量。不定义结构体类型名,直接定义结构体类型变量。n一般格式如下:一般格式如下:struct 成员表成员表;结构体变量结构体变量1,结构体变量结构体变量2,结构体变量结构体变量n

6、;例如:例如:structint num; char name20;char sex;int age; int score;char addr30;student1, student2;n引用结构体成员的一般格式引用结构体成员的一般格式结构体变量名结构体变量名.成员名称成员名称如:如:student1.agen“.”是结构体成员运算符,是结构体成员运算符,“.”操作的优先级在操作的优先级在语言中是最高的,其结合性为从左到右。语言中是最高的,其结合性为从左到右。 n例例9-1 输入一个学生的一组数据,然后输出其姓输入一个学生的一组数据,然后输出其姓名、年龄和地址。名、年龄和地址。程序程序9-1说

7、明:说明: 对结构体变量进行输入输出时,只能以成员引用的方对结构体变量进行输入输出时,只能以成员引用的方式进行,不能对结构体变量进行整体的输入输出。式进行,不能对结构体变量进行整体的输入输出。 当成员又是一个结构体类型时,若要引用它的成员,当成员又是一个结构体类型时,若要引用它的成员,要从高到低逐级引用。如:要从高到低逐级引用。如: 与其他变量一样,结构体变量成员可以进行各种运算与其他变量一样,结构体变量成员可以进行各种运算。 n结构体变量的初始化结构体变量的初始化,是在定义,是在定义结构体变量的同时,对其成员赋结构体变量的同时,对其成员赋初值。初值。n结构体变量初始化的一般形式结构体变量初始

8、化的一般形式struct 结构体名结构体名 结构体变量结构体变量=初初始化数据始化数据;n说明:说明: “ ”中的初始化数据用逗号中的初始化数据用逗号“,”分隔。分隔。 初始化数据的个数与结构体成员初始化数据的个数与结构体成员的个数应相同,它们是按成员的的个数应相同,它们是按成员的先后顺序一一对应赋值的。先后顺序一一对应赋值的。 每个初始化数据必须符合与其对每个初始化数据必须符合与其对应的成员的数据类型。应的成员的数据类型。例如:struct student int num; char name20; char sex; int age; int score; char addr30;stu=

9、9901,liujia,M,19,87,shanghai;数组元素是结构体类型的数组,称为结构体数组。定义方法与其他结构体变数组元素是结构体类型的数组,称为结构体数组。定义方法与其他结构体变量的定义方法相同量的定义方法相同 。 先定义结构体类型,然后用结构体类型定义数组变量。先定义结构体类型,然后用结构体类型定义数组变量。如:如:struct student information100;引用结构体数组成员的一般格式:引用结构体数组成员的一般格式:结构体数组名结构体数组名下标下标.成员名成员名如:如:information20.score=91; 定义结构体类型的同时,定义数组变量。定义结构体

10、类型的同时,定义数组变量。 定义无类型名的结构体数组变量。定义无类型名的结构体数组变量。例如:例如:struct int year; int month; int day; date110,date210;n结构体数组的初始化结构体数组的初始化,就是在定义结构体数组,就是在定义结构体数组的同时,为结构体数组元素赋初值。的同时,为结构体数组元素赋初值。n例如:例如:struct student info3= 9901,liujia,M,19,87,shanghai,9902,wangkai,M,18,89,beijing,9903,xiaohua,F,20,81,qingdao;例例9-2 按照

11、表按照表9-1的数据情况,输入一个班级的学生信的数据情况,输入一个班级的学生信息,并进行如下处理:息,并进行如下处理: 把学习成绩在把学习成绩在85以上的学生找出来,并输出这部分以上的学生找出来,并输出这部分学生如下信息:姓名、成绩、地址。学生如下信息:姓名、成绩、地址。 分别统计出男生和女生人数。分别统计出男生和女生人数。分析:分析:这个问题可以分成三个步骤处理:这个问题可以分成三个步骤处理: 定义一个结构体类型,并用它定义一个存储学生信息定义一个结构体类型,并用它定义一个存储学生信息的结构体数组;的结构体数组; 向结构体数组中输入学生数据;向结构体数组中输入学生数据; 统计,并输出结果。统

12、计,并输出结果。程序程序9-2n指向结构体变量的指针,称为指向结构体变量的指针,称为结构体指针结构体指针。与其他类型的指针一样,结构体指针既可与其他类型的指针一样,结构体指针既可以指向单一的结构体变量,也可以指向结以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针还可以作函数构体数组变量,结构体指针还可以作函数的参数。的参数。 n定义结构体指针变量的一般形式:定义结构体指针变量的一般形式:struct 结构体名结构体名 *结构体指针变量名结构体指针变量名;例如:例如:struct student *p,*q;struct student stud1,info10;p=&stu

13、d1; / * p指向结构体变量指向结构体变量stud1 */q=info; /* q指向结构体数组变量指向结构体数组变量info */n指向结构体变量的指针,称为指向结构体变量的指针,称为结构体指针结构体指针。与其他类型的指针一样,结构体指针既可与其他类型的指针一样,结构体指针既可以指向单一的结构体变量,也可以指向结以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针还可以作函数构体数组变量,结构体指针还可以作函数的参数。的参数。 n定义结构体指针变量的一般形式:定义结构体指针变量的一般形式:struct 结构体名结构体名 *结构体指针变量名结构体指针变量名;例如:例如:struct

14、 student *p,*q;struct student stud1,info10;p=&stud1; / * p指向结构体变量指向结构体变量stud1 */q=info; /* q指向结构体数组变量指向结构体数组变量info */n对指向结构体数组的指针,当指针进行加对指向结构体数组的指针,当指针进行加1或或减减1运算时,其结果就是将指针指向上一个或运算时,其结果就是将指针指向上一个或者下一个结构体数组元素。者下一个结构体数组元素。 例例9-4 结构体指针用法示例。结构体指针用法示例。#include stdio.h#include string.hstruct stud char

15、 *number; char name20; int score;main() struct stud student,*p; p=&student; p-number=991001; strcpy(p-name,changjiang); student.score=91; printf(n); printf(student No.%snname:%snscore:%dn,p-number,p-name,p-score); 例例9-5指向结构体数组指针的应用示例。指向结构体数组指针的应用示例。#include stdio.hstruct stud char *number; char

16、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-8用结构体指针作函数的参数,改写例用结构体指针作函数的参数,改写例9-7的程序。的程序。#include stdio.h#define N 5 /* 全班学生数全班学生数 */struct stu_info char num7; /* 学生学号学生学号

17、*/ 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

18、 temp; /* 定义结构体变量,用于结构体数据的交换定义结构体变量,用于结构体数据的交换 */ for(i=1;in;i+) /* 冒泡法排序,降序冒泡法排序,降序 */ for (j=0;jN-i;j+) if(pj.scorenext=p-next; 把把new的首地址存储到结点的首地址存储到结点p的指针域中。的指针域中。p-next=new;例例9-9 用插入结点的方法建立图示的学生成绩链表,链表用插入结点的方法建立图示的学生成绩链表,链表head有有10个结点,每个结点存储一个学生的学号和学个结点,每个结点存储一个学生的学号和学习成绩数据。习成绩数据。程序程序9-9n函数的功能函数

19、的功能ucreat_node()函数:生成一个链表结点。函数:生成一个链表结点。ucreat_list()函数:生成有函数:生成有n个个struct s_node型结型结点的链表,函数的返回值是链表的头指针。点的链表,函数的返回值是链表的头指针。uout_list()函数:用于输出函数:用于输出head链表的各结点值。链表的各结点值。n从链表中删除结点,就是撤销结点在链表中的链接,把结点从链表从链表中删除结点,就是撤销结点在链表中的链接,把结点从链表中孤立出来。在链表中删除结点一般有两个过程:中孤立出来。在链表中删除结点一般有两个过程:u把指定的结点从链表中拿下来,它需要通过修改有关结点的指把

20、指定的结点从链表中拿下来,它需要通过修改有关结点的指针域来实现;针域来实现;u释放该结点使用的内存空间,它需要使用释放该结点使用的内存空间,它需要使用free()函数来实现。函数来实现。 删除删除p结点的过程:结点的过程: 若若p结点是链表的第一个结点,则将结点是链表的第一个结点,则将p指针域的地址保存到指针域的地址保存到head中,中,使使p的后继结点成为的后继结点成为head链表的第一个结点,然后转步骤链表的第一个结点,然后转步骤。修改指针的操作如下:修改指针的操作如下:head=head-next;或或head=p-next; 若若p结点不是链表的第一个结点,则首先从结点不是链表的第一个

21、结点,则首先从head开始,找到开始,找到p结点结点的前一个结点的前一个结点q,然后使,然后使q的指针域存储的指针域存储p的后继结点的地址,这样的后继结点的地址,这样沿链表的指针访问链表中的结点时,沿链表的指针访问链表中的结点时,p结点将不会被访问到,亦即结点将不会被访问到,亦即p结点从链表结点从链表head中被删除了。中被删除了。修改指针的操作如下:修改指针的操作如下:q-next=p-next; 释放释放p结点使用的内存空间。结点使用的内存空间。free(p); 删除结删除结点点p后后的的head链表链表 : n在链表中进行查找,就是从链表的第一个结点开始,沿在链表中进行查找,就是从链表的

22、第一个结点开始,沿着指针链,用查找值与链表结点逐个比较的过程。找到着指针链,用查找值与链表结点逐个比较的过程。找到符合要求的结点之后,停止查找过程,返回相应结点的符合要求的结点之后,停止查找过程,返回相应结点的指针,否则返回一个空指针。指针,否则返回一个空指针。n在在head链表中查找链表中查找data值为值为m的结点的过程,其中的结点的过程,其中p为为struct node型指针:型指针:u p=head;u 当当pNULL时,若时,若p-data=m,则找到要求,则找到要求结点,查找结束,返回结点地址结点,查找结束,返回结点地址p;否则,执行下一;否则,执行下一步步;当;当p= NULL时

23、,链表中不存在要找的结点,时,链表中不存在要找的结点,查找结束,返回空指针查找结束,返回空指针NULL;u p=p-next;u 重复重复、步骤。步骤。查找函数查找函数find() :#include stdio.hstruct node *find(struct node *head,int m) struct node *p=head; while(p!=NULL&p-data!=m) p=p-next; if(p=NULL) return(NULL) else return(p);例例9-10对图示的对图示的head链表,删除其值是链表,删除其值是x的结点。具体要的结点。具体要求

24、如下:求如下: 输出被删除结点的值;输出被删除结点的值; 当指定值结点不存在时,显示一个提示信息;当指定值结点不存在时,显示一个提示信息; x的值由键盘输入。的值由键盘输入。n分析:分析:该问题的关键点有两点:该问题的关键点有两点:u查找查找data等于等于x的结点的结点p;u删除删除p结点。结点。程序程序e9-10 n例例9-11 Josephus问题问题有有n个人围成一圈,从个人围成一圈,从1开始顺序编号到开始顺序编号到n,现在从,现在从1号开号开始顺时针从始顺时针从1数数,数到数数,数到m者自动出列,然后从下一个人者自动出列,然后从下一个人开始重新数数,仍然每次数到开始重新数数,仍然每次

25、数到m者自动出列。请给出这者自动出列。请给出这n个人出列的顺序。个人出列的顺序。方法:方法:用循环链表用循环链表 解决解决Josephus问题问题n用循环链表实现用循环链表实现Josephus问题的基本算法问题的基本算法首先设置首先设置p指针,其初值为指针,其初值为head。然后开始对。然后开始对p指向的结指向的结点数数,每数一个结点后,点数数,每数一个结点后,p指针便沿指针链下移一个位指针便沿指针链下移一个位置(置(p=p-next),指向下一个结点。当),指向下一个结点。当p指向的结点数指向的结点数到到m时,输出该结点的值并将其从链表中删除(出列),时,输出该结点的值并将其从链表中删除(出

26、列),这时使这时使p指向下一个结点,然后从指向下一个结点,然后从1开始重新数数。当链表开始重新数数。当链表中只有一个结点时,数数结束,输出该结点。中只有一个结点时,数数结束,输出该结点。 只有一个结点只有一个结点的循环链表的循环链表程序程序9-111结构体是一种新型的数据类型,它与前面使用的数据类型的主要区结构体是一种新型的数据类型,它与前面使用的数据类型的主要区别有两点:别有两点:u结构体数据类型不是系统固有的,它需要由用户自定义,在一个结构体数据类型不是系统固有的,它需要由用户自定义,在一个程序中可以有多个各不相同的结构体类型;程序中可以有多个各不相同的结构体类型;u一个结构体数据类型是多

27、个不同成员的集合,这些成员可以具有一个结构体数据类型是多个不同成员的集合,这些成员可以具有不同的类型。不同的类型。2“struct”是结构体数据类型的关键字,定义和使用结构体类型时都是结构体数据类型的关键字,定义和使用结构体类型时都必须使用该关键字。必须使用该关键字。3结构体变量的定义有结构体变量的定义有3种方法:先定义结构体类型,再定义结构体变种方法:先定义结构体类型,再定义结构体变量;在定义结构体类型的同时定义结构体变量;不定义结构体类型名,量;在定义结构体类型的同时定义结构体变量;不定义结构体类型名,直接定义结构体类型变量。直接定义结构体类型变量。4引用结构体成员的方法主要有两种:使用结构体变量名引用结构体引用结构体成员的方法主要有两种:使用结构体变量名引用结构体成员;通过指向结构体变量的指针引用结构体成员。成员;通过指向结构体变量的指针引用结构体成员。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论