计算机二级C语言结构体要点_第1页
计算机二级C语言结构体要点_第2页
计算机二级C语言结构体要点_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机二级C语言结构体要点结构体与共用体要点'、概述结构体(structure )是一种数据类型,它把互相联系的数据组合成一个整体 把不同类型的数据组合成一个有机的整体,可以用结构体解决。结构体中的每一项数据,称为结构体成员”(member)或 分量”。声明结构体类型的一般形式:struct结构体名成员表列;声明各成员的形式:类型名 成员名;例如:学生数据 struct stude ntint num;char n ame20;char sex;int age;float score;char addr30;注意不要忽略最后的分号student结构体类型占59个字节。】、定义结构体类型

2、变量的方法1. 先声明结构体类型再定义变量名struct studentstudent1, student2;要求指定为某一特定的结构体类型2. 在声明类型的同时定义变量struct结构体名成员表列变量名表列;例如:struct studentint num;char n ame20; char sex;int age;float score;char addr30; student1, student2;3. 直接定义结构体类型变量struct成员表列变量名表列; 几点说明:(1)类型与变量是不同的概念;(2) 结构体中的成员可单独使用,其作用与地位相当于普通变量;(3)成员也可以是一个结构

3、体变量;(4)成员名与普通变量名相同,不代表同一对象。三、结构体变量的引用(1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进行输入和 输出。prin tf("%d,%s,%c,%d,%f,%sn",stude ntl);错误(2) 引用成员的方式:结构体变量名成员名stude nt1. nu m=10010;stude nt1.birthday. mon th=3;(若干个成员运算符)当成员是另一个结构体变量时,应一级一级地引用成员。仅在以下两种情况下,可以把结构体变量作为一个整体来访问。(1)结构体变量整体赋值例、student2 = student1;(2)

4、取结构体变量地址例、printf("%x", &student1); /*输出 student1 的地址 */四、结构体变量的初始化struct studentlong int num; /* 学号 */char name20;/* 姓名 */char sex;/* 性别 */char addr20;/* 地址 */a = 89031, "Li Lin", 'M', "123 Beijing Road" ;注意:不能在结构体内赋初值。例、下面程序错误struct student long int num = 8

5、9031; 旳char name20 = "Li Lin" 喃char sex = 'M'吋char addr30 = "123 Bejing Road" 国a;五、结构体数组每个数组元素都是一个结构体类型数据1 .定义结构体数组和定义结构体变量的方法相仿(三种方法)2.结构体数组的初始化在定义数组的后面加上:=初始表列;struct stude nt int num;char n ame20;char sex;int age;float score;char addr30;stu3 = 10101,"Li Lin",

6、'M', 18, 87.5, "103 Beji ng Road" ,10102,"Zhang Fun",'M', 19, 99,"130 Shanghai Roaad" ,10104,"Wang Min", 'F', 20, 78.5, "1010 Zhongshan Road" ;六、指向结构体类型数据的指针结构体变量的指针:就是该变量所占据的内存段的起始地址。1指向结构体变量的指针(*p).num 表示:p指向的结构体变量中的成员num成员运

7、算符“.”优先于“ * ” 运算符,不能写成 *p.num 三*(p.num)三种表示形式:(1) 构体变量名.成员名(2) (*p).成员名该方式用得很少(3) p->成员名2.指向结构体数组的指针(1) p=stu;,则 P+ 指向 stu1(2) 运算符“->”优先于“ + ”运算符+p->num :使p所指向的num成员值加1(+p)->num :先使p+1,然后得到它指向的元素中的num成员值例:有4个学生,每个学生包括学号、姓名和成绩。要求找出成绩最高者的 姓名和成绩。#include "stdio.h"void main() struc

8、t studentint num;/* 学号 */char name20; /* 姓名 */float score; /* 成绩 */;struct student stu4; /* 4 个学生 */struct student *p;int i;int temp = 0; /*成绩最高学生在数组中的序号,03 */float max; /* 最高成绩 */for(i=0; i<4; i+) /* 输入4个学生的学号、姓名、成绩*/scanf("%d %s %f", &stui.num, , &stui.score);for(max=

9、stu0.score, i=1; i<4; i+) /* stu0已赋给 max */if (stui.score > max)max = stui.score;temp = i;p = stu + temp; /* p指向成绩最高的学生结构*/printf("nThe maximum score:n");printf("No.: %dn name: %sn score: %4.1fn",p->num, p->n ame, p->score);3、结构体变量、指向结构体的指针均可作为函数参数例:有一个结构体变量stu,内含学

10、生学号、姓名和三门课程的成绩。要求在main中赋以值,在函数 print中打印输出。#include "stdio.h" #include "string.h"#define format "%dn %sn %fn %fn %fn"struct student*/ int num; /* 学号 */char name20; /* 姓名 float score3; /*三门课程的成绩*/;void print(struct student *p); /* print 函数原型声明*/void main()struct student s

11、tu;stu.num = 12345;strcpy(, "Li Li");stu.score0 = 67.5;stu.score1 = 89;stu.score2 = 78.6;print( &stu );/*如果stu是结构体数组,则不要 &符号*/void print( struct student *p ) /* print 函数定义 */prin tf(format, p->num, p->n ame, p->score0, p->score1, p->score2); printf("n&qu

12、ot;);(1)结构体的成员作函数的参数。值传送,不能修改实参的值与普通变量作函数参数的用法相同。(2) 结构体指针作函数的参数。可以修改实参的值。效率低,不能修改实参的值。将结构体的地址传送给函数,效率高,(3) 结构体作函数的参数。将结构体的全部成员值传送给函数, 例:#in cludevstri ng.h>struct STUchar n ame10;int num;void f(char *n ame,i nt num)struct STU s2="Su nDan ",2004,"Pe nghua",20045;num=s0. num;st

13、rcpy (n ame,s0. name);main ()struct STU s2="Ya ngSa n",20041,"LiSiGuo",20042,*p;p=&s1;f(p->name,p->num);前一个参数的地址,后一个是数值prin tf("%s%dn ",p->n ame,p->nu m);getch();运行结果:SunDan 20042前一个随子函数变化,后一个不变 仍是主函数中的值。七、用指针处理链表(一定要学会画图)1 .链表概述链表:动态地进行存储分配的一种结构,它动态地进行存

14、储分配。 数组:存放不同班级的学生数据,数组定得足够大,浪费内存。数组必须事先定义固定的长度(元素个数),不能适应数据动态地增 减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时, 造成内存浪费。链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以 方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。链表有单向链表、双向链表、环形链表等形式。结点:链表中的每一个元素,包括两部分 用户需要的实际数据 下一个结点的地址head> | A | 11 B | 11 C | 11 D | NULhead指向第一个元素,第一个元素又指向第二个元素,直到最后

15、一个元 素,该元素不再指向其它元素。表尾:地址部分放一个“ NULL ”(表示空地址)结点应为结构体类型,一个结点中应包含一个指针变量,用它存放下一个结点的地址。例: struct studentint num;float score;struct student next;/*next指向 struct student 类型数据 */ ; student 链表2简单链表所有结点都是在程序中定义的,不是临时开辟的,是“静态链表”3 处理动态链表所需的函数(1) malloc(size)作用:在内存的动态存储区中。函数返回值:该分配域的起始地址。不成功,则返回 NULL。(2) calloc(n

16、,size)分配n个长度为size的连续空间(3) free(p)释放由p指向的内存区。函数无返回值。4 建立动态链表即从无到有,一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。例、写一函数建立一个有 3名学生数据的单向动态链表过程:开辟单元f输入数据f加入链表head:头指针pl、p2 :工作指针,p2跟着pl向后走sizeof:求字节运算符(struct student *):返回的指针转换为指向struct student类型数据的指针5 输出链表一般从链表首部依次输出。6. 对链表的删除操作删去结点,即是把它从链表中分离出来即可(1) 删除头结点(2) 删除中后结点7. 对

17、链表的插入操作将一个结点按指定次序,插入到一个已有的链表中(1) 头部(2) 中部(3) 后部例:(1 )下列程序用来从键盘上读入一行字符,并按输入顺序建立一个“反式”链表。即读入的第1个字符存入尾结点,读入的第2个字符存入倒数第2个结点, 依此类推,读入的最后一个字符存入头结点。读入完成后,按链表输出这一行字 符,最后释放全部结点空间例如:读入abed,建立的链表如下图II III III IIIIheadI d|+t|e|+t|b|+t|aI0 Iii iiiiii iiii最后输出的一行字符为 dcba#define NULL 0#defi ne LEN sizeof(struct no

18、 de)#in elude "stdio.h"struct nodechar info; struct node *n ext; mai n()struct node *head,*p;char c;head= NULL ;while(c=getchar()!='n')p=( struct node *)malloc(LEN);p->i nfo=c;p->n ext=head;head= p ;while(head!=NULL)p= head ;head= head->next 或 p->next ;putchar(p-> in

19、 fo);free(p);/* 释放一个结点*/(2)建立一条链,链中的数据按从小到大的顺序排列#in clude <stdio.h>struct nodeint data; struct node *n ext; ;struct node *addx(struct node *head,i nt x)struct n ode *p,*p1,*p2;p=(struct node *)malloc(sizeof(struct no de);p->data=x;if ( head=NULL )head=p;p->n ext=NULL;return(head);if (hea

20、d->data>=p->data) ( p->n ext=head );head=p;retur n (head);p1=head; p2=p1- >n ext;if (p2=NULL)p1- >n ext=p;p->n ext=NULL;return (head);while (p2-> next!=NULL&&( p2->data<p->data )p1=( p2 );p2=p2->n ext; if (p2->data<p->data)p2-> next=p;p-> ne

21、xt=NULL;else( p->next=p2 );p1- >n ext=p;return(head); mai n()struct node *head;int i,x;head=NULL;for (i=0;i<5;i+)printf("nlnput %2dth number!");sea nf("%d", &x);head=addx(head,x); while (head!=NULL)pri ntf("n%d",head->data); head=head->next; 八、共用体1共用体的概念几种不同类型的变量共占同一段内存单元(

温馨提示

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

评论

0/150

提交评论