《【教学课件】第九章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第九章结构体与共用体.ppt(57页珍藏版)》请在三一办公上搜索。
1、结构体是C语言中的另外一种构造型数据,它 是由不同类型的数据项组成的复合类型。结构体 是建造动态数据结构非常有用的工具。如,由结构体类型的数据所构成的链表等。本章将介绍结构体类型的定义、引用和结构 体数组、结构体指针以及由结构体所构成的链表,第9章 结构体与链表,学号 姓名 性别 年龄 成绩 电 话,int,char,float,struct stu int num;char name20;int age;float score;long int tele;a;,结构体,long int,一、结构体类型变量的定义,struct 类型名 成员 表列;变量名;,格式:,struct stu int
2、 num;char name10;float score;a;,结构体类型所占内存的字节数=所有成员的字节总和,16,9.1 结构体类型的基本操作,num name score,2000,2002,200C,a,二、结构体类型变量的引用,变量名.成员名,struct stu int num;char name10;float score;a;,scanf(“%d,%s,%f”,printf(“%d,%s,%fn”,a.num,a.name,a.score);,三、结构体变量的初始化,struct stu int num;char name10;float score;a=101,“王一”,68
3、.5;,num name score,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。若要处理一批这样的数据时,就要用到结构体数组。,9.2 结构体数组,a0,a0.num,struct stu int num;char name10;float score;a3;,a0.name,a0.score,a1,a2,a0,struct stu int num;char name20;int age;float score;long int tele;a3,a1,a2,=10010,“王一”,20,98.5,8802766,10011,“李雨”,19,67.8,8802765
4、,10012,“欧杨”,20,88.5,8802769,;,a0,a1,a2,for(i=0;i3;i+)scanf(“%d,%s,%d,%f%ld”,请设计一个统计选票的程序。现设有三个候选人的名单,请分别统计出他们各得票的多少。,候选人姓名,票数,秋 雨,春 风,冬 雪,0,0,0,EXAMPLE9-1:,struct person char name20;int sum;a3=“qiu”,0,“chun”,0,“dong”,0;,main()int i,j;char name20;for(i=1;i=10;i+),scanf(“%s”,name);,for(j=0;j3;j+),if(s
5、trcmp(name,aj.name)=0),aj.sum+;,for(i=0;i3;i+)printf(“%s,%dn”,ai.name,ai.sum);,a0,a1,a2,请将5名学生的数据写入到stu数组中。每条数据包括有num、name、score。要求:请输出score不及格的学生并统计出不及格的人数。,EXERCISES9-1:,一个结构体变量的指针就是该变量所占据内存段的起始地址可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值就是该结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。,一、指向结构体变量的指针,struct stu int num;cha
6、r name10;float score;a=101,“Li”,68.5;,p=,printf(“%d,%s,%f n”,(*p).num,(*p).name,(*p).score);,p-num,p-name,p-score);,struct stu*p;,a,*p,一、指向结构体变量的指针,p=a;,二、指向结构体数组的指针,a0,a1,a2,printf(“%d,%s,%f n”,(*p).num,(*p).name,(*p).score);,struct stu*p;,for(;pa+3;p+),struct stu int num;char name10;float score;a3
7、=101,“Li”,68.5,102,“Wang”,67.8,103,“Ma”,88.5;,*p,*p,*p,链表是指将若干个数据项按一定的原则连接起来的表。链表中每一个数据称为节点。链表连接的原则是:前一个节点指向下一个节点;而且只有通过前一个节点才能找到下一个节点。链表是一种常见的重要的数据结构。利用它可以实现动态地进行存储分配。,9.3 链表,1249,*h,1094,1021,头指针,单向链表结构,空地址,1094,1021,NULL,struct stu int num;float score;a,b,c;,一、简单链表的建立与输出,struct stu*next;,struct s
8、tu*h;,a.num=101;,a,b,c,101,a.score=98.5;,98.5,b.num=102;,b.score=67.8;,102,67.8,c.num=103;,c.score=88.5;,103,88.5,struct stu int num;float score;a,b,c;,struct stu*next;,struct stu*h;,a.num=101;,a,b,c,101,a.score=98.5;,98.5,b.num=102;,b.score=67.8;,102,67.8,c.num=103;,c.score=88.5;,103,88.5,h=,*h,a.n
9、ext=,b.next=,c.next=NULL;,NULL,struct stu*p;,a,b,c,101,98.5,102,67.8,103,88.5,*h,NULL,*p,p=h;,for(;),p=(*p).next,printf(“%d,%fn”,(*p).num,(*p).score);,p!=NULL;,*p,*p,二、动态链表的建立与输出,所谓动态链表的建立是指在程序执行过程中从无到有地建立一个链表,即一个一个地开辟节点和输入各节点数据,并建立起前后相链的关系。,动态分配存储空间函数,int*p1;p1=malloc(2);,p1=malloc(int);,p1=malloc(
10、float);,malloc(),*p1,p1=(struct*)malloc(sizeof(struct stu);,struct stu int num;float score;struct stu*next;*p1;,p1=(float*)malloc(sizeof(float);,为强制类型转换。即将由malloc 函数得到的地址值转换成一个浮点类型存储单元的地址值。,为字节数运算符,在此是用来说明该指针变量将要开辟的是非字符类型的动态内存。,*p1,*h,*p1,struct stu int num;float score;struct stu*next;*h,*p1,*p2;,p1
11、=(struct stu*)malloc(sizeof(struct stu);,h=p1;,p1=(struct stu*)malloc(sizeof(struct stu);,*p1,h.next=p1;,p2=p1;,*p2,p1=(struct stu*)malloc(sizeof(struct stu);,*p1,p2.next=p1;,p2=p1;,*p2,*h,*p1,struct stu int num;float score;struct stu*next;*h,*p1,*p2;,NULL,main()int i;,p2=p1=(struct stu*)malloc(size
12、of(struct stu);,p2=p1;,*p2,*p2,for(i=1;i2;i+),p2-next=p1;,scanf(“%d,%fn”,h=p1;,scanf(“%d,%fn”,p2-next=NULL;,*h,*p1,struct stu int num;float score;struct stu*next;*h,*p1,*p2;,NULL,main(),*p2,p1=h;,printf(“%d,%f n”,p1-num,p1-score);,p1=p1-next;,*p1,while(p!=NULL),*h,NULL,三、动态链表的插入操作,动态链表的插入操作是指将一个节点插入
13、到一个已有的链表中。,*p1,struct stu int num;float score;struct stu*next;*h,*p1,*p2;,NULL,main(),*p2,scanf(“%d,%f”,p2=p1;,p0=,struct stu*p0,x;,x,*p2,*p0,while(p0-scorep1-score),p1=p1-next;,p2-next=p0;,*p0-next=p1;,*p1,*p2,*p1,*h,若有以下定义:,struct link int data;struct link*next;a,b,c,*p,*q;,a,b,c,能将节点c插入到上述链表结构中的a
14、与b之间,以形成新的链表结构的语句组是:,A)a.next=c;c.next=b;B)p.next=q;q.next=p.next;C)p-.next=,EXERCISES9-2:,*p,*q,若已建立下面的链表结构,指针 p、s 分别指向图中所示的 节点,则不能将 s所指的节点插入到链表末尾的语句组是:,A)s-next=NULL;p=p-next;p-next=s;B)p=p-next;s-next=p-next;p-next=s;C)p=p-next;s-next=p;p-next=s;D)p=(*p).next;(*s).next=(*p).next;(*p).next=s;,*s,E
15、XERCISES9-3:,若有以下说明和语句,则表达式()中的值为 101。,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,A)*p-b B)p-a C)+p-a D)(p+)-a,EXERCISES9-4:,*p,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x0.ax0.b,x1.ax1.
16、b,100,300,A)*p-b B)p-a C)+p-a D)(p+)-a,*(x0.b),运算符-优先于*,A)*p-b,11,*p,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x0.ax0.b,x1.ax1.b,100,300,A)*p-b B)p-a C)+p-a D)(p+)-a,x0.a,B)p-a,11,100,*p,struct wc int a;int*b;*p;int x0=11,12,x1=3
17、1,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x0.ax0.b,x1.ax1.b,100,300,A)*p-b B)p-a C)+p-a D)(p+)-a,+(p-a),C)+p-a,11,101,+x0.a,*p,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x1.ax1.b,100,300,A)*p-b B)p-a C
18、)+p-a D)(p+)-a,x1.a,D)(p+)-a,11,100,*p,x0.ax0.b,若有以下说明和语句,则表达式()中的值为 31。,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,A)*p-b B)(p+)-a C)*(p+)-b D)*(+p)-b,EXERCISES9-5:,*p,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x0
19、0 x01,x10 x11,x0,x1,a,*b,x1.ax1.b,100,300,A)*p-b,11,x0.ax0.b,A)*p-b B)(p+)-a C)*(p+)-b D)*(+p)-b,*p,struct wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x1.ax1.b,100,300,C)*(p+)-b,11,x0.ax0.b,A)*p-b B)(p+)-a C)*(p+)-b D)*(+p)-b,*p,*p,struct
20、 wc int a;int*b;*p;int x0=11,12,x1=31,32;static struct wc x2=100,x0,300,x1;p=x;,x00 x01,x10 x11,x0,x1,a,*b,x1.ax1.b,100,300,D)*(+p)-b,x0.ax0.b,A)*p-b B)(p+)-a C)*(p+)-b D)*(+p)-b,*p,31,若有以下语句,则表达式()中的值为 6。,struct st int n;struct st*next;static struct st a3=5,A)p+-n B)p-n+C)(*p).n+D)+p-n,EXERCISES9-6
21、:,a0,5,struct st int n;struct st*next;*p;static struct st a3=5,a1,7,a2,9,A)p+-n B)p-n+C)(*p).n+D)+p-n,A)p+-n,*p,*p,(*p).n;+p;,5,a0,5,struct st int n;struct st*next;*p;static struct st a3=5,a1,7,a2,9,A)p+-n B)p-n+C)(*p).n+D)+p-n,B)p-n+,*p,(*p).n;n+;,6,a0,5,struct st int n;struct st*next;*p;static str
22、uct st a3=5,a1,7,a2,9,A)p+-n B)p-n+C)(*p).n+D)+p-n,C)(*p).n+,*p,(*p).n;n+;,6,a0,5,struct st int n;struct st*next;*p;static struct st a3=5,a1,7,a2,9,A)p+-n B)p-n+C)(*p).n+D)+p-n,D)+p-n,*p,(*p).n;+n;,6,以下程序的输出结果是:,#include#include main()int a23=1,3,5,7,9,11,*p;p=(int*)malloc(sizeof(int);fun(,fun(int*s
23、,int p23)*s=p11;,9,EXERCISES9-7:,5,7,9,*p,五、动态链表的删除操作,动态链表的删除操作是指将一个节点从一个已有的链表删除掉中。,struct st int n;struct st*next;*p;static struct st a3=5,五、动态链表的删除操作,动态链表的删除操作是指将一个节点从一个已有的链表删除掉中。,a,b,c,x,struct ss int info;struct ss*link;x,y,z;,且建立以下图所示的链表结构:,x.link=y.link;,x,请写出删除节点y的赋值语句是()。,y,z,EXERCISES9-8:,s
24、truct ss char name10;int age;char sex;std3,*p=std;,设有以下定义,请指出下面各输入语句中错误的是:,A)scanf(“%d”,EXERCISES9-9:,struct ss int x;int y;data2=10,100,20,200;main()struct ss*p;p=data;printf(“%dn”,+(p-x);,A)10 B)11 C)20 D)21,EXERCISES9-10:,struct node int data;struct node*next;*p,*q,*r;,有以下结构体说明和变量定义,如图所示,指针 p、q、r
25、 分别指向同一个链表中的三个连续的节点。,*p,现要将p和r所指节点的先后位置交换,同时要保持链表的连接,则以下错误的程序段是:,EXERCISES9-11:,*q,*r,A)r-next=q;q-next=r-next;p-next=r;B)q-next=r-next;p-next=r;r-next=q;C)p-next=r;q-next=r-next;r-next=q;D)q-next=r-next;r-next=q;p-next=r;,*p,*q,*r,struct node int data;struct node*next;*p,*q,*r;,现要将p和r所指节点的先后位置交换,同时
26、要保持链表的连接,则以下错误的程序段是:,struct NODE int num;struct NODE*next;main()struct NODE*p,*q,*r;p=(struct NODE*)malloc(sizeof(struct NODE);q=(struct NODE*)malloc(sizeof(struct NODE);r=(struct NODE*)malloc(sizeof(struct NODE);p-num=10;q-num=20;r-num=30;p-next=q;q-next=r;printf(“%dn”,p-num+q-next-num);,A)10 B)20
27、C)30 D)40,EXERCISES9-12:,10,*p,20,30,*q,*r,struct NODE int num;struct NODE*next;main()struct NODE*p,*q,*r;p=(struct NODE*)malloc(sizeof(struct NODE);q=(struct NODE*)malloc(sizeof(struct NODE);r=(struct NODE*)malloc(sizeof(struct NODE);p-num=10;q-num=20;r-num=30;p-next=q;q-next=r;printf(“%dn”,p-num+q
28、-next-num);,struct STU char num10;float ss3;s3=“20021”,90,95,85,“20022”,95,80,75,“20023”,100,95,90;main()struct STU*p=s;int i;float sum=0.0;for(i=0;issi;printf(“%6.2fn”,sum);,A)260.00 B)270.00 C)280.00 D)285.00,EXERCISES9-13:,struct STU char num10;float ss3;main()struct STU s3=“20021”,90,95,85,“2002
29、2”,95,80,75,“20023”,100,95,90,*p=s;int i;float sum=0.0;for(i=0;issi;printf(“%6.2fn”,sum);,s0,s1,s2,0.0,sum,90.00,185.00,270.00,*p,EXERCISES9-1:,struct STU char num10;float ss3;main()struct STU s3=“20021”,90,95,85,“20022”,95,80,75,“20023”,100,95,90,*p=s;int i,k;float sum;for(k=0;kssi;printf(“%6.2fn”,sum);,s0,s1,s2,*p,*p,*p,struct sk int a;float b;data;int*p;,设有以下定义:,若要使 p 指向 data 中的 a 域,则正确的赋值语句是:,A)p=,EXERCISES9-14:,