C语言程序设计第8章课件_第1页
C语言程序设计第8章课件_第2页
C语言程序设计第8章课件_第3页
C语言程序设计第8章课件_第4页
C语言程序设计第8章课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

本章主要介绍结构体和共用体的基本知识,让学生学会利用结构体和共用体编写程序。

1.结构体的概念

2.结构体类型数组

3.指向结构体类型数据的指针

4.结构体类型数据与函数

5.链表

6.共用体本章主要介绍结构体和共用体的基本知识,让学生学一、结构体如果在程序设计时,需要将不同类型的数据组成一个有机整体来引用,此时,用数组是无法完成的,C语言允许用户自己可以定义这种特殊的数据结构,称之为结构体。结构体中可以包含若干个类型不同的数据项。一、结构体如果在程序设计时,需要将不同类型的数据组成一个有机二、结构体类型的定义C语言中没有现成的结构体类型,如果用户要使用结构体类型,必须自己定义。结构体类型的一般定义形式如下:struct结构体类型名{类型名1成员名1;类型名2成员名2;

.

.....类型名n成员名n;};注意:定义结构体类型时,“结构体名”是结构体类型标志,与struct共同组成结构体类型名。二、结构体类型的定义C语言中没有现成的结构体类型,如果用户要说明:①structstudent是一个结构体类型名,在使用过程中与系统提供的标准类型(如int、float等)具有同样的地位和作用。②一个结构体类型可以包含若干个成员,每个成员的类型可以不一样。③一个结构体类型数据在存储时所占的内存单元字节数相当于每个成员所占内存单元字节数的总和。例如:前面定义的structstudent结构体类型数据存储时所占内存单元为69字节。例如:structstudent{intnumber;charname[10];charsex;intage;floatscroce;charaddress[50];};说明:例如:三、结构体类型变量的定义结构体类型变量通常采取以下三种形式定义:1.先定义结构体类型,再定义结构体类型变量结构体类型名结构体变量名;例如:structstudent{intnumber;charname[10];charsex;intage;floatscroce;charaddress[50];};structstudentstud1,stud2;三、结构体类型变量的定义结构体类型变量通常采取以下三种形式定例如:structstudent{intnumber;charname[10];charsex;intage;floatscroce;charaddress[50];}stud1,stud2;2.在定义结构体类型的同时定义变量struct结构体名{类型名1成员名1;类型名2成员名2;

......类型名n成员名n;}变量名表列;例如:2.在定义结构体类型的同时定义变量例如:struct{intnumber;charname[10];charsex;intage;floatscroce;charaddress[50];}stud1,stud2;

3.直接定义结构体类型变量struct{类型名1成员名1;类型名2成员名2;

......类型名n成员名n;}变量名表列;例如:3.直接定义结构体类型变量注意:①结构体类型和结构体类型变量是两个不同的概念,使用时,先定义类型,后定义变量。②在程序中只能对结构体类型变量进行操作。③结构体中的成员可以单独使用,相当于一个普通变量,成员名可以和程序中的普通变量同名,互不干扰。④结构体中的成员可以是一个结构体变量。例如:structdate{intmonth;intday;intyear;};structstudent1{intnumber;charname[10];charsex;structdatebirthday;floatscroce;charaddress[50];}stu1,stu2;注意:例如:四、结构体类型变量的引用和初始化结构体类型变量一旦被定义后,就可以在程序中使用,与数组相似,在程序中不能直接引用结构体类型变量,也不能对结构体类型变量进行整体输入输出,只能引用其中的各个成员,对其中的各个成员进行输入输出。引用结构体变量成员时,象引用普通变量一样,可以进行各种运算。四、结构体类型变量的引用和初始化结构体类型变量一旦被定义后,引用结构体变量成员的一般形式如下:结构体变量名.成员名例如:前面定义了结构体类型变量stud1和stud2,可以对变量的各个成员进行各种操作,例如:

stud1.number=10001;stud2.number=10002;

.........printf(″%d,&d″,stud1.number,stud2.number);引用结构体变量成员的一般形式如下:例如:前面定义了结构体类型另外,在程序中,还可以用指向结构体变量的指针变量来引用结构体变量成员。例如:structstudentstud1;structstudent*p1=stud1;

