1、 C语言程序设计 第十一章第十一章 结构体结构体第十一章 结构体与共用体11.1 结构体&结构体是一种构造数据类型&用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体 C语言程序设计 第十一章第十一章 结构体结构体例 struct student int num;char name20;char sex;int age;float score;char addr30;namenumsexagescoreaddr2字节2字节20字
2、节1字节4字节30字节.结构体类型定义描述结构的组织形式,不分配内存结构体类型定义的作用域 C语言程序设计 第十一章第十一章 结构体结构体例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;11.2 结构体变量的定义先定义结构体类型,再定义结构体变量v一般形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;例#define STUDENT struct student STUDENT
3、int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;C语言程序设计 第十一章第十一章 结构体结构体定义结构体类型的同时定义结构体变量一般形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.变量名表列;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;C语言程序设计 第十一章第十一章 结构体结构体直接定义结构体变量一般形式:struct 类型标识符
4、 成员名;类型标识符 成员名;.变量名表列;例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;用无名结构体直接定义变量只能一次 C语言程序设计 第十一章第十一章 结构体结构体说明v结构体类型与结构体变量概念不同l类型类型:不分配内存;变量变量:分配内存l类型类型:不能赋值、存取、运算;变量变量:可以v结构体可嵌套v结构体成员名与程序中变量名可相同,不会混淆v结构体类型及变量的作用域与生存期例 struct date int month;int day;int year;struct s
5、tudent int num;char name20;struct date birthday;stu;numnamebirthdaymonthdayyear例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu;numnamebirthdaymonthdayyear C语言程序设计 第十一章第十一章 结构体结构体11.3 结构体变量的引用引用规则v 结构体变量不能整体引用,只能引用变量成员v可以将一个结构体变量赋值给另一个结构体变量v结构体嵌套时逐级引用成员(分量)运算符
6、优先级:1结合性:从左向右引用方式:结构体变量名.成员名例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);(
7、)stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()例 struct student int num;char name20;struct date int month;int day;int year;birthday;stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct stude
8、nt int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;if(stu1=stu2).()C语言程序设计 第十一章第十一章 结构体结构体11.4 结构体变量的初始化形式一:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;例11.1 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“2
9、00 Beijing Road”;C语言程序设计 第十一章第十一章 结构体结构体形式二:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;C语言程序设计 第十一章第十一章 结构体结构体形式三:struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct int num;char name20;char se
10、x;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;C语言程序设计 第十一章第十一章 结构体结构体11.5 结构体数组结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex;int age;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu
11、2;numnamesexagenumnamesexagestu0stu125B C语言程序设计 第十一章第十一章 结构体结构体结构体数组初始化例 struct int num;char name20;char sex;int age;stu=,;顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;例 struct student int num;char name20;char
12、sex;int age;stu=,;分行初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;全部初始化时维数可省结构体数组引用引用方式:结构体数组名下标.成员名 struct student int num;char name20;char sex;int age;str3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);C语言程序设计 第十一章第十一章 结
13、构体结构体例11.2 统计后选人选票struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例 指向结构体的指针变量main()例11.3 struct st
14、udent long int num;char name20;char sex;float score;stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,Li Lin);p-sex=M;p-score=89.5;printf(nNo:%ldnname:%snsex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score);例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).nu
15、m=101 C语言程序设计 第十一章第十一章 结构体结构体指向结构体数组的指针例11.4 指向结构体数组的指针struct student int num;char name20;char sex;int age;stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1 C语言程序设计 第十一章第十一章 结构体结构体用指向结构体的指针作函数参数v用结构
16、体变量的成员作参数-值传递v用指向结构体变量或数组的指针作参数-地址传递v用结构体变量作参数-多值传递,效率低 C语言程序设计 第十一章第十一章 结构体结构体struct data int a,b,c;main()void func(struct data);struct data arg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);printf(Call Func().n);func(arg);printf(arg.a=%d arg.b=%d arg.c=%d
17、n,arg.a,arg.b,arg.c);void func(struct data parm)printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c);printf(Process.n);parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c);printf(Return.n);arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:
18、30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例11.5 用结构体变量作函数参数 C语言程序设计 第十一章第十一章 结构体结构体struct data int a,b,c;main()void func(struct data *parm);struct data arg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);printf(Call Func().n);func(&
19、arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm)printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Process.n);parm-a=18;parm-b=5;parm-c=parm-a*parm-b;printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Return.n);arga:18b:5c:90(mai
20、n)arga:27b:3c:30(main)例 11.5a 用结构体指针变量作函数参数 arga:27b:3c:30(main)(func)parm*arga:18b:5c:90(main)(func)parm*C语言程序设计 第十一章第十一章 结构体结构体10.7 链表处理链表处理结构指针的应用结构指针的应用11.7.1 11.7.1 概述概述1链表结构链表作为一种常用的、能够实现动态存储分配的数据结构,在数据结构课程中有详细介绍。为方便没有学过数据结构的读者,本书从应用角度,对链表作一简单介绍。(1)头指针变量head指向链表的首结点。(2)每个结点由2个域组成:1)数据域存储结点本身的信
21、息。2)指针域指向后继结点的指针。(3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。1249A 1356B 1475C 1021D Nullhead1249135614751021 C语言程序设计 第十一章第十一章 结构体结构体2语言对链表结点的结构描述语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构用结构类型来描述结点结构。例如:struct grade char no7;/*学号*/int score;/*成绩*/struct grade *next;/*指针域*/;数据域 指针域 C语言程序设计 第十一章第十一章 结构体结构体3对链表的基本操作对链表的基本操作有
22、:创建、检索(查找)、插入、删除和修改等。(1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。headppheadhead C语言程序设计 第十一章第十一章 结构体结构体(3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化:插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k成为ki-1的后继、ki的前驱,如图所示。(4)删除操作
23、是指,删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变化:删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继,如图所示。Ki-1KiKKi-1KiKKi-1KiKi+1Ki-1Ki+1 C语言程序设计 第十一章第十一章 结构体结构体链表操作涉及到的函数1.malloc函数 void*malloc(unsigned int size)在内存的动态存储区中分配一个长度为size的连续空间。成功:返回指向分配域起始地址的指针(void类型)失败:返回空指针(NULL)2.calloc函数 void*call
24、oc(unsigned n,unsigned size)在内存的动态存储区中分配n个长度为size的连续空间。3.free函数 void free(void*p)释放由p指向的内存区,使这部分内存区能被其他变量使用。C语言程序设计 第十一章第十一章 结构体结构体11.7.2 创建一个新链表创建一个新链表例例11.7 编写一个create()函数,按照规定的结点结构,创建一个单链表(链表中的结点个数不限)。基本思路基本思路:首先向系统申请一个结点的空间,然后输入结点数据域的(2个)数据项,并将指针域置为空(链尾标志),最后将新结点插入到链表尾。对于链表的第一个结点,还要设置头指针变量。另外,案例
25、代码中的3个指针变量head、new和tail的说明如下:(1)head头指针变量,指向链表的第一个结点,用作函数返回值。(2)new指向新申请的结点。(3)tail指向链表的尾结点,用tail-next=new,实现将新申请的结点,插入到链表尾,使之成为新的尾结点。/*例11-7代码文件名:11-7.C*/#define NULL 0 C语言程序设计 第十一章第十一章 结构体结构体#define LEN sizeof(struct grade)/*定义结点长度*/*定义结点结构*/struct grade char no7;/*学号*/int score;/*成绩*/struct grade
26、 *next;/*指针域*/;/*create()函数:创建一个具有头结点的单链表*/*形参:无*/*返回值:返回单链表的头指针*/struct grade*create(void)struct grade*head=NULL,*new,*tail;int count=0;/*链表中的结点个数(初值为0)*/for(;)/*缺省3个表达式的for语句*/new=(struct grade*)malloc(LEN);/*申请一个新结点的空间*/C语言程序设计 第十一章第十一章 结构体结构体/*1、输入结点数据域的各数据项*/printf(Input the number of student N
27、o.%d(6 bytes):,count+1);scanf(%6s,new-no);if(strcmp(new-no,000000)=0)/*如果学号为6个0,则退出*/free(new);/*释放最后申请的结点空间*/break;/*结束for语句*/printf(Input the score of the student No.%d:,count+1);scanf(%d,&new-score);count+;/*结点个数加1*/*2、置新结点的指针域为空*/new-next=NULL;/*3、将新结点插入到链表尾,并设置新的尾指针*/if(count=1)head=new;/*是第一个结
28、点,置头指针*/else tail-next=new;/*非首结点,将新结点插入到链表尾*/tail=new;/*设置新的尾结点*/C语言程序设计 第十一章第十一章 结构体结构体 return(head);思考题思考题:在设计存储学号数据的字符数组时,其元素个数应为学号长度+1。为什么?11.7.3 11.7.3 对链表的插入操作对链表的插入操作例例11.811.8 编写一个insert()函数,完成在单链表的第i个结点后插入1个新结点的操作。当i=0时,表示新结点插入到第一个结点之前,成为链表新的首结点。C语言程序设计 第十一章第十一章 结构体结构体基本思路基本思路:通过单链表的头指针,首先
29、找到链表的第一个结点;然后顺着结点的指针域找到第i个结点,最后将新结点插入到第i个结点之后。/*案例代码文件名:10-8.C*/*函数功能:在单链表的第i个结点后插入1个新结点*/*函数参数:head为单链表的头指针,new指向要插入的新结点,i为结点索引号*/*函数返回值:单链表的头指针*/struct grade*insert(struct grade*head,struct grade*new,int i)struct grade*pointer;/*将新结点插入到链表中*/C语言程序设计 第十一章第十一章 结构体结构体if(head=NULL)head=new,new-next=NUL
30、L;/*将新结点插入 到1个空链表中*/else/*非空链表*/if(i=0)new-next=head,head=new;/*使新结点成为 链表 新的首结点*/else /*其他位置*/pointer=head;/*查找单链表的第i个结点(pointer指向它)*/for(;pointer!=NULL&i1;pointer=pointer-next,i-);if(pointer=NULL)/*越界错*/printf(Out of the range,cant insert new node!n);else /*一般情况:pointer指向第i个结点*/new-next=pointer-nex
31、t,pointer-next=new;return(head);pointnew C语言程序设计 第十一章第十一章 结构体结构体例例11.8 11.8 建立链表建立链表create()create()例例11.9 11.9 输出链表输出链表print()print()例例11.10 11.10 删除某个结点删除某个结点delete()delete()#include stdio.h#include#define NULL 0#define NULL 0#define LEN sizeof(struct#define LEN sizeof(struct student)student)struc
32、tstruct student student long num;long num;int int score;score;struct struct student student*next;next;C语言程序设计 第十一章第十一章 结构体结构体例例11.811.8main()main()struct student struct student*creat(intcreat(int n);n);void print(struct void print(struct student student*head);head);struct student struct student*dele
33、te(structdelete(struct student student*head,long num)head,long num);struct struct student student*head;head;int int n;n;long del_num;long del_num;printf(nPlease printf(nPlease input the length of list:);input the length of list:);scanf(%d,&n scanf(%d,&n););head=creat(nhead=creat(n););print(head);pri
34、nt(head);printf(nPlease printf(nPlease input the delete number:);input the delete number:);scanf(%ld,&del_num scanf(%ld,&del_num););head=delete(head,del_num);head=delete(head,del_num);print(head print(head););C语言程序设计 第十一章第十一章 结构体结构体例例11.8 11.8 建立链表建立链表create()create()struct student struct student*cr
35、eat(intcreat(int n)n)struct struct student student*head,head,*p1,p1,*p2;p2;int int i;i;head=NULL;head=NULL;for(i=1;i=n;i+)for(i=1;inum););scanf(%ld,&p1-num);printf(“score printf(“score :);scanf(%d,&p1-score););scanf(%d,&p1-score);if(i=1)head=p1;if(i=1)head=p1;else p2-next=p1;else p2-next=p1;p2=p1;p2
36、=p1;p2-next=NULL;p2-next=NULL;return(head return(head););C语言程序设计 第十一章第十一章 结构体结构体例例11.9 11.9 输出链表输出链表print()print()void print(structvoid print(struct student student*head)head)struct struct student student*p;p;p=head;p=head;printf(Number printf(NumberScoren);Scoren);while(p!=NULL)while(p!=NULL)printf
37、 printf(%ld%5d,p-num,p-score);(%ld%5d,p-num,p-score);p=p-next;p=p-next;printf(n printf(n););C语言程序设计 第十一章第十一章 结构体结构体例例11.10 11.10 删除某个结点删除某个结点delete()delete()struct student struct student*delete(structdelete(struct student student*head,long num)head,long num)struct struct student student*p1,p1,*p2;p2
38、;p1=head;p1=head;while(p1!=NULL)while(p1!=NULL)if(p1-num=num)if(p1-num=num)if(p1=head)head=p1-next;if(p1=head)head=p1-next;else p2-next=p1-next;else p2-next=p1-next;free(p1);free(p1);p2=p1;p2=p1;p1=p1-next;p1=p1-next;return(head return(head););C语言程序设计 第十一章第十一章 结构体结构体例例11.11 11.11 插入某个结点插入某个结点insert(
39、)insert()main()main()struct student struct student*creat(intcreat(int n);n);void print(struct void print(struct student student*head);head);struct student struct student*insert(struct student insert(struct student*head,structhead,struct student student*stud);stud);struct student struct student*head,
40、head,*stustu;int int n;n;printf(nPleaseprintf(nPlease input the length of list:);input the length of list:);scanf(%d,&n);head=creat(n scanf(%d,&n);head=creat(n);print(head););print(head);printf(nPlease printf(nPlease input the inserted record:n);input the inserted record:n);stu=(struct student stu=(
41、struct student*)malloc(LEN)malloc(LEN););printf(Number );scanf(%ld,&stuprintf(Number );scanf(%ld,&stu-num);-num);printf(score );scanf(%d,&stuprintf(score );scanf(%d,&stu-score);-score);head=insert(head,stu head=insert(head,stu););print(head print(head););C语言程序设计 第十一章第十一章 结构体结构体struct student struct
42、student*insert(struct student insert(struct student*head,structhead,struct student student*stud)stud)struct struct student student*p0,p0,*p1,p1,*p2;p2;p1=head;p0=stud;p1=head;p0=stud;if(head=NULL)if(head=NULL)head=p0;p0-next=NULL;head=p0;p0-next=NULL;else else while(p0-num p1-num)&(p1-next!=NULL)whi
43、le(p0-num p1-num)&(p1-next!=NULL)p2=p1;p2=p1;p1=p1-next;p1=p1-next;if(p0-num num)if(p0-num num)if(head=p1)head=p0;if(head=p1)head=p0;else p2-next=p0;else p2-next=p0;p0-next=p1;p0-next=p1;else p1-next=p0;else p1-next=p0;p0-next=NULL;p0-next=NULL;return(head return(head););C语言程序设计 第十一章第十一章 结构体结构体11.8
44、共用体&构造数据类型,也叫联合体&用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union 共用体名共用体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;例 union data int i;char ch;float f;fchi类型定义不分配内存 C语言程序设计 第十一章第十一章 结构体结构体形式一:union data int i;char ch;float f;a,b;形式二:union data int i;char ch;float f;union data a,b,c,*p,d3;形式三:union int i;ch
45、ar ch;float f;a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在 C语言程序设计 第十一章第十一章 结构体结构体共用体变量引用v引用方式:例 a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对)v引用规则l不能引用共用体变量,只能引用其成员共用体指针名共用体指针名-成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名union data int i;char ch;float f;union data a,b,
46、c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.fl共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员例 union int i;char ch;float f;a;a=1;()l不能在定义共用体变量时初始化例 union int i;char ch;float f;a=1,a,1.5;()l可以用一个共用体变量为另一个变量赋值例 float x;union int i;char ch;float f;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;()C语言程序设计 第
47、十一章第十一章 结构体结构体例11.9 将一个整数按字节输出01100001 01000001低字节高字节0100000101100001ch0ch1运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain()union int_char int i;char ch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);C语言程序设计 第十一章第十一章 结构体结构体结构体与共用体v区别:存储方式不同struct node char ch
48、2;int k;a;union node char ch2;int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在v联系:两者可相互嵌套 C语言程序设计 第十一章第十一章 结构体结构体例11.12 结构体中嵌套共用体p.290 name numsexjobclasspositionLiWang10112086FMST501prof循环n次读入姓名、号码、性别、职务job=s真真假假读入class读入position输出“输入错”循环n次job=s真假输出:姓名,号码,性别,职业,班级输出:姓名,号码,性别,职业,职务job=tstruct int num;char na
49、me10;char sex;char job;union int class;char position10;category;person2;C语言程序设计 第十一章第十一章 结构体结构体例共用体中嵌套结构体,机器字数据与字节数据的处理 00010010 00110100低字节高字节0011010000010010lowhigh0 x123400010010 11111111低字节高字节1111111100010010lowhigh0 x12ffstruct w_tag char low;char high;union u_tag struct w_tag byte_acc;int word
50、_acc;u_acc;word_accbyte_acc.lowbyte_acc.highu_acc C语言程序设计 第十一章第十一章 结构体结构体 11.9 11.9 枚举型枚举型1枚举类型的定义 enumenum 枚举类型名枚举类型名 取值表取值表;例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举变量的定义与结构变量类似(1)间接定义例如,enum weekdays workday;(2)直接定义例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat workday;说明(1)枚举型仅适应于取值有限的数据。例如,
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。