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

上传人:本田雅阁 文档编号:3164214 上传时间:2019-07-18 格式: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 student int num; char name20; int age; float score; char addr30; ;,整体的名字 称为结构体类型名 (结构体标记),整体的标记,整体的构成

2、单位 称为结构体成员、域,一、结构体类型的定义,struct 结构体类型名 类型 成员名; 类型 成员名; ; ;,struct student int num; char name20; int age; float score; char addr30; ;,struct date int month; int day; int year; ;,二、结构体类型变量的定义 1先定义结构体类型再定义变量,struct student int num; char name20; int age; float score; char addr30; ; struct student student

3、1,student2;,成员的顺序是随意的,2在定义结构体类型的同时定义变量,struct student int num; char name20; int age; float score; char addr30; student1,student2;,3直接定义结构体变量,struct int num; char name20; int age; float score; char addr30; student1,student2;,方式1和2可以在多处定义相同结构体类型的变量 而方式3不行,结构体类型可以嵌套定义,struct date int month; int day; in

4、t year; struct student int num; char name20; char sex; struct date 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. 分量运算符. 优先级与(

5、 )、 相同 stu1.num stu1.name stu1.score stu1.birth.year,struct date int month; int day; int year; ; 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.输入与输出 不能直接输入

6、输出 printf(“%d,%s,%c,%d,%f,%sn“,student); error printf(“%d,%s,%c,%d,%f,%sn“,stu1); error 而是: printf(“%d,%s,“,stu1.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

7、.name,stu2.name) ,5. sizeof(struct student) struct studentint num; char name10;stu1,stu2;,int sum; int sum10; int fun(int sum); int *sum; 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(s

8、truct student *sum); struct student *fun(struct student *sum);,struct student long num; char name20; char sex; int age; struct int year,month,daydate; ;,五、定义类型标识符,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

9、; DATE oneday; typedef int ARRAY100; ARRAY a,b,c; 表示较复杂的类型,给已有的类型起一个新的名字,增加程序的可移植性,一般方法: 先按定义变量的方法写出定义部分 把变量名换成新的类型标识符 在该行最前面加上typedef,8.2 结构体数组,int main( ) int i,j; struct 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); ,

10、计算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,c1i.name,c1i.age); fclose(fp);,对c1班学生按排序,洗牌和发牌模拟,一付扑克有52张牌,分为4种花色(Suit): 黑桃(Spades)、红桃

11、(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“,“Queen“,“King“;,int main( ) int result52;

12、 /哪些牌已选用过 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+) if(k%3=0) print

13、f(“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)

14、printf(“ %c “,4); printf(“%6s“,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=

15、temp; count+; ,8.3 指向结构体类型数据的指针,int a10,b; int *p; 如果p= 数组元素ai的地址就是a+i、p+i 元素ai的值就是*(a+i)、*(p+i)、pi,struct student long 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(“%f

16、n“,p-score);,struct student int num; char name20; int score; ;,#define N 10 int main( ) struct student stuN; struct student *p; int i; for (p=stu; pnum,p-name, ,2指向结构体数组元素的指针,3结构体变量做函数的参数,struct student int num; char name20; int score; ;,#define N 10 int find (struct student *p ) int i,num,score; sc

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

18、re) t=p+i; return(t); ,struct student int num; char name20; int score; ;,int main() struct student stuN; struct student *p; int i; for (p=stu;pnum,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)

19、; *s=100; p=(struct student*)malloc(sizeof(struct student); p-num=105; p-score=90; strcpy(p-name,“zhangsan“); ,struct student int num; char name20; int score; ;,8.4 链表,一、链表的特点:,由若干个结点构成,每个结点是一个结构体类型的数据,每个结点都包含指向下一个结点的指针,最后一个结点的指针为空指针,struct student int num; int score; struct student *next; ; struct

20、student *head;,链:结构体中指向同一结构体类型的指针构成,由链首对链表进行操作,链尾指针用NULL表示,二、打印链表,/#define NULL 0 #define LEN sizeof(struct student) struct student int num; int score; struct student *next; ;,建立,void DispLink(struct student *head) struct student *p; p=head; while (p!=NULL) printf(“%d %5dn“,p-num,p-score); p=p-next;

21、 ,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,三、建立链表,建立第一个结点,记录头结点 建立第二个结点,拉链 建立第三个结点,拉链 . 处理最后一个结点的链,建立结点-申请空间,读入数据,head,0,20,he

22、ad,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!=0) if (NULL=head) head=p; else pr-next=p; pr=p; p=(struct stude

23、nt *)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; scanf(“%d,%d“, ,if(NULL=head) head=p; el

24、se 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=hea

25、d ),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

26、;,NULL,101 78,103 90,110 65,115 70,p3,p4,p1,p2,插入到p4之后: p0-next=p4-next; p4-next=p0;,NULL,101 78,103 90,110 65,115 70,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 allocat

27、ion!n“); exit(0); p0-num=num; p0-next=NULL; 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

28、 date int i; char ch; float f; a,b,c;,二、共用体类型的特点 各成员的地址相同 任一时刻只有一个成员起作用 成员之间相互覆盖 共用体变量不能初始化* 共用体变量不能做函数参数* 共用体变量不能用做返回值,三、共用体类型变量的定义 先定义共用体类型再定义变量 在定义共用体类型的同时定义变量 直接定义共用体变量,四、共用体变量的使用 printf(“%d“,a.i); printf(“%c“,a.ch); printf(“%f“,a.f); sizeof(union date)=?,union date int i; char ch; float f; a,b,

29、c;,#define sformat “%-6d%-10s%-3c%-3c-%6dn“ #define tformat “%-6d%-10s%-3c%-3c-%6sn“ int main() int n,i; for (i=0; i5; i+) scanf(“%d %s %c %c“, ,struct int num; char name10; char sex; char job; union int class1; char position10; category; person5;,if (personi.job=s) scanf(“%d“, ,8.6 枚举类型,一、枚举类型及枚举类型

30、变量的定义 格式:enum 标识符枚举常量表列变量名表 enum weekday sun,mon,tue,wed,thu,fri,sat; enum weekday oneday,workday,weed_end; 先定义枚举类型再定义变量 在定义枚举类型的同时定义变量 直接定义枚举变量,枚举元素(枚举常量)的值 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,二、枚举类型变量的使用 赋值

31、 workday=sun; 或 workday=(enum weekday)0; workday=1; * error 比较 oneday=sun onedaysat 输入/出 不能直接输入输出, printf(“%d“,workday); .error* int i; enum weekday day; 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 (

32、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备18001539号-1