C语言程序设计(3).ppt_第1页
C语言程序设计(3).ppt_第2页
C语言程序设计(3).ppt_第3页
C语言程序设计(3).ppt_第4页
C语言程序设计(3).ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第十章 结构体和共同体,定义和变量说明 引用和初始化 结构数组 结构指针 指针处理链表 共用体 枚举类型 用 typedef 定义类型,11.1概述,1,数 组相同标准类型数据(数组元素)的集合 (char/int/float等) 结构体用户选定的各种类型数据(“成员”或“域”)的集合 (无穷种),定义结构体类型 struct 结构体名 数据类型 成员名 1; 数据类型 成员名 2; : 数据类型 成员名 n; ; /*分号不能省略*/,成员表列或称域表,【例一】,struct student int number; char name6; /*number,sex等为成员名*/ char sex; int age; char address20; ;,本质上,它定义了一个名为”student”的“结构体类型” 。struct student 相当于标准数据类型关键字char, int ,float我们可以用它来定义“结构体变量”。,注意成员定义与普通变量定义的区别: 成员定义时不为其分配内存 变量定义时为其分配内存,int a,b,c; struct student a,b,c;,比较:,定义三个整型变量,每个变量占二个字节,可单独赋值。,定义三个结构体类型变量,每个变量下有若干“成员”。其占用的内存长度等于各成员项长度之和。,struct 结构名 结构变量名; 注意: 结构变量说明必须在结构类型定义之后 例 struct student stul, stu2;,11.2定义结构体类型变量的方法,1、先定义结构类型,后说明变量,3、 直接定义结构体类型变量 struct 成员表列 ; 变量名;,2、定义结构类型的同时说明变量 struct 结构名 成员表列 ; 变量名表列;,说明 成员也可是一个结构体。 成员名可同于程序中的变量名,互不干扰。 结构体变量占内存大小可用 sizeof 运算求出。 结构体类型说明仅列出该结构的组成情况。,struct date int year, month, day; ; struct student long int num; char name20; char sex; struct date birthday; ; stu1,stu2;,11。3 结构体的引用和初始化,引用形式:用圆点(成员运算符) 优先级最高 结构变量名.成员名 例: stu1.num,成员变量根据其类型可进行相应的运算: 例 :stu1.num+,结构体变量的整体引用: 例:struct student stu1,stu2; stu1=stu2;,struct date int year, month, day ; struct student long int num; char name20; char sex; struct date birthday; ; stu1,stu2;,成员名为结构体时的引用形式: 结构变量名.成员名.成员名 例:stu1.birthday.year,一级一级引用,【例】若有以下定义,则正确的赋值语句为 。,struct complex float real; float image; ; struct value int no; struct complex com; val1;,A) com.real=1; B) plex.real=1; C) .real=1; D) val1.real=1;,答案:C).real=1(参见下图),11。4、结构体变量的初始化,使一个结构体变量获得数据“值”有三种方法:,struct char name15; char class12; long num; stu=“Wenli”,”Computer 1”,200113;, 定义时初始化之, 同类型的结构体变量间相互赋值 student1=student2,用赋值语句对各成员分别赋值 只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体变量stu,以下语句是错误的:,scanf(“%s,%s,%ld”,可改为: scanf(“%s,%s,%ld”,,stu.class,亦可用以下赋值语句: strcpy(, “wenli”); strcpy(stu.class, “Computer”); stu.num = 200113;,语法错误,对外部结构体变量进行初始化 例 struct date int year, month, day ; struct student long int num; char name20; char sex; struct date birthday; stu1=89031, “Li Lin”, M, 1980, 8, 18 main( ) printf(“No:%ldnName:%snSex:%cn Birthday:%d%d%dn”, stu1.num, , stu1, sex, stu1 . birthday . year, stu1. birthday . month, stu1 . birthday . day); ,说明: 全体赋值:一一对应。 部分赋值: 未赋值的成员,对于数值型和字符型系统自动赋 0。,11.5 结构数组,概念 数组的每一个元素都是一个结构体类型的数据,分别包括结构体的各个成分,定义(三种方式) 1、先定义结构体类型,后定义结构体数组 struct student long int num; char name20; char sex; int age; float score; char addr30; ; struct student stu3;,2、同时进行结构体类型和结构体数组的定义 struct student long int num; char name20; char sex; int age; float score; char addr30; stu3;,3、直接定义结构体数组 struct st3;,11.5.3 引用,此时每个结构体数组元素都有若干“成员”。可以用以下形式来标识它们: 数组名i.成员名 如stu3.age,11.5.2 结构体数组的初始化,P266,例11.2 (p266)候选人得票统计程序。(三个候选人),分析: 数据结构: 定义结构体数组变量,含侯选人名,得票数。 数组有3个元素 算法要点: 采用strcmp()函数, 将输入的人名与定义初始化的结构体数组中的每一元素中候选人名比较,若相同则加1。,main() int i,j; char leader_name20; for (i=1;i=3;i+) scanf(“%s“,leader_name); for (j=0;j3;j+) if (strcmp(leader_name,)=0) leaderj.count+; ,例11.2 (p266),struct person char name20; int count; leader3=“Li“,0,“Zhang“,0,“Fun“,0;,/*定义外部存储结构数组*/,概念 存放结构体变量的首地址。 结构指针的运算也按照C语言的地址运算原则进行。,定义 struct 结构名 * 结构指针变量名 例 struct student stu1,*p;,引用形式 (*p) . name p-name,p=&stu1,S、 (*p) . Name、p-name,以下三者等价,11.6 指向结构体类型数据的指针,stu_1.num=89101; strcpy(stu_1.name, “Li Lin”); stu_1.sex=M; stu_1.score=89.5; printf(“No:%ldnName:%sn Sex:%cnScore:%7.2fnn”, stu_1.num,stu_1.name, stu_1.sex,stu_1.score); printf(“No:%ldnname:%snsex:%cn score:%7.2fnn”, p-num, p-name, p-sex, p-score); ,赋初值,例10.3 (二),11.6.2指向结构体数组的指针,例 struct student stud40,*p; p=stud;,说明 p 只能指向结构体数组的一个元素,不能指向数组元素中的某一个成元 p+ 指向下一元素的起始地址。,例 11.4 (p269)(一),struct student /*定义结构体*/ int num; char name20; char sex; int age; struct student stu3=10101, “Li Lin”, M,18, 10102, “Zhang Fun”, M, 19, 10103, “Wang Min”, F,20;,例 11.4 (p269)(二),main() struct student *p; printf (“ No Name Sex Agen”); for (p=stu;pnum,p-name,p-sex,p-age); ,【例】求程序运行结果。,main() struct wc int a; char *b; *p; static struct wc x2=10,“abcd“,30,“ABCD“; p=x; printf(“%d,“,p-a); printf(“%cn“,*(+p)-b); ,答案:10,A,分析:关于结构体指针中的、运算,情况2、设struct student stu5; struct student *p; p=stu; /*指针变量p的值为结构体变量p的首地址。*/,注意: 如果有 struct student *p; 此时p存放结构体变量指针,不可指向数组元素,如p=&stu.age 如果需要指向数组元素,应另设普通指针变量,如 int *p1;p1=&stu.age,情况1、(上例中),p+ 表示移到下一个数组元素而非下一个成员 (+p)-age 表示p先自加1(移到下一数组元素处),然后取成员值 (p+)-age 表示先取p-age的值,然后p自加(移到下一数组元素处),p-n+ 等效于(p-nn)+ 先得到成员值,再使它加1 +p-n 等效于 +(p-n) 先使成员值加1,再使用之,11.6.3 指向结构体变量的指针作函数参数,“地址传递” 指向结构体变量(的指针数组)为参数。,“值传递” 结构体变量的成员为参数。,“地址传递” 指向结构体变量(的指针数组)为函数参数。,例 11.5 (p271) 结构类型 struct student int num; char name20; float score3; 定义为外部,使得同一源文件的各个函数都可用于说明变量类型。 main( ) 实参 stu为 student的变量的地址 print( ) 形参 p 为指向 student 的指针变量,例 11.5 以指向结构体变量的指针作实参,#include “string.h” #define format “%dn%sn%fn%fn%fn” struct student int num; char name20; float score3; ; main() void print(); struct student stu; scanf(“%d%s%f%f%f”, ,例 115,void print(struct student * p ) printf ( format, p-num, p-name, p-score0, p-score1, p-score2); printf(“n”); ,“值传递” 结构体变量的成员为函数参数。,#include “string.h“ #define format “%dn%sn%fn%fn%fn“ struct student ; main() void print(); struct student stu; print(stu); void print(struct student stt) ,实参与形参为同一类型的结构体,例11.6: 4个学生,每个学生包括学号、姓名、成绩。要求找出成绩最高者的姓名和成绩。,数据结构: 采用结构体struct student类型的数组 p 指向结构体类型的指针变量,算法: 找出最高的成绩,并计下数组下标, 将指针 p 移位于该下标处, 最后输出 p 所指向的元素中各个成员值。,举例 11.6,main() struct student int num; char name20; int score; ; struct student stu4; struct student *p; int i, temp; int max;,举例 11.6,for (i=0;imax) max=stui.score; temp=i; p=stu+temp; ,11.7 用指针处理链表,链表是一种常见的重要数据结构,它可进行动态存储分配。 链表特点:,1、动态 2、头指针head、结点、表尾,指向第一个元素,每个结点包含两部分: 一为用户数据;二为下一个结点的地址,地址部分为NULL,用结构体变量做结点最合适,定义结构体类型 struct 结构体名 数据类型 成员名 1; 数据类型 成员名 2; : 数据类型 成员名 n; ;,struct student int num; float score; sturct student *next; ,num score next,11.7.2简单链表,静态链表 例11.7,在动态内存 区分配一个长度为siz连续空间,返回一个指向分配域起始地址的指针,类型为void,如不成功,返回空指针. 格式 指针变量 = 类型 maclloc(size); 例:int *p; p=int malloc(sizof(int);,释放由p指向的内存空间,11.7.3 处理动态链表所需的函数,void *maclloc(unsigned int size),void *calloc(unsigned n, unsigned size),在动态内存区分配n个 长度为siz连续空间,void free(*P),用指针处理链表,链表动态地进行存储分配的数据结构。,struct node int num; struct node *next ;,#define LEN sizeof(struct node) struct node /自定类型 int num; struct node *next ; struct node *h,*p*q; /变量声明 p=(struct node *)malloc(LEN); q=(struct node *)malloc(LEN); p-num=20; q-num=30; h=p; p-next=q; q-next=NULL; ,用指针处理链表,单链表,h,p,q,NULL,20,30,h 头指针 指向第一个元素 q 尾指针 地址部分存放NULL,不再指向其它元素,链 表 操 作,建立链表 输出链表 查找 结点 删除结点 插 入结点,struct node int num; struct node *next; ;,建立链表 新结点于链表尾部,struct node *creat( )/建链表 int n; struct node *h,*q,*p; p=(struct node *)malloc(LEN); scanf(“%d“, ,0,q-next=0; return h; ,先进先出队列建表,输出链表 遍历,void print(struct node *h) struct node *p; p=h; while (p!=0) printf(“%dn“,p-num); p=p-next; ,h,p,p,p,p,查找 结点 有条件的遍历,struct node *search(struct node *h) struct node *p; p=h; while (p-num!=3) p=p-next; return (p); ,p,p,删除结点 (p之后的结点),n1,n4 0,h,p,void delnode(struct node *p) struct node *m; m=p-next; p-next=m-next; free (m); ,插 入结点,void insert(nodetype *p) nodetype *g; g= (struct node *)malloc(LEN); g-a=80; g-next=p-next; p-next=g;,p,h,完整程序,#define LEN sizeof(struct node) #include struct node /数据结构 int num; struct node *next; ; struct node *creat(); /函数声明 void print(struct node *); struct node *search(struct node *); void delnode(struct node *);,main() struct node *h=0,*q; h=creat(); print(h); q=search(h); delnode(q); print(h); ,练 习,填空 将一条链表上相邻的两个结点合并成一个结点。即将第一个结点与第二个结点合并,将第三个节点与第四个节点合并。若链表上的结点个数为奇数,则最后的一个结点不合并,直接作为合并后链表上的最后一个结点。链表结点的数据结构为: struct node int data; struct node *next; ;,以下函数merge() 的输入参数h指向要合并链表的首部,void merge(struct *h) struct node *p1,*p2l if ( 1 ) return h; p1=h; p2=h-next; while (p2!=NULL) p1-data+=p2-data; p1-next=p2-next; delete(p2); p1=( 2 ); if ( 3 ) p2=( 4 ) else p2=NULL; ,n1+n2,p1-next=p2-next,delete p2,p1-data+=p2-data,答 案,1 h=NULL 2 p1-next 3 p1!=NULL 4 p1-next,11.8 共用体,概念 使几个不同变量共同占有同段内存的结构 定义 union 共同体名 数据类型 成员名; 数据类型 成员名; 变量列表;,共用体声明的表示方法,例 union data int i, char ch; float f; a,b,c;,union data int i, char ch; float f; ; union data a,b,c;,union int i, char ch; float f; a,b,c;,引用形式 共同体变量名.成员名 例 a.i a.ch a.f,结构体与共同体的区别,结构体变量中每个成员分别占有独立的内存空间, 整个结构体类型占有字节数为各成员字节数之和。,1000,实 型 f,1000,共同体变量中所有成员占有共同的内存空间, 整个共用体类型占有字节数等于最长的成员字节数。,11.8.3数据特点,变量中每一瞬时只有一个成员有效,同时赋值时 最后一存放的成员有效。,变量不能作为函数的参数,也不能使函数带回共用体变量,但可以用指向共用体变量的指针。,共用体变量的地址和它的各个成员地址相同。,不能对共用体变量名赋值,也不能企图引用变量名得到 一个 值,又不能在定义时对它初始化。,共用体类型可以出现在结构体类型定义中,也可以定义 共用体数组,对结构体,同样适用。,例 11.12(p289),要建立如下的表格,struct char name20; int num; char sex; char job; union int class; char position10; category; person2;,数据结构 结构体数组 结构体类型定义中包括共同体 程序设计框图(p245 图10.27),main() int i,j; for (i=0;i2;i+) scanf(“%s%d%c%c“,, ,/*输入数据*/,for (i=0;i2;i+) if (personi.job=s) printf(“%-6d%-10s%-6c%-6c%-8dn“,personi.num, ,personi.sex,personi.job, personi.category.class); else if (personi.job=t) printf(“%-6d%-10s%-6c%-6c%-8sn“,personi.num, ,personi.sex,personi.job, personi.category.position); else printf(“n“); ,/*输出数据*/,11.9枚举类型,概念 将变量的值 一一列举出来,变量的值只限于 列举出来的值的范围内。 定义 enum 枚举名枚举元素表枚举变量名; 例 enum week_day Mon,Tue,Wed,Thu,Fri,Sat,Sun week;,说明 枚举 元素表由一系列符号组成,每一 符号表示一个整型值。若没有进行初始化第一个元素的值为 0,其后依次类推。 枚举元素是常量,不可用赋值语句对其赋值。 枚举变量只能取枚举元素表中的某个元素。 例 week=Fri; printf(“%d”,week) 结果为 4 week=Sun; for (week=Mon;week=Sun;week+) ,自己阅读例11.13,例 :利用枚举类型输出春、夏、秋、冬。,enum season spring, summer, autumn, winter, end; enum season select( ) int s; printf(“nPleaser input a number(0-4):”); scanf(“%d”, ,例 应用举例,main() enum season times; while(1) times=select(); if (times=end) break; switch (times) case spring: printf(“nIt is spring.”);break; case summer: printf(“nIt is summer.”);break; case autumn: printf(“nIt is autumn.”);break; case winter: printf(“nIt is winter.”);break; ,11.10用typedef 定义类型,概念 说明一种新的类型名。,定义 typedef 类型名1 类型名2,例 类型说明 typedef int INTEGER; 变量说明 INTEGER i, j; int i, j;,类型说明 变量说明 typedef struct DATE dirthday; int yeaa; DATE *p; int month; int day; DATE;,声明一个新的类型名的方法,步骤 1、先按定义变量的方法写出定义体; 步骤 2、将变量名换成新类型名; 步骤 3、在前面加上typedef;,说明,typedef 用于定义各种类型名。 只是对已经存在的类型增加一个类型名。,typedef 与 #define不同点 #define 预编译时处理,只能进行简单的字符串替换。 typedef 编译时处理,采用定义变量方法定义类型。,练习,1.在说明一个结构体变量时系统分配给它的存储空间是 。 A.该结构体中第一个成员所存储的空间。 B.该结构体中最后一个成员所存储的空间。 C.该结构体中占用最大存储空间的成员所许的存储空间。 D.该结构体中所有成员所需存储空间的总和。 2.在说明一个共同体变量时系统分配给它的存储空间是 。 A.该共同体中第一个成员所存储的空间。 B.该共同体中最后一个成员所存储的空间。 C.该共同体中占用最大存储空间的成员所许的存储空间。 D.该共同体中所有成员所需存储空间的总和。,3. 共同体类型在任何给定时刻 , 。 A.所有成员一直驻留在内存结构中。 B.只有一个成员驻留在内存结构中。 C.部分成员驻留在内存结构中。 D.没有成员驻留在内存结构中。 4.如下结构体定义中,不正确的是 。 A. struct student B. struct stud20 int no; int no; char name20; char name20; ; ; C. struct D. struct student int no; int no; char name20; char name20; stu20; stu200;,5. 有如下定义 sturct int x; int y; s2=1,3,5,7,*p 则 表达式 +p-x 的结果 (1) 。 表达式(+p)-x 的结果 (2) 。,6.有如下定义 struct int x; char y; tab2=1,”ab”2,”cd”,*p=tab; 则:表达式 *p-y 的结果 (1) 。 表达式*(+p)-y 的结果 (2) 。,答 案,1.D 2.C 3.B

温馨提示

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

最新文档

评论

0/150

提交评论