第八章结构体与共用体.ppt

上传人:sccc 文档编号:5314494 上传时间:2023-06-25 格式:PPT 页数:57 大小:1.11MB
返回 下载 相关 举报
第八章结构体与共用体.ppt_第1页
第1页 / 共57页
第八章结构体与共用体.ppt_第2页
第2页 / 共57页
第八章结构体与共用体.ppt_第3页
第3页 / 共57页
第八章结构体与共用体.ppt_第4页
第4页 / 共57页
第八章结构体与共用体.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《第八章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《第八章结构体与共用体.ppt(57页珍藏版)》请在三一办公上搜索。

1、第八章 结构体与共用体,8.1 结构体8.2 结构体数组8.3 指向结构体类型数据的指针8.4 链表8.5 共用体8.6 枚举类型,8.1 结构体,表示一个同学的数据:学号 int num;姓名 char name20;年龄 int age;成绩 float score;家庭住址 char addr30;,通过定义结构体类型(记录),将有关数据作为一个整体看待,struct studentint num;char name20;int age;float score;char addr30;,整体的名字称为结构体类型名(结构体标记),整体的标记,整体的构成单位称为结构体成员、域,一、结构体类型

2、的定义,struct 结构体类型名类型 成员名;类型 成员名;,struct studentint num;char name20;int age;float score;char addr30;,struct dateint month;int day;int year;,二、结构体类型变量的定义1先定义结构体类型再定义变量,struct student int num;char name20;int age;float score;char addr30;struct student student1,student2;,成员的顺序是随意的,2在定义结构体类型的同时定义变量,struct

3、student int num;char name20;int age;float score;char addr30;student1,student2;,3直接定义结构体变量,structint num;char name20;int age;float score;char addr30;student1,student2;,方式1和2可以在多处定义相同结构体类型的变量 而方式3不行,结构体类型可以嵌套定义,struct dateint month;int day;int year;struct student int num;char name20;char sex;struct da

4、te birthday;,三、结构体变量的初始化,struct student int num;char name20;char sex;int age;float score;char addr30;a=8010,zhangsan,m,19,93,Beijing;,int x=6;char s20=sdfsfgg;,或a=.name=zhangsan,.num=8010;,四、结构体变量的使用1.分量运算符.优先级与()、相同 stu1.num stu1.name stu1.score stu1.birth.year,struct dateint month;int day;int year