(*p1).number=10001;.........注意:“->”是指向结构体成员运算符,“.”是结构体成员运算符,它们的结合方式从左到右,优先级别最高。上述程序段,还可以写成下面的形式:

structstudentstud1;structstudent*p1=stud1;

p1->number=10001;

.........另外,在程序中,还可以用指向结构体变量的指针变量来引用结构体#include"stdio.h"#include"string.h"structstudent{intnumber;charname[10];intage;floatscore;}a;main(){a.number=1001;strcpy(,"liming");a.age=18;a.score=89.5;printf("%-8d%s%8d%6.1f",a.number,,a.age,a.score);}例8-1利用结构体变量输出学生信息。#include"stdio.h"例8-1利用结构体变#include"stdio.h"structstudent{intnumber;charname[10];intage;floatscore;}a={1001,"liming",18,89.5};main(){printf("%-8d%s%8d%6.1f",a.number,,a.age,a.score);}例8-2利用结构体变量输出学生信息。#include"stdio.h"例8-2利用结构体变一、结构体数组的定义和引用结构体数组同普通数组一样,所有元素类型相同,是同一个结构体类型。要定义一个结构体类型数组,必须先定义结构体类型,定义结构体类型数组的一般形式如下:struct结构体名数组名[常量表达式];例如:structstudenta[3];同普通数组相似,在程序中不能整体引用结构体数组,也不能引用结构体数组元素,只能引用结构体数组元素的成员。例如:a[1].number=10001;a[2].number=10002;一、结构体数组的定义和引用结构体数组同普通数组一样,所有元素二、结构体数组初始化和应用例如:

structsst{intnum;charname[10];intage};structssta[3]={{1001,"zhangsan",18},{1002,"lisi",19},{1003,"wangwu",20}};.........结构体数组初始化与普通数组初始化相似,可以先定义结构体类型,再定义结构体数组并初始化。二、结构体数组初始化和应用例如:结构体数组初始化与普通数组初例8-3某班级学生进行学生干部选举,候选人有张三、李四、王五三位同学,全班共有学生40名,编写一个程序统计候选人的得票数。#include"string.h"#include"stdio.h"structnum{charname[10];intnumber;};main(){structnuma[3]={{"zhangsan",0},{"lisi",0},{"wangwu",0}};inti,j;charinputname[20];printf("pleaseinputthelistofcandidate:\n");for(i=0;i<40;i++){scanf("%s",inputname);for(j=0;j<3;j++)if(strcmp(inputname,a[j].name)==0)a[j].number++;}printf("\n");for(i=0;i<3;i++)printf("%10s:%2d\n",a[i].name,a[i].number);}例8-3某班级学生进行学生干部选举,候选人有张三、李四C语言规定:在程序中不能直接对结构体类型数组元素进行输入输出,只能对结构体类型数组元素的成员进行输入输出。结构体类型数组元素的成员的输入与输出与普通数组元素的输入与输出类似,通常利用循环语句来完成。三、结构体类型数组的输入与输出C语言规定:在程序中不能直接对结构体类型数组元素进行输入输出main(){intn,i,sum[SIZE];printf("Howmanystudents?\n");scanf("%d",&n);for(i=0;i<n;i++){printf("Name?\n");scanf("%s",stud[i].name);printf("No?\n");scanf("%d",&stud[i].num);printf("Score1,Score2,Score3?\n");scanf("%f,%f,%f",&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);sum[i]=stud[i].score[0]+stud[i].score[1]+stud[i].score[2];stud[i].ave=sum[i]/3.0;}printf("\nNAMENo.SCORE1SCORE2SCORE3AVE\n");printf("---------------------------------------------------\n");for(i=0;i<n;i++)printf("%-10s%3d%8.1f%8.1f%8.1f%8.1f\n",stud[i].name,stud[i].num,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].ave);}例8.4利用结构体数组输入并输出一个班学生信息。#include"stdio.h"#defineSIZE100structstudent{charname[10];intnum;floatscore[3];floatave;}stud[SIZE];main()例8.4利用结构体数组输入并输出一个班学生信1、指向结构体类型数据的指针

