C程序设计课件第07章.ppt

上传人:本田雅阁 文档编号:2142443 上传时间:2019-02-21 格式:PPT 页数:68 大小:383.01KB
返回 下载 相关 举报
C程序设计课件第07章.ppt_第1页
第1页 / 共68页
C程序设计课件第07章.ppt_第2页
第2页 / 共68页
C程序设计课件第07章.ppt_第3页
第3页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C程序设计课件第07章.ppt》由会员分享,可在线阅读,更多相关《C程序设计课件第07章.ppt(68页珍藏版)》请在三一文库上搜索。

1、第7章 结构体,结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型 结构体可以容纳需要的任意多数据项 结构体中的变量称为结构体元素或结构体成员,struct student char name11; int grade; int number; ;,姓名 年级 学号,学生,声明结构体变量,一旦定义了结构体,就可以声明一个或多个该类型的变量 示例:struct student h1; 这条语句将会预留足够的内存来存放该结构体中的所有项,struct student char name11; int grade; int number; h1, h2;,struct student

2、h1; struct student h2; struct student h3, h4;,定义时,声明结构体变量,先定义,后声明,结构体类型与结构变量的最大区别在于:结构变量占有一定的内存空间,而结构体类型只是一种数据类型的结构描述,并不占用内存空间。 struct box float length; float width; float height; ; 它表明struct box结构体类型由大括号中所列的一些数据项组成,共需占用4x3=12个字节。 在此之后,若进行结构变量的定义如: struct box box1; 表明box1为struct box结构体类型变量,它占用了12个字节

3、的内存单元。,初始化结构体,student 类型的变量 h1 和 h2 可以按照下面的方式进行声明和初始化:,struct student h1 = “张三”, 3, 20050101; struct student h2 = “李四”, 3, 20050102;,struct student char name11; int grade; int number; ;,结构体中使用的赋值语句,可以使用一条简单的赋值语句将一个结构体变量的值赋给另一个相同类型的结构体变量 例如,如果 h1 和 h2 是同一类型的结构体变量,那么下列语句是有效的: h2 = h1;,访问结构体元素,结构体元素通过使

4、用点运算符(.)来引用,这个运算符也称为成员运算符 语法: 结构体变量名.元素名 示例: cin h1. name;,#include void main() struct student char name10; int chinese; int english; score; coutscore.name; coutscore.chinese; coutscore.english; /为结构体元素赋值,cout“姓名: score.nameendl; cout“语文: “score.chineseendl; cout“英语: “score.englishendl; /输出结构体元素,结构体

5、范例,结构体数组,首先定义结构体,然后声明该类型的数据变量 示例: struct student stu5; 访问数组 stu的第三个元素中的变量 number : stu2.number,结构体数组的初始化,结构体数组是通过用一对大括号将其元素值列表括起来进行初始化的 示例:,struct student stu3 = “张三”, 3, 20050101, “李四”, 3, 20050102, “赵飞”, 3, 20050103 ,【例】计算学生的平均成绩并统计出不及格的人数。 #include struct stu int num; char name20; char sex; float

6、 score; student3=200001,“Li li“,W,99,200002,“Wang hai“,M,85, 200003,“Liu ying“,W,50; void main() int i,n; float average,sum; n=0; sum=0;,for(i=0;i3;i+) sum+=studenti.score; if(studenti.score60) n+=1; coutsumendl; average=sum/3; coutaverageendlnendl; ,结构体指针,结构体指针是通过在结构体变量名前放置一个星号(*)来进行声明的 - 运算符用于通过指针

7、来访问结构体的元素 示例: struct student *p, h1; p = ,这三种用于表示结构成员的形式是完全等效的。 结构变量.成员名 (*结构指针变量).成员名 结构指针变量-成员名 请注意分析下面几种运算: s-n 得到s指向的结构变量中的成员n的值 s-n+ 得到s指向的结构变量中的成员n的值,用完该值后使 它加1 +s-n 得到s指向的结构变量中的成员n的值使之加1,【例】通过结构指针引用结构体成员。 #include “iostream.h“ struct stu int num; char name20; char sex; float score; student1=1

8、02,“Zhang ping“,M,78.5,*s; void main() s= ,指向结构数组,当结构指针指向一个结构数组时,该指针变量的值是整个结构数组的首地址。,【例】用指针变量输出结构数组。 #include “iostream.h“ struct stu long int num; char name20; char sex; float score; student3=200001,“Li li“,W,99,200002,“Wang hai“,M,85, 200003,“Liuying “,W,50; void main() struct stu *s; for(s=studen

