结构体数据类型与链表.ppt

上传人:小飞机 文档编号:6015432 上传时间:2023-09-14 格式:PPT 页数:45 大小:209.13KB
返回 下载 相关 举报
结构体数据类型与链表.ppt_第1页
第1页 / 共45页
结构体数据类型与链表.ppt_第2页
第2页 / 共45页
结构体数据类型与链表.ppt_第3页
第3页 / 共45页
结构体数据类型与链表.ppt_第4页
第4页 / 共45页
结构体数据类型与链表.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《结构体数据类型与链表.ppt》由会员分享,可在线阅读,更多相关《结构体数据类型与链表.ppt(45页珍藏版)》请在三一办公上搜索。

1、C语言程序设计教程,1,2023/9/14,9.1 结构体类型的定义9.2 结构体类型变量9.3 结构体类型数组9.4 结构体类型指针9.5 结构体与函数9.6 链表,第九章 结构体数据类型与链表,C语言程序设计教程,2,2023/9/14,9.1 结构体类型的定义,1.结构体类型的定义 struct 结构体名 类型标识符1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;;struct 结构体名 结构体类型名,结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。,C语言程序设计教程,3,2023/9/14,2、关于结构体类型的说

2、明:“struct 结构体名”是一个类型名,它和int、float等作用一样可以用来定义变量。结构体名是结构体的标识符不是变量名,也不是类型名。构成结构体的每一个类型变量称为结构体成员,它象数组的元素一样,但数组中元素以下标来访问的,而结构体是按结构体变量名来访问成员的。结构体中的各成员既可以属于不同的类型,也可以属于相同的类型,而数组中的元素是属于同一类型的。成员也可以是一个结构体类型,如:,C语言程序设计教程,4,2023/9/14,struct dateint month;int day;int year;,struct personfloat num;char name20;char

3、sex;int age;struct date birthday;char address10;,C语言程序设计教程,5,2023/9/14,9.2 结构体类型变量,9.2.1 结构体类型变量的定义1.先定义结构体类型,再定义结构体变量,形式:struct 结构体名 类型标识符 1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;struct 结构体名 变量名表;,例如:struct student char name20;char sex;int age;float score;;,struct student stu1,stu2;,C语言程序设计教程,6,2023/9/14,2.

4、在定义结构体类型的同时定义变量,形式:struct 结构体名 类型标识符 1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;变量名表;,例如:struct student char name20;char sex;int age;float score;stu1,stu2;,C语言程序设计教程,7,2023/9/14,3.用匿名形式直接定义结构体类型变量,形式:struct 结构体名 类型标识符 1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;变量名表;,例如:struct char name20;char sex;int age;float score;stu1,s

5、tu2;,C语言程序设计教程,8,2023/9/14,9.2.2 结构体变量的使用,结构体是一种新的数据类型,因此结构体变量也可以象其它类型的变量一样赋值、运算,不同的是结构体变量以成员作为基本变量。结构体成员的表示方式为:结构体变量名.成员名 其中的圆点运算符称为成员运算符,它的运算级别最高。如果将结构体变量名.成员名看成一个整体,则这个整体的数据类型与结构体中该成员的数据类型相同,这样就可象前面所讲的变量那样使用,但应遵循以下规则:,C语言程序设计教程,9,2023/9/14,(1)不能将一个结构体变量作为一个整体进行输入和输出,而只能对结构体变量中的各个成员分别进行输入和输出。,stru