以个结构体类型变量的指针就是该结构体类型变量所占据的内存单元的起始地址。在C语言程序中,可以设置一个指针变量,用来指向一个结构体类型的数据。1、指向结构体类型数据的指针以个结构体类型变量的指2、指向结构体类型变量的指针变量在程序中,如果设置了一个指针变量来专门存放一种结构体类型变量的地址,则该变量就是指向这种结构体类型数据的指针变量,该变量的值就是存放某个结构体类型数据的内存单元的起始地址。2、指向结构体类型变量的指针变量在程序中,如果设置了一个指例如:structstudent{intnumber;charname[10];intage;floatscore;}/*定义结构体类型*/.........structstudent*p;/*定义指向结构体类型变量的指针变量*/.........⑴指向结构体类型数据的指针变量一般说明形式如下:

struct结构体类型名变量名;例如:⑴指向结构体类型数据的指针变量一般说明形式如下:利用指向结构体类型的指针变量引用结构体变量成员的一般形式如下:(*指针变量名).成员名或指针变量名->成员名⑵指向结构体类型变量的指针变量引用注意:①“->”是指向结构体成员运算符,“.”是取结构体成员运算符,它们的结合方式从左到右,优先级别最高。②在程序中只能将结构体类型变量的地址赋给一个指向结构体类型的指针变量,一个指向结构体类型的指针变量只能指向结构体类型变量,不能指向变量的成员。利用指向结构体类型的指针变量引用结构体变量成员的一般形式如下例如:structstudent{intnumber;charname[10];intage;floatscore;}structstudentstud1;.........structstudent*p1=stud1,*p2=stud1;(*p1).number=10001;(*p2).number=10002;.........printf(″%d,&d″,(*p1).number,(*p2).number);printf(″%d,&d″,p1->number,p2->number);例如:例8.8#include"stdio.h"structstudent{intnum;charname[20];charsex;floatscore;};main(){structstudentstu1={1001,"LiMing",'M',95.0};structstudent*p;p=&stu1;printf("%d,%s,%c,%.1f\n",stu1.num,,stu1.sex,stu1.score);printf("%d,%s,%c,%.1f\n",(*p).num,(*p).name,(*p).sex,(*p).score);printf("%d,%s,%c,%.1f\n",p->num,p->name,p->sex,p->score);}例8.8在程序中,如果将一个结构体类型数组的地址赋给一个结构体类型的变量,那么该变量就是一个指向结构体类型数组的指针变量。可以利用该指针变量来引用数组元素的各个成员。3、指向结构体类型数组的指针对于指向结构体类型数组的指针变量。其引用的方式和指向普通数组的指针变量的引用相类似。在程序中,如果将一个结构体类型数组的地址赋给一个结构体类型的例8.9#include"stdio.h"structstudent{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Zhouping",'M',45},{102,"Zhangping",'M',62.5},{103,"Liufang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58}};main(){structstudent*ps;printf("No.\tName\t\t\tSex\tScore\t\n");for(ps=boy;ps<boy+5;ps++)printf("%d\t%s\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score);}例8.9注意:ps是指向结构体类型数据的指针变量,只能将数组的地址或某个数组元素的地址赋给ps,不能将数组元素的成员或成员的地址赋给ps,否则,程序将会出错。例如:ps=boy;/*正确*/ps=&boy[0];/*正确*/ps=boy[0].num;/*错误*/ps=&boy[0].num;/*错误*/注意:1、结构体类型数据与函数⑴结构体类型变量的成员作函数参数在函数调用时,可以将结构体类型变量各成员的值作函数的实参进行数据传递。其用法和用普通变量作函数实参是一样的,属于“值传递”方式。注意:在调用函数时,应注意实参与形参的类型保持一致。1、结构体类型数据与函数⑴结构体类型变量的成员作函数参main(){structstudenta;.........f(a.score);.........}#include"stdio.h"structstudent{intnum;charname[20];charsex;floatscore;};voidf(floatx){.........}例如:main()#include"stdio.h"voidfC语言(ANSIC)允许使用结构体变量作实参进行数据传递,将主调函数中结构体变量所占用内存单元的内容全部顺序传递给形参。这是一种“值传递”方式,要求形参也必须是同类型的结构体变量。⑵结构体类型变量作函数参数C语言(ANSIC)允许使用结构体变量作实参进行数据传递,例8.10有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求分别编写两个不同的函数输出学生的学号、姓名和3门课的成绩及总成绩。#include"stdio.h"#include"string.h"#defineFORMAT"%5d%9s%8.1f%8.1f%8.1f"structstudent{intnum;charname[20];floatscore[3];};