9、t;snumnameendl; ,结构指针作函数参数,使用结构指针,即用指向结构变量(或数组)的结构指针作函数参数进行传送,这时由实参向形参传递的是地址,属于“地址传递”方式,减少了时间和空间上的开销。,【例】用结构指针变量作函数参数编程,计算一组学生的平均成绩 #include “iostream.h“ struct stu long int num; char name20; char sex; float score; student3=200001,“Li li“,W,99,200002,“Wang hai“,M,85, 200003,“Liuying “,W,50;,void ave

10、rage(struct stu *ps) int n=0,i; float ave,s=0; for(i=0;iscore; ave=s/3; cout“average=“aveendl; void main() struct stu *s; s=student; average(s); ,动态存储分配函数,分配内存空间函数malloc,分配内存空间函数calloc,释放内存空间函数free,分配内存空间函数malloc 调用形式:(类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执

11、行,则返回的值为0。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。 例如:pc=(char *) malloc (100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。,分配内存空间函数calloc 调用形式:(类型说明符*) calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执行,则返回的值为0。 例如:语句ps=(struct stu*) calloc(2,sizeof(s

12、truct stu);中的函数sizeof(struct stu)是求struct stu结构体类型的长度。因此该语句的意思是:按照struct stu的长度分配2块连续区域,强制转换为struct stu类型,并把其首地址赋予指针变量ps。,释放内存空间函数free 调用形式:free (void*ptr); 功能:释放ptr所指向的内存空间,ptr指向被释放区域的首地址,被释放区应是由malloc或calloc函数所分配的空间。ptr是一个无类型的指针变量。,【例】分配一块区域,输入一个学生数据。 #include “iostream.h“ #include “malloc.h“ #inc

13、lude “string.h“ void main() struct stu int num; char name20; char sex; float score; *s;,s=(struct stu*)malloc(sizeof(struct stu); s-num=102; strcpy(s-name,“Zhang ping“); s-sex=M; s-score=62.5; coutnumnamesexscoreendl; free(s); ,链表的使用,链表是一种常见的、重要的数据结构,它采用动态的分配办法为一个结构体分配内存空间。 一方面需要时就分配一块空间用来存放,从而节约了宝贵

14、的内存资源;且便于删除与加入。 另一方面,在动态分配时,每个结点之间可以是不连续的(结点内是连续的),结点之间的联系是通过指针来实现的,即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。 这样一种连接方式,如同一条一环接一环的链子,在数据结构中称之为“链表”。,struct stu int num; int score; struct stu *next; ; 在该结构体中前两个成员项组成数据域,最后一个成员项next构成指针域,它是一个指向struct stu类型的结构指针变量。,单链表的常用操作:结点的插入、删除、检索和排序等。,建立链表,【例

15、】编写一个建立单向链表的函数,存放学生数据。 #include #include “malloc.h“ #define NULL 0 /*令NULL为0,用它表示空地址*/ #define LEN sizeof (struct stu) struct stu long int num; float score; struct stu *next; ;,int n; struct stu *creat() /*此函数返回一个指向链表头的指针*/ struct stu *head,*p1,*p2; n=0; /*n为结点的个数*/ p1=p2=(struct stu *)malloc(LEN);

16、/*开辟一个新单元*/ cinp1-nump1-score; head=NULL; while(p1-num!=0) n=n+1; if (n=1)head=p1; else p2-next=p1;,p2=p1; p1=( struct stu *)malloc(LEN); cinp1-nump1-score; p2-next=NULL; return(head); /*返回链表的头地址*/ 图7-1、图7-2、图7-3、图7-4、图7-5表示出creat函数的执行过程。,图7-1,图7-2,图7-3(a),图7-3(b),图7-3(c),图7-4(a),图7-4(b),图7-4(c),图7-

17、5,链表的输出,将链表中各结点的数据依次输出,首先要知道链表头元素的地址。程序执行过程可见图7-6所示。 【例】写一个函数,输出链表中所有结点。 void print(head) /*由实参将已有的链表的头指针传给被调函数*/ struct stu *head; struct student *p; p=head; /* p指向头结点*/ while(p!=NULL) coutnumscorenext; /*使p指向下一个结点*/ ,图7-6,链表的删除操作,从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来。 分析:设两个指针变量p1和p2,先使p1指向第一个结点

18、。删除一个结点有两种情况: 一种情况是要删除结点是第一个结点,此时只需使head指向第二个结点即可,即head=p1-next,其过程如图7-7所示。 另一种情况是被删除结点不是第一个结点,可使被删除结点的前一结点指向被删结点的后一结点,即p2-next=p1-next,其过程如图7-8所示。 【例】写一个函数,删除链表中的指定结点,以指定的学号作为删除结点的标志。函数dele编写如下: struct stu * dele(struct stu *head, long int num) struct stu *p1,*p2;,链表的删除操作,if(head=NULL) /*如为空表, 输出提示

19、信息*/ return head; p1=head; while (p1-num!=num /*不是第一个结点,使要删除结点从链表中脱离*/,链表的删除操作,n=n-1; free(p1); else Cout“The node not been foud!“; return head; /*返回head值*/ ,图7-7,图7-8(a),图7-8(b),图7-8(c),链表的插入操作,设被插入结点的指针为p0 可在四种不同情况下插入: 第一种情况是原链表是空链表,只需使head指向被插入结点即可,见图7-9(a)。 第二种情况是插入到第一个结点之前。 p0-next=p1;head=p0;

20、见图7-9(b)。 第三种情况是在其它位置插入,见图7-9(c)。 p0-next=p1;p2-next=p0; 最后一种情况是在表末插入,见图7-9(d)。 p1-next=p0;p0-next=NULL;,【例】写一个函数,在学生数据链表中,按学号顺序插入一个结点。 struct stu * insert(struct stu *head, struct stu *stud) struct stu *p0,*p1,*p2; p1=head; /*指向第一个结点*/ p0=stud; /*指向要插入的结点*/ if(head=NULL) /*空表插入*/ head=p0; p0-next=N

21、ULL; /*将p0指向的结点作第一个结点*/,else while(p0-nump1-num) ,else p1-next=p0; p0-next=NULL; /*在表末插入*/ n=n+1; return (head); ,图7-9(a),图7-9(b),图7-9(c),图7-9(d),栈,栈是一种线性表,对栈的所有操作发生在这个表的同一端,该端称为栈的“顶”,另一端称为栈的“底”。 由于插入和删除都在栈顶进行,因此删除的将是最新插入的成员,所以栈又被称为“后进先出表(LIFO表或下推表)”。 描述一个栈通常需要一个变量和三个函数:变量用于记录当前的栈顶位置;函数包括将数据项压入栈的pus

22、h()、从栈顶弹出一个成员的pop()、读栈顶成员的top()。有时还需要引入一个变量标识栈内数据对象数目或者栈底的位置。,栈通常以顺序方式存储。 如果栈中所有项目类型相同,并且项目总数具有上限,那么这个栈可以一维数组方式实现,这种实现方式栈的基本操作十分简单,缺点是对栈成员的总数有限制,且成员一般要具有相同类型。 栈的比较灵活的实现方式是采用单链表。,联合体,将几种不同类型的变量存放在同一段内存单元中的结构称为“联合体”,也称为“共用体”。 “联合体”与“结构体”有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合体中,各成员

23、共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。,联合体类型的声明,声明一个联合体类型的一般形式为: union ; 例如: union perdata int class; char office10; ;,在使用联合体类型数据时要注意它具有以下一些特点: (1)一个联合变量,每次只能赋予一个成员值。 (2)联合变量中起作用的成员是最后一次存放的成员。 (3)不允许对联合变量作初始化赋值,赋值只能在程序中进行。,【例】编写程序使用联合体类型数据来保存数据。 #include void main() union t char *name; int age; int income;

24、; union t list;,coutsizeof(union t*)endl; /*输出联合体类型长度*/ list.name=“Zhang hai“; /*第一次赋值*/ coutlist.nameendl; list.age=20; /*第二次赋值*/ coutlist.ageendl; list.income=2500; /*第三次赋值*/ coutlist.incomeendl; coutlist.namelist.agelist.incomeendl; /*输出各成员值*/ ,枚举类型声明的一般形式为: enum ; 例如: enum weekday sun,mon,tue,we

25、d,thu,fri,sat ;,枚举类型,(1)先声明后定义 enum weekday ; enum weekday a,b,c; (2)声明的同时定义 enum weekday . a,b,c; (3)直接定义 enum a,b,c;,#include enum weektypeSun,Mon,Tues,Wed,Thur,Fri,Satnday; void main() int nindex; char * pstr; while (cinnindex) switch(nindex) case Sun: pstr=“Sunday“;break; case Mon: pstr=“Monday“;break;,case Tues: pstr=“Tuesday“;break; case Wed: pstr=“Wednesday“;break; case Thur: pstr=“Thursday“;break; case Fri: pstr=“Friday“;break; case Sat: pstr=“Saturday“;break; default:break; coutpstrendl; ,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1