5、;struct student int num;char name20;int age;char addr30;struct date birth;stu1,stu2;,2.相同类型的结构体变量之间可以直接赋值 stu1=stu2 或stu1=(struct student).num=123,.age=19,.name=li,域名对应的分量与同类型的变量一样看待,3.输入与输出 不能直接输入输出 printf(%d,%s,%c,%d,%f,%sn,student);error printf(%d,%s,%c,%d,%f,%sn,stu1);error 而是:printf(%d,%s,stu1.

6、num,stu1.name);printf(%c,%d,stu1.sex,stu1.age);printf(%f,%s,stu1.score,stu1.addr);scanf(%d%s,4.结构体类型变量的比较 不能直接比较 if(stu1=stu2).error 只能进行 if(stu1.num=stu2.num&!strcmp(stu1.name,stu2.name).,5.sizeof(struct student)struct studentint num;char name10;stu1,stu2;,int sum;int sum10;int fun(int sum);int*sum

7、;int fun(int*sum);int*fun(int*sum);,struct student sum;struct student sum10;struct student fun(struct student sum);struct student*sum;struct student fun(struct student*sum);struct student*fun(struct student*sum);,struct studentlong num;char name20;char sex;int age;struct int year,month,daydate;,五、定义

8、类型标识符,typedef int INTEGER;INTEGER i,j,k;typedef float REAL;REAL a,b;typedef int*POINT;POINT p1,p2;,typedef struct int month,day,year;DATE;DATE oneday;typedef int ARRAY100;ARRAY a,b,c;表示较复杂的类型,给已有的类型起一个新的名字,增加程序的可移植性,一般方法:先按定义变量的方法写出定义部分把变量名换成新的类型标识符在该行最前面加上typedef,8.2 结构体数组,int main()int i,j;struct

9、student c18;for(i=0;i5)c1i.age-;else if(c1i.date.month=5,for(i=0;i10;i+)printf(%d%s%dn,c1i.num,c1i.name,c1i.age);,计算c1班每个学生的年龄,int main()int i,j;FILE*fp;struct student c18;fp=fopen(stu.txt,r“);for(i=0;i5)c1i.age-;else if(c1i.date.month=5,fp=fopen(out.txt,w);for(i=0;i10;i+)fprintf(fp,%d%s%dn,c1i.num,

10、c1i.name,c1i.age);fclose(fp);,对c1班学生按.排序,洗牌和发牌模拟,一付扑克有52张牌,分为4种花色(Suit):黑桃(Spades)、红桃(Hearts)、草花(Clubs)、方块(Diamonds)每种花色有13张牌面(Face):A,2,3,4,5,6,7,8,9,10,Jack,Queen,King,struct CARD/表示一张牌的结构体 char suit10;/花色 char face10;/牌面;,char*suit=Spades,Hearts,Clubs,Diamonds;char*face=A,2,3,4,5,6,7,8,9,10,jack,

11、Queen,King;,int main()int result52;/哪些牌已选用过 struct CARD card52;/存放52张牌 int count=0;int num=0,k;srand(time(NULL);for(k=0;k52;k+)resultk=-1;/所有牌未被发出 while(count52)/共发出52张牌 k=rand()%52;if(-1=resultk)resultk=1;/第k张牌发出 strcpy(cardcount.suit,suitk/13);strcpy(cardcount.face,facek%13);count+;,for(k=0;k52;k+

12、)if(k%3=0)printf(n%2d-,k);else if(i%3=1)printf(%2d-,k);else printf(%2d-,k);printf(%9s,cardk.suit);if(strcmp(cardk.suit,Spades)=0)printf(%c,6);else if(strcmp(cardk.suit,Hearts)=0)printf(%c,3);else if(strcmp(cardk.suit,Clubs)=0)printf(%c,5);else if(strcmp(cardk.suit,Diamonds)=0)printf(%c,4);printf(%6s

13、,cardk.face);printf(n);,int main()struct CARD card52,temp;/存放52张牌 int count,k;srand(time(NULL);for(k=0;k52;k+)/顺序发牌 strcpy(cardk.suit,suitk/13);strcpy(cardk.face,facek%13);count=0;/随机打乱顺序 while(count52)k=rand()%52;temp=cardcount;cardcount=cardk;cardk=temp;count+;,8.3 指向结构体类型数据的指针,int a10,b;int*p;如果p

14、=数组元素ai的地址就是a+i、p+i元素ai的值就是*(a+i)、*(p+i)、pi,struct studentlong num;char name20;char sex;float score;,1指向结构体变量的指针 结构体变量在内存的首地址为其指针,int main()struct student stu1,*p;p=,printf(%ldn,p-num);printf(%cn,p-sex);puts(p-name);printf(%fn,p-score);,struct studentint num;char name20;int score;,#define N 10int ma

15、in()struct student stuN;struct student*p;int i;for(p=stu;pnum,p-name,2指向结构体数组元素的指针,3结构体变量做函数的参数,struct studentint num;char name20;int score;,#define N 10int find(struct student*p)int i,num,score;score=p-score;num=0;for(i=1;iscore score)score=(p+i)-score;num=i;return(num);,int main()struct student st

16、uN;struct student*p;int i,num,score;for(i=0;inum,p-score);,4.返回指向结构体指针的函数,#define N 10struct student*find(struct student*p)int i;struct student*t;t=p;for(i=1;iscore t-score)t=p+i;return(t);,struct studentint num;char name20;int score;,int main()struct student stuN;struct student*p;int i;for(p=stu;pn

17、um,p-name,int main()struct student stuN;struct student*p;int*s;p=stu+3;p-num=103;p-score=87;strcpy(p-name,liming);s=(int*)malloc(sizeof(int);*s=100;p=(struct student*)malloc(sizeof(struct student);p-num=105;p-score=90;strcpy(p-name,zhangsan);,struct studentint num;char name20;int score;,8.4 链表,一、链表的

18、特点:,由若干个结点构成,每个结点是一个结构体类型的数据,每个结点都包含指向下一个结点的指针,最后一个结点的指针为空指针,struct studentint num;int score;struct student*next;struct student*head;,链:结构体中指向同一结构体类型的指针构成,由链首对链表进行操作,链尾指针用NULL表示,二、打印链表,/#define NULL 0#define LEN sizeof(struct student)struct student int num;int score;struct student*next;,建立,void Disp

19、Link(struct student*head)struct student*p;p=head;while(p!=NULL)printf(%d%5dn,p-num,p-score);p=p-next;,int main()struct student*head;head=CreateLink();DispLink(head);DeleteMemory(head);,void DeleteMemory(struct student*head)struct student*p,*pr;p=head;while(p!=NULL)pr=p;p=p-next;free(pr);,释放存储空间,NULL

20、,三、建立链表,建立第一个结点,记录头结点建立第二个结点,拉链建立第三个结点,拉链.处理最后一个结点的链,建立结点-申请空间,读入数据,head,0,20,head,70,NULL,链表的建立过程,pr=p;p=.malloc.pr-next=p;,struct student*CreateLink(void)struct student*head,*p,*pr;pr=p=(struct student*)malloc(LEN);if(NULL=p)printf(No enough memory to allocation!n);exit(0);scanf(%d,%d,while(p-num!

21、=0)if(NULL=head)head=p;else pr-next=p;pr=p;p=(struct student*)malloc(LEN);scanf(%d,%d,pr-next=NULL;free(p);return(head);,struct student*AppendNode(struct student*head)struct student*head,*p,*pr;p=(struct student*)malloc(LEN);if(NULL=p)printf(No enough memory to allocation!n);exit(0);p-next=NULL;scan

22、f(%d,%d,if(NULL=head)head=p;else pr=head;while(pr-next)pr=pr-next;pr-next=p;,int main()struct student*head;char yes;head=NULL;printf(Do you want to append a new node(Y/N)?);scanf(%c,四、查找:,void search(struct student*head,int num)struct student*p;p=head;if(p!=NULL)while(p-num!=num,五、删除结点,.删除p3:条件:p3=h

23、ead),p3,p4,p1,p2,struct student*DeleteNode(struct student*head,int num)struct student*p,*pr;if(head=NULL)printf(list null n);return head;p=head;while(p-num!=num,六、插入结点,插入到p3之前:p0-next=p3;head=p0;,条件:链表已按学号排序,插入学生num操作:建一个结点p0 找到插入的位置,插入结点,p3,p4,p1,p2,插入到p1之前:p0-next=p1;p2-next=p0;,NULL,10178,10390,1

24、1065,11570,p3,p4,p1,p2,插入到p4之后:p0-next=p4-next;p4-next=p0;,NULL,10178,10390,11065,11570,p3,p4,p1,p2,NULL,struct student*InsertNode(struct student*head,int num)struct student*p,*pr,*p0;p0=(struct student*)malloc(LEN);if(NULL=p0)printf(No enough memory to allocation!n);exit(0);p0-num=num;p0-next=NULL;

25、if(head=NULL)head=p0;else,p=head;while(p-numnext!=NULL)pr=p;p=p-next;,if(p-numnum)if(head=p)head=p0;p0-next=p;else pr-next=p0;p0-next=p;else p1-next=p0;p0-next=NULL;,return(head);,8.5 共用体(联合),一、共用体类型的定义,union共用体类型名类型 成员名;类型 成员名;,union dateint i;char ch;float f;a,b,c;,二、共用体类型的特点各成员的地址相同任一时刻只有一个成员起作用成

26、员之间相互覆盖共用体变量不能初始化*共用体变量不能做函数参数*共用体变量不能用做返回值,三、共用体类型变量的定义先定义共用体类型再定义变量在定义共用体类型的同时定义变量直接定义共用体变量,四、共用体变量的使用 printf(%d,a.i);printf(%c,a.ch);printf(%f,a.f);sizeof(union date)=?,union dateint i;char ch;float f;a,b,c;,#define sformat%-6d%-10s%-3c%-3c-%6dn#define tformat%-6d%-10s%-3c%-3c-%6snint main()int n

27、,i;for(i=0;i5;i+)scanf(%d%s%c%c,structint num;char name10;char sex;char job;union int class1;char position10;category;person5;,if(personi.job=s)scanf(%d,8.6 枚举类型,一、枚举类型及枚举类型变量的定义格式:enum 标识符枚举常量表列变量名表enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday oneday,workday,weed_end;先定义枚举类型再定义变量在定义枚举类型的同时定

28、义变量直接定义枚举变量,枚举元素(枚举常量)的值enum weekdaysun,mon,tue,wed,thu,fri,sat oneday;sun=0,mon=1,enum sun=7,mon=1,tue,wed,thu,fri,sat workday;sun=7,mon=1,tue=2,二、枚举类型变量的使用赋值 workday=sun;或 workday=(enum weekday)0;workday=1;*error比较 oneday=sun onedaysat输入/出 不能直接输入输出,printf(%d,workday);.error*int i;enum weekday day;

29、printf(input the value(0-sun,1-mon):);scanf(%d,.,int main()enum colorred,yellow,blue,white,black;enum color i,j,k,pri;int n=0,loop;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i),口袋里有5种颜色的小球若干,每次从口袋中取出3个小球,有多少得到不同颜色小球的取法?,switch(pri)case red:printf(%-10s,red);break;case yellow:printf(%-10s,yellow);break;case blue:printf(%-10s,blue);break;case white:printf(%-10s,white);break;case black:printf(%-10s,black);printf(n);printf(total=%dn,n);return 0;,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号