




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(优选)程序设计结构体和联合体现在是1页\一共有43页\编辑于星期一例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
structstudentstu1,stu2;9.2
结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名变量名表列;例#defineSTUDENTstructstudent
STUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;现在是2页\一共有43页\编辑于星期一定义结构体类型的同时定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;现在是3页\一共有43页\编辑于星期一直接定义结构体变量一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次现在是4页\一共有43页\编辑于星期一说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];
structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear现在是5页\一共有43页\编辑于星期一9.3
结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()现在是6页\一共有43页\编辑于星期一【例】main(){structstudent{intnumber;charname[6];charsex;intage;charaddress[20];};
printf("%d\n",sizeof(structstudent));}结果:31现在是7页\一共有43页\编辑于星期一【例】若有以下定义,则正确的赋值语句为
。structcomplex{floatreal;floatimage;};structvalue{intno;structcomplexcom;}val1;A)com.real=1;B)plex.real=1;C).real=1;D)val1.real=1;答案:C).real=1
现在是8页\一共有43页\编辑于星期一9.4
结构体变量的初始化形式一:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};现在是9页\一共有43页\编辑于星期一形式二:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};现在是10页\一共有43页\编辑于星期一形式三:struct{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};现在是11页\一共有43页\编辑于星期一进行所谓“结构体变量赋值”只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体变量stu,以下语句是错误的:scanf(“%s,%s,%ld”,stu);printf(“%s,%s,%ld”,stu);正确编程:main(){struct{charname[15];charclass[12];longnum;}stu;scanf("%s",);scanf("%s",stu.class);scanf("%ld",&stu.num);printf("%s,%s,%ld\n",,stu.class,stu.num);}亦可用以下赋值语句:strcpy(,”wenli”);strcpy(stu.class,“Computer”);stu.num=200113;但是如果改为=”wenli”是错误的。
现在是12页\一共有43页\编辑于星期一9.5
结构体数组结构体数组的定义三种形式:形式一:
structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B现在是13页\一共有43页\编辑于星期一结构体数组初始化例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};例structstudent{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时长度可省结构体数组引用引用方式:结构体数组名[下标].成员名structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);现在是14页\一共有43页\编辑于星期一例统计后选人选票structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang000现在是15页\一共有43页\编辑于星期一9.6
结构体和指针指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例指向结构体的指针变量main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");
p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);}例intn;int*p=&n;
*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101现在是16页\一共有43页\编辑于星期一指向结构体数组的指针例指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+1现在是17页\一共有43页\编辑于星期一用指向结构体的指针作函数参数用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低现在是18页\一共有43页\编辑于星期一structdata{inta,b,c;};main(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数现在是19页\一共有43页\编辑于星期一structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)例用结构体指针变量作函数参数arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****现在是20页\一共有43页\编辑于星期一hours=0;delay();}structtm{inthours,minutes,seconds;};main(){structtmtime;time.hours=time.minutes=time.seconds=0;clrscr();printf("Now,pressanykeytobeginmyclock...");getch();for(;;){update(&time);display(&time);}}update(structtm*t){(*t).seconds++;if((*t).seconds==60){(*t).seconds=0;(*t).minutes++;}if((*t).minutes==60){(*t).minutes=0;(*t).hours++;}if((*t).hours==24)(*t).display(structtm*t){clrscr();printf("%d:",(*t).hours);printf("%d:",(*t).minutes);printf("%d\n",(*t).seconds);}delay(){longintt;for(t=1;t<=11128000;++t);}现在是21页\一共有43页\编辑于星期一9.7链表特点:按需分配内存不连续存放有一个“头指针”(head)变量每个结点中应包括一个指针变量,用它存放下一结点的地址。最后一个结点的地址部分存放一个“NULL”(空地址)。现在是22页\一共有43页\编辑于星期一链表结点定义形式定义形式:structstudent{intnumber;charname[6];structstudent*next;};现在是23页\一共有43页\编辑于星期一链表操作常用技术语句p=p->next
在链表结点间顺序移动指针将p原来所指结点中next的值赋给p,而p->next值即下一结点起始地址,故p=p->next的作用是使p指向下一结点起始地址。p2->next=p1
将新结点添加到现在链表中如果p2是链表中的末结点,p1指新建结点,此句的功能是使p1所指新结点变成链表中的新的末结点。p2->next=NULL
让p2所在结点成为链表中最后结点现在是24页\一共有43页\编辑于星期一示例若已建立下面的链表结构,指针p指向某单向链表的首结点,如下图所示。structnode{intdata;structnode*next;}*p;以下语句能正确输出该链表所有结点的数据成员data的是
。
A)for(;p!=NULL;p++)printf(“%7d,”,p->data);B)for(;!p;p=p->next)printf(“%7d,”,(*p).data);
C)while(p){printf(“%7d,”,(*p).data);p=p->next;}D)while(p!=NULL){printf(“%7d,”,p->data);p++;}答案:C现在是25页\一共有43页\编辑于星期一链表指针p++表示什么?main(){structstu{intnum;char*name;intage;}st={12,"ABC",100},*p=&st;clrscr();printf("%p\n",p++);printf("%p\n",p++);printf("%p\n",p++);printf("%p\n",p++);printf("%d\n",sizeof(st));}结果:
FFD8FFDEFFE4FFEA6结论:
若p指向某个结构体变量,则p++
的功能是将指针p移到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p++进行结点间的跳转。现在是26页\一共有43页\编辑于星期一静态链表的建立#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf("%ld,%.1f\n",p->num,p->score);p=p->next;}while(p!=NULL);}注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?现在是27页\一共有43页\编辑于星期一二、内存分配函数1、“动态内存分配”的概念使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。如,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。使用动态内存分配技术建立的链表称为“动态链表”。现在是28页\一共有43页\编辑于星期一2、动态内存分配函数
以下函数在malloc.h或stdlib.h中定义(n,x为无符号整数,p为指针变量):void*malloc(x)
分配一个长度为x字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回NULLvoid*calloc(n,x)
分配n个长度为x字节的连续空间(成败结果同上)void*realloc(p,x)
将p所指的已分配空间大小调整为x个字节voidfree(p)将由以上各函数申请的以p为首地址的内存空间全部释放现在是29页\一共有43页\编辑于星期一动态内存分配函数使用示例#include"stdlib.h"main(){char*p;p=(char*)malloc(17);if(!p){printf("内存分配出错");exit(1);}strcpy(p,"Thisis16chars");/*如果超过16个字符,可能破坏程序其他部分*/p=(char*)realloc(p,18);if(p==NULL){printf("内存分配出错");exit(1);}strcat(p,".");puts(p);free(p);}结果:Thisis16chars.现在是30页\一共有43页\编辑于星期一#include<stdio.h>#include<malloc.h>main(){int*p,i;p=calloc(10,sizeof(int));for(i=0;i<10;i++,p++)*p=2*i;p=p-10;clrscr();for(i=0;i<10;i++,p++)printf("%d,",*p);}现在是31页\一共有43页\编辑于星期一动态链表的建立和遍历示例
(后进先出的数据结构,即所谓“栈”)#defineNULL0structinfo{intdata;structinfo*next;};main(){structinfo*base,*p;intn;base=NULL;
for(n=0;n<10;n++){p=(structinfo*)malloc(sizeof(structinfo));p->data=n+1;p->next=base;base=p;}while(p!=NULL){printf("%4d",p->data);p=p->next;}}结果:10987654321
现在是32页\一共有43页\编辑于星期一动态链表的建立和遍历示例#defineNULL0structinfo{longnum;intscore;structinfo*next;};main(){
structinfo*head,*p1,*p2;intn=1;clrscr();
head=p1=p2=(structinfo*)malloc(sizeof(structinfo));printf("请输入第%d个同学的学号和成绩:",n++);scanf("%ld,%d",&p1->num,&p1->score);while(p1->num!=0){p1=(structinfo*)malloc(sizeof(structinfo));if(!p1){printf("内存分配出错!");exit();}printf("请输入第%d个同学的学号和成绩:",n++);scanf("%ld,%d",&p1->num,&p1->score);p2->next=p1;p2=p1;}p2->next=NULL;p1=head;while(p1->next!=NULL){printf("%ld,%d\n",p1->num,p1->score);p1=p1->next;}}现在是33页\一共有43页\编辑于星期一对链表的删除操作
structstudent*del(structstudent*head,longnum){structstudent*p1,*p2;if(head==NULL){printf("\n空链表!\n");gotoend;}p1=head;while(num!=p1->num&&p1->next!=NULL){p2=p1;p1=p1->next;}/*非所找结点且非未结点后移*/if(num==p1->num)/*找到了*/{if(p1==head)head=p1->next;/*为首结点*/elsep2->next=p1->next;/*非首结点*/printf("delete:%ld\n",num);n=n-1;}elseprintf(“%ldnotbeenfound!\n”,num);/*未找到*/end:return(head);}现在是34页\一共有43页\编辑于星期一对链表的插入操作
structstudent*insert(structstudent*head,structstudent*stud){structstudent*p0,*p1,*p2;p1=head;/*p1指向第一个结点*/p0=stud;/*p0指向要插入的结点*/if(head==NULL)/*如为空链表*/{head=p0;p0->next=NULL;}else{while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}/*寻找位置*/if(p0->num<=p1->num){if(head==p1)head=p0;/*如最小插在第一个结点前*/elsep2->next=p0;/*否则插在p1所指结点前*/p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}/*未找到插在最后*/n=n+1;return(head);}现在是35页\一共有43页\编辑于星期一9.8
共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union共用体名{
类型标识符成员名;类型标识符成员名;
…………….};例uniondata{inti;charch;floatf;};fchi类型定义不分配内存现在是36页\一共有43页\编辑于星期一形式一:uniondata{inti;charch;floatf;}a,b;形式二:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在现在是37页\一共有43页\编辑于星期一共用体变量引用引用方式:例a.i=1;a.ch=‘a’;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对)
引用规则不能引用共用体变量,只能引用其成员共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;()
不能在定义共用体变量时初始化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常规规则幼儿园
- 2025年农村经济发展与管理考试试题及答案
- 陕西省西安航天中学2025届七年级英语第二学期期末学业水平测试试题含答案
- 妊娠胃肠炎护理计划书
- 6.1 体验“热带风情”东南亚(第一课时)课件 晋教版七年级地理下册
- 副井提升机安装施工组织设计
- 2025年房地产估价师考试题目及答案
- 2025年地理教师资格证考试卷及答案
- 2025年电子商务法专业考试试卷及答案
- 2025年茶艺与茶文化考试试题及答案
- 学院财务处查阅档案申请表
- 铸铁闸门及启闭机安装说明及操作手册
- 过敏性休克的急救及处理流程教材课件(28张)
- 物理发泡绝缘的生产与应用课件
- 北交所评测20题及答案
- 《消防安全技术实务》课本完整版
- CLSI EP25-A 稳定性考察研究
- SJG 44-2018 深圳市公共建筑节能设计规范-高清现行
- 职工子女暑期工会爱心托管班的方案通知
- (5年高职)客户服务实务(第二版)教学课件全套电子教案汇总整本书课件最全教学教程完整版教案(最新)
- 儿科患儿及家属的沟通技巧
评论
0/150
提交评论