6、ct dateint month;int day;int year;day;scanf(“%d%d%d”,day);(错误)scanf(“%d%d%d”,(正确),C语言程序设计教程,10,2023/9/14,(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符(.),一级一级地找到最底的一级的成员,只能对最底级的成员进行赋值或存取运算.,struct dateint month;int day;int year;,struct studentlong num;char name20;char sex;int age;struct date birthday;char depart10

7、;stu1;,如:stu1.birthday.year=2004;stu1.birthday.month=12;,(3)对结构体变量的成员可以像同类型普通变量一样进行各种运算。,C语言程序设计教程,11,2023/9/14,9.2.3 结构体变量的初始化与存储,结构体变量的初始化:在定义结构体变量的同时 给它赋以初值。,struct student char name20;char sex;int age;float score;stu1,stu2=“Wangwu”,m,20,88.5;,C语言程序设计教程,12,2023/9/14,2.结构体变量存储分配示意图,C语言程序设计教程,13,20

8、23/9/14,9.3 结构体数组,9.3.1 结构体数组的定义 结构体是一种新的数据类型,同样可以有结构体数组。1、结构体数组的定义 结构体数组就是具有相同结构体类型的变量集合。,假如要定义一个班级105个同学的学号、姓名、性别、年龄,可以定义成一个结构体数组。如下所示:struct long num;char name20;char sex;int age;stu105;,C语言程序设计教程,14,2023/9/14,struct student long num;char name20;char sex;int age;float score;char add5;stu3=101,”WG

9、J”,M,28,88.5,”CS”,102,”DYH”,F,26,88.0,”CS”,103,”DYC”,M,24,78.5,”CS”;,9.3.2 结构体数组变量的初始化一般形式是在定义的数组后面加上=初值表列;,数组各元素在内存中连续存放,结构体数组成员的访问是以数组元素为结构体变量的,其形式为:结构体数组元素名.成员名 如:stu2.age 结构体数组的成员也可以是数组。struct student long num;char name20;char sex;int age;float score3;char add5;stu5;,9.3.3 结构体数组的使用,例9.1 候选人得票的统计

10、。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,C语言程序设计教程,17,2023/9/14,struct person char name20;int count;leader3=Zhang,0,Li,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+;printf(n);for(i=0;i3;i+)printf(%5s:%

11、dn,leaderi.name,leaderi.count);,C语言程序设计教程,18,2023/9/14,9.4 结构体类型指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以定义一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。,9.4.1 指向结构体变量的指针,1.指向一个结构体变量的指针定义形式:struct 结构体名*指针变量名;例如:struct student long int num;char name20;char sex;float score;,C语言程序设计教程,19,2023/9/14,2.由指向结构体的指针变量引用结构体

12、成员的形式为:(*指针变量名).成员名 或 指针变量名-成员名-为指向运算符如:上面示例用指针变量引用其成员的方式为:(*pstu).num,(*pstu).name(*pstu).sex,(*pstu).score可以等价表示为:pstu-num,pstu-name,pstu-sex,pstu-score,struct student*pstu,stu;pstu=/*不要认为结构体变量名代表起始地址*/,C语言程序设计教程,20,2023/9/14,例9.2 比较结构体成员的几种引用方式#include string.hmain()struct student long int num;ch

13、ar name20;char sex;float score;struct student stu_1;struct student*p;,C语言程序设计教程,21,2023/9/14,p=,C语言程序设计教程,22,2023/9/14,9.4.2 指向结构体数组元素的指针,一个指针变量可以指向一个结构体数组元素(将该结构体数组的数组元素地址赋给此指针变量)。例如:struct int a;float b;arr3,*p;p=arr;此时使p指向arr数组的第一个元素,“p=arr;”等价于“p=”则此时指针变量p此时指向arr1。,C语言程序设计教程,23,2023/9/14,例9.3 输出

14、数组中各元素中各成员的值。struct student int num;char name20;char sex;int age;struct student stu3=,10101,Zhang,M,18,10102,Li,M,19,10103,Wang,F,20;,main()struct student*p;printf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);,C语言程序设计教程,24,2023/9/14,指针移动示意图:,stu0,stu1,stu2,P,P,P”,20,F,Wang,10103,19,M,Li,1010

15、2,18,M,Zhang,10101,C语言程序设计教程,25,2023/9/14,注意:如果p的初值为stu,即指向第一个元素,则p+1后指向下一个元素。请区别:(+p)-num 和(p+)-num 指针p已定义为指向struct student类型的数据,它只能指向该结构体类型数据,而不能指向一元素的某一成员(即p的地址不能是成员的地址)。如下面的赋值是错误的:p=&stu.num编译时将给出“警告”信息,表示地址的类型不匹配。不要认为反正p是存放地址的,可以将任何地址赋给它。,C语言程序设计教程,26,2023/9/14,将一个结构体变量的值传递给另一个函数,可以采用以下两种方式:用结构

16、体变量的成员作参数。用法和普通变量作实参是一样的,属“值传递”方式。形参与实参都用结构体变量 直接将实参结构体变量的各个成员的值全部传递给形参的结构体变量。注意:实参和形参类型应当完全一致。,9.5.1 结构体变量作函数参数,9.5 结构体与函数,C语言程序设计教程,27,2023/9/14,struct stud int num;char name20;int score3;main()void print(struct stud p);struct stud stu;int j;scanf(“%d”,例9.4 有一个结构体变量stu,内含学生学号、姓名和三门课的成绩。要求在main函数中赋

17、值,在另一函数print中将它们打印输出,程序如下。,C语言程序设计教程,28,2023/9/14,值得指出的是,把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,开销大,因此一般不采用。,注意:ANSI C允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同。,void print(struct stud p)int j;printf(%dn%sn”,p.num,p.name,);for(j=0;j3;j+)printf(“%dn”,C语言程序设计教程,29,2023/9/14,用指向结构体变量(或数组)的指针作实参,将结构体变量(

18、或数组)的起始地址传给形参。形参为指针变量,实参为结构体变量的地址或指向结构体变量的指针。,9.5.2 用指向结构体的指针作函数参数,例9.4 的print函数形参改用指向结构体的指针后程序如下:,C语言程序设计教程,30,2023/9/14,#include string.hstruct student int num;char name20;int score3;main()void print(struct student*p);struct student stu;int j;scanf(“%d”,void print(struct student*p)int j;printf(%dn

19、%sn”,p-num,p-name,);for(j=0;jscorej);,C语言程序设计教程,31,2023/9/14,9.5.3 返回结构体类型值的函数,ANSI C还允许函数返回结构体类型的值。设有 struct student 类型,结构体变量定义如下:struct student stud;若函数input()的功能是输入一个学生结构体数据,并将其返回给学生记录stud,即:,#include stdio.hstruct student int num;char name10;int score3;,C语言程序设计教程,32,2023/9/14,struct student inpu

20、t()int k;struct student stud;scanf(%d,main()struct student stud;int k;stud=input();printf(%d%s,stud.num,stud.name);for(k=0;k3;k+)printf(%d,stud.scorek);,C语言程序设计教程,33,2023/9/14,9.6 链表 链表概述 链表是一种常见的重要的数据结构,它是动态地进行存储分配的一种结构,根据需要开辟内存单元,使用链表可以减少内存空间的浪费。所谓链表是指若干个结构体变量(每个结构体变量称为一个“结点”)按一定的原则连接起来。每个结构体变量都包含

21、有若干个数据和一个指向下一个结构体变量的指针,依靠这些指针将所有的结构体变量连接成一个链表。例、建立和输出一个简单链表,struct student long num;char name20;struct student*next;main()struct student a,b,c,*head,*p;a.num=2002001;b.num=2002002;c.num=2002003;strcpy(a.name,”zhang”);strcpy(b.name,”sun”);strcpy(c.name,”li”);head=本例所有结点都是在程序中定义的,不是临时开辟的,C语言程序设计教程,35,

22、2023/9/14,链表结构是动态分配存储的,即在需要时才开辟一个结点的存储单元,怎样开辟呢?C语言编译系统中提供了以下有关的函数:1、分配存储空间函数malloc()malloc()函数的原型为:void*malloc(unsigned int size);函数的作用是在内存自由空间开辟一块大小为 size 字节的空间,并将此存储空间的起始地址作为函数值带回。例如,malloc(10)的结果是分配了一个长度为10字节的内存空间,若系统设定的此内存空间的起始地址为1800,则 malloc(10)的函数返回值就为1800。,、内存管理库函数,C语言程序设计教程,36,2023/9/14,例9.

23、6 malloc函数的使用,main()int j,n,*p;printf(nplease input a data to n:);scanf(%d,C语言程序设计教程,37,2023/9/14,2、calloc函数 函数原型为:void*calloc(unsigned int num,unsigned int size);功能为:分配num个size字节的空间。3、重新分配空间函数 realloc()函数原型为:void*realloc(void*ptr,unsigned int size);函数用于使已分配的空间改变大小,即重新分配。其作用是将ptr指向的存储区(是原先用malloc函数分

24、配的)大小改为size个字节,可以使原先的分配区扩大也可以缩小。它的返回值是一个指针,即新的存储区的首地址。,C语言程序设计教程,38,2023/9/14,4、释放空间函数 free()该函数的原型为:void free(void*ptr);该函数的功能为:将指针 ptr 指向的存储空间释放,交还给系统,系统可以另行分配作它用。必须指出,ptr 值不能是随意的地址,而是只能是程序在运行时通过动态申请分配到的存储空间的首地址。下面的做法是正确的:pt=(int*)malloc(10);free(pt);,C语言程序设计教程,39,2023/9/14,链表的基本操作包括建立动态链表、链表的插入、删

25、除、输出和查找等。1.建立动态链表 所谓建立动态链表是指一个一个地输入各结点数据,并建立起各结点前后相链的关系。建立动态链表有两种方式:一种是在链表尾插入节点,一种是在链表头插入节点。下面通过一个例子来说明如何建立一个动态链表。,、链表的基本操作,例、写一个函数建立一个若干学生数据的单向动态链表。#define NULL 0struct student long num;struct student*next;,struct student*creat()struct student*head,*p,*q;long x;q=head=(struct student*)malloc(sizeof

26、(struct student);head-next=NULL;printf(nplease input datds to the list:);scanf(%ld,C语言程序设计教程,41,2023/9/14,2、输出链表void print(struct student*head)struct student*p;p=head-next;printf(“nTHe list is:”);if(p=NULL)printf(“the list is NULL!n”);while(p!=NULL)printf(%6ld,p-num);p=p-next;printf(“n”);,C语言程序设计教程,

27、42,2023/9/14,3、删除链表中的一个结点void del(struct student*head)struct student*p,*q;long num;printf(nplease input the studentnum you want to delete:);scanf(%ld,C语言程序设计教程,43,2023/9/14,4、在链表中插入一个结点 void insert(struct student*head)struct student*p,*q,*t;p=(struct student*)malloc(sizeof(struct student);printf(npl

28、ease input the student you want to insert:);scanf(%ld,C语言程序设计教程,44,2023/9/14,5、对链表的综合操作void main()struct student*la;la=creat();print(la);del(la);print(la);insert(la);print(la);,C语言程序设计教程,45,2023/9/14,9.6.3 链表与结构体数组的主要区别,1、数组的元素个数是固定的,而组成链表的结点个数可按需要增减;2、数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。3、对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。另外,对于元素的插入、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号