例8.10有一个结构体变量stu,内含学生学号、姓名和voidpri1(structstudentstt){printf("numnamescore1score2score3sumscore\n");printf(FORMAT,stt.num,,stt.score[0],stt.score[1],stt.score[2]);}voidpri2(floatxx[]){floatsum;sum=xx[0]+xx[1]+xx[2];printf("%9.1f",sum);}main(){structstudentstu={1001,"LiMing",67.5,89.0,78.6};pri1(stu);pri2(stu.score);}voidpri1(structstudentstt)⑶指向结构体类型变量的指针作为函数参数在程序中,如果用指向结构体变量的指针作函数的实参,可以将结构体变量的地址传给形参,使实参和形参共同指向同一段存储单元,得到函数的返回值。⑶指向结构体类型变量的指针作为函数参数在程序中,如果用指向例8.11有一个结构体变量stu,内含学生学号、姓名和3门课的成绩,利用函数编程按升序输出学生的成绩。#include"stdio.h"#include"string.h"#defineFORMAT"%5d%9s%8.1f%8.1f%8.1f"#defineN3structstudent{intnum;charname[20];floatscore[N];};例8.11有一个结构体变量stu,内含学生学号、姓名和3门voidpri(structstudent*stt){inti,j;floatt;for(i=0;i<N;i++)for(j=0;j<N-1;j++)if(stt->score[j]>stt->score[j+1]){t=stt->score[j];stt->score[j]=stt->score[j+1];stt->score[j+1]=t;}}main(){structstudentstu={1001,"LiMing",67.5,89.0,78.6};structstudent*p=&stu;pri(p);printf(FORMAT,stu.num,,stu.score[0],stu.score[1],stu.score[2]);}voidpri(structstudent*stt)⑷结构体类型数组作为函数参数在程序中也可以使用结构体类型数组作函数的参数,将该结构体类型数组的地址传给形参。例8.12有一个结构体类型数组student,内含几个学生学号、姓名、性别和成绩。要求编程计算这组学生的平均成绩,并统计不及格的人数。#include"stdio.h"#defineN5structstu{intnum;char*name;charsex;floatscore;};⑷结构体类型数组作为函数参数在程序中也可以使用结构体类型数voidave(structstu*ps){intc=0,i;floatave,s=0;for(i=0;i<N;i++,ps++){s+=ps->score;if(ps->score<60)c+=1;}ave=s/N;printf("average=%.1f\ncount=%d\n",ave,c);}main(){structstustudent[N]={{101,"Liping",'M',45.0},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87.0},{105,"Wangming",'M',58.0}};ave(student);}voidave(structstu*ps)⑸指向结构体类型数组的指针作为函数参数在程序中,可以用指向结构体类型数组的指针作函数参数,将该结构体类型数组的地址传给形参。

例8.12中程序的main函数可以改写为下面程序代码。main(){structstustudent[N]={{101,"Liping",'M',45.0},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87.0},{105,"Wangming",'M',58.0}};structstu*p=student;ave(p);}⑸指向结构体类型数组的指针作为函数参数在程序中,可以用指函数的返回值可以是某种类型的数据,也可以是指向某种类型数据的指针。C语言允许函数调用时,返回结构体类型指针值。⑹返回值为结构体类型的函数其函数原型如下:struct结构体类型名*函数名(参数表列);函数的返回值可以是某种类型的数据,也可以是指向某种类型数据的例8.14在一组的学生信息中查找某个学生的信息。如果找到,输出该学生信息,否则输出没有找到。#include"stdio.h"#defineSIZE100#defineN6#defineFORMAT"%-11s%3d%8d%8d%8d\n"structstudent{charname[30];intnum;intscore[3];};/*定义结构体类型*/例8.14在一组的学生信息中查找某个学生的信息。如果找structstudent*search(structstudent*p,int*kk{charnam[30];structstudent*pp;printf("inputthenameofthestudentyouwanttolookfor\n");scanf("%s",nam);for(pp=p;pp<N+p;pp++)if(strcmp(pp->name,nam)==0){*kk=1;break;}returnpp;}voidprint(structstudent*stu){printf("\nNAMENo.SCORE1SCORE2SCORE3\n");printf("------------------------------------------------\n");printf(FORMAT,stu->name,stu->num,stu->score[0],stu->score[1],stu->score[2]);}structstudent*search(structmain(){intkk=0;structstudent*result;structstudentstud[N]={{"zhangsan",1001,75,80,68},{"lisi",1002,66,90,82},{"wangwu",1003,77,86,64},{"liuli",1005,66,70,72},{"zhouqi",1006,79,96,74},{"shunba",1007,76,79,92}};result=search(stud,&kk);if(kk>0)print(result);elseprintf("Notfound!");}main()一、链表

链表是一种常见的、重要的、特殊的数据结构,是动态进行存储分配的一种结构。在C语言程序中,常用链表来代替结构体数组,节约内存资源。

1.链表一、链表链表是一种常见的、重要的、特殊的数据结构,是动态进在结构体变量中,如果定义最后一个成员为下一个结构体变量的指针时,就形成一种链表关系,&st1st1st10ZhangM18&st2WangF17&st3LiuM17NULLst2…head链表中的结构体变量称为“结点”,很明显,链表有一个“头指针”,图中用head表示,还有一个“表尾”,图中用NULL表示。每个结点都包含两个部分:用户所需的数据和下一个结点的地址。链表中的所有元素在内存中不是连续存放的,要找到某一元素,必须先找到上一个元素,根据上一元素提供的地址才能找到下一个元素,如果不知道“头指针”的值,整个链表无法访问。在结构体变量中,如果定义最后一个成员为下一个结构体变量的指针有关链表的操作,除了建立链表以外,还有删除结点、插入结点和链表的输出操作,其相应操作详见206页~215页。有关链表的操作,除了建立链表以外,还有删除结点、插入结点和链一、共用体的概念在程序中,为了节省内存资源,经常将几个类型不同的数据存放到同一段内存单元中,要保证这些数据正确存取,只能在某一具体时间段内存放其中的一个数据。这种使几个不同类型的数据共同占用同一段内存的结构,称为“共用体”类型结构。一、共用体的概念在程序中,为了节省内存资源,经常将几个类型二、共用体类型的定义共用体类型的一般形式如下:union共用体名{类型名1成员名1;类型名2成员名2;

......类型名n成员名n;};例如:uniondata{charname[10];intage;floatscore;};注意:一个共用体类型包含若干个成员,每个成员的类型不一样。共用体类型中的所有成员共同占用同一段存储空间,在存储时所占的内存单元字节数等于其中最长的成员所占内存单元字节数。二、共用体类型的定义共用体类型的一般形式如下:例如:注意:三、共用体类型变量的定义共用体类型变量的定义,通常采取以下三种形式:1.先定义共用体类型,再定义共用体类型变量定义形式为:共用体类型名共用体变量名;例如:

uniondata{charname[10];intage;floatscore;}uniondatastt1,stt2;上述定义中,stt1,stt2为uniondata类型变量,存储时,各占10字节内存单元。三、共用体类型变量的定义共用体类型变量的定义,通常采取以下2.在定义共用体类型的同时定义变量定义形式为:union共用体名{类型名1成员名1;类型名2成员名2;

......

类型名n成员名n;}变量名表列;例如:uniondata{charname[10];intage;floatscore;}stt1,stt2;

2.在定义共用体类型的同时定义变量例如:3.直接定义共用体类型变量定义形式为:union{类型名1成员名1;类型名2成员名2

温馨提示

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

评论

0/150

提交评论