【文档说明】C语言程序设计PPT第8章结构体程序设计.ppt,共(54)页,1020.012 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2209.html
以下为本文档部分文字说明:
C语言程序设计(第3版)张磊编著清华大学出版社《C语言程序设计》(第3版)张磊编著,2012年10月清华大学出版社出版。该教材面向程序设计初学者编写,适合将C语言作为第一门程序设计语言的高校学生。该教材理论教学和实验教学合二为一,在每章之后均设有实验指导。
实验指导分为基础实验和综合实验两部分。基础实验紧密结合教材中的例题程序设置,以“理解—验证—完善—扩充—提高”为实验教学线索,重在巩固课堂教学知识,提高调试程序及完善程序的能力;综合实验以算法设计和程序实现为重点,训练运用所学知识解决实际问题的
能力。该教材同时配有程序资源和试题库。Email:mail16300@163.com《C语言程序设计》(第3版)课件C语言程序设计(第3版)张磊编著清华大学出版社C语言程序设计第8章结构体程序设计《C语言程序设计》(第3版)张磊编著21世纪高等学校规
划教材清华大学出版社C语言程序设计(第3版)张磊编著清华大学出版社第8章结构体程序设计◆8.1结构体数据概述◆8.2结构体类型和结构体变量◆8.3结构体数组◆8.4结构体指针变量◆8.5使用动态链表存储数据◆8.6链表的基本
操作◆8.7结构体应用举例C语言程序设计(第3版)张磊编著清华大学出版社8.1结构体数据概述结构体数据是由多个数据项组合而成的数据,如表8-1所示的学生信息表,当把每一行视为一个完整数据时,该数据就是一个结构体数据。为了有效地处理这
样一类组合数据,C语言提供了“结构体”技术,它可以把多个数据项组合起来,作为一个数据整体进行处理。学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF81990
4zhangliF829905wangfengM88C语言程序设计(第3版)张磊编著清华大学出版社8.1结构体数据概述C语言程序设计(第3版)张磊编著清华大学出版社8.2结构体类型和结构体变量◆8.2.1
使用结构体变量存储学生信息◆8.2.2定义结构体数据类型◆8.2.3结构体变量的定义及使用C语言程序设计(第3版)张磊编著清华大学出版社8.2.1使用结构体变量存储学生信息例8-1利用结构体变量存储表8-1中第1行的学生信息,并输出其姓名和成绩。#include<stdio.h>s
tructstudent/*定义结构体数据类型*/{intnum;charname[20];charsex;intscore;};voidmain(){structstudentstu={9011,"liujia",'M',87};printf("Name:
%s\n",stu.name);printf("Score:%d\n",stu.score);}C语言程序设计(第3版)张磊编著清华大学出版社8.2.2定义结构体数据类型⚫定义结构体类型的一般格式struct结构体名{成员表};说明:⑴“结构体名”是用户定义的结构体的名字,在以后定义结构体变量时,
使用该名字进行类型标识。⑵“成员表”是对结构体数据中每一个数据项的变量说明,其格式与说明一个变量的一般格式相同:数据类型名成员名;⑶“struct”是关键字,“struct结构体名”是结构体类型标识符,在类型定义和类型使用时“struct”都不能
省略。⑷结构体名称可以省略,此时定义的结构体称为无名结构体。C语言程序设计(第3版)张磊编著清华大学出版社9.1.2结构体类型定义⚫学生组合数据的结构体类型定义:structstudent{intnum;charname[20];charsex;intscore
;};学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C语言程序设计(第3版)张磊编著清华大学出版社8.2.3结构体变量的定义及使用1.定义结构体变量⑴先
定义结构体类型,再定义结构体变量。⚫一般格式struct结构体类型名称结构体变量名;如:structstudentstudent1,student2;C语言程序设计(第3版)张磊编著清华大学出版社8.2.3结构体变量的定义及使用⑵在定义结构体
类型的同时定义结构体变量。⚫一般格式struct结构体名{成员表}结构体变量1,结构体变量2,┅…,结构体变量n;例如:structstudent{intnum;charname[20];charsex;intscore;}student
1,student2;C语言程序设计(第3版)张磊编著清华大学出版社8.2.3结构体变量的定义及使用⑶不定义结构体类型名,直接定义结构体类型变量。⚫一般格式struct{成员表;}结构体变量1,结构体变量2,…,结构体变量n;例如:struct{intnum;c
harname[20];charsex;intscore;}student1,student2;C语言程序设计(第3版)张磊编著清华大学出版社8.2.3结构体变量的定义及使用2.引用结构体成员⚫引用结构体成员的一般格式结构体变量名.成员名称例如
:student1.age例8-2输入两个学生的信息,然后输出学习成绩高的学生的姓名和成绩信息。若成绩相同时,只输出第1个学生的信息。#include<stdio.h>structstudent{intnum;
charname[20];charsex;intscore;}stu1,stu2;voidmain(){printf("Data1:");scanf("%d%s%c%d",&stu1.num,stu1.name,&st
u1.sex,&stu1.score);printf("Data2:");scanf("%d%s%c%d",&stu2.num,stu2.name,&stu2.sex,&stu2.score);if(stu1
.score>=stu2.score)printf("%s,%d\n",stu1.name,stu1.score);elseprintf("%s,%d\n",stu2.name,stu2.score);}C语言程序设计(第3版)张磊编著清华大学出版社8.2.3结构体变量的定义及使用
3.结构体变量的初始化:定义结构体变量时对其成员赋初值。◼初始化的一般形式struct结构体名结构体变量={初始化数据};例如:说明:⑴“{}”中的初始化数据用逗号“,”分隔。⑵初始化数据的个数与结构体成员的个数应相同,它们是按成员的先后顺序一一对应赋值的。⑶每个初始化数据
必须符合与其对应的成员的数据类型。structstudent{intnum;charname[20];charsex;intscore;}stu={9901,"liujia",'M',87};成员初始化数
据数据类型stu.num9901intstu.nameliujiacharstu.sexMcharstu.score87intC语言程序设计(第3版)张磊编著清华大学出版社8.3结构体数组⚫8.3.1结构体数组概述⚫8.3.2结构体数组的初始化⚫8.3.3利用结构体数组管
理学生信息C语言程序设计(第3版)张磊编著清华大学出版社8.3.1结构体数组概述数组元素是结构体类型的数组,称为结构体数组。⚫定义方法与其他结构体变量的定义方法相同。⑴先定义结构体类型,然后用结构体类型定义数组变量。例如:structstuden
tinformation[100];⑵定义结构体类型的同时,定义数组变量。⑶定义无类型名的结构体数组变量。例如:struct{intyear;intmonth;intday;}date1[10],date2[10];⚫引用结构体数组成员
的一般格式结构体数组名[下标].成员名information[20].score=91;例如:structstudent{intyear;intmonth;intday;}date1[10],date2[10];C语言程序设计(第3版)张
磊编著清华大学出版社8.3.2结构体数组的初始化⚫结构体数组的初始化例如:structstudentinfo[3]={{9901,"liujia",'M',87},{9902,"wangkai",'M',89},{9903,"xi
aohua",'F',81}};数组元素成员num成员name成员sex成员scoreinfo[0]9901liujiaM87info[1]9902wangkaiM89info[2]9903xiaohuaF81C语言程序设计(第3版)
张磊编著清华大学出版社8.3.3利用结构体数组管理学生信息例8-3按照表8-1的数据,输入一个班级的学生信息,并进行如下处理:⑴把学习成绩在85以上的学生找出来,并输出这部分学生的姓名和成绩。⑵分别统计男生和女生人数。⚫分析⑴定义一个结构体类型,
并用它定义一个存储学生信息的结构体数组;⑵向结构体数组中输入学生数据;⑶统计,并输出结果。C语言程序设计(第3版)张磊编著清华大学出版社8.3.3利用结构体数组管理学生信息/*programe8-3.c*/#include<stdio
.h>#defineN5structstudent{intnum;charname[20];charsex;intscore;};voidmain(){structstudentstu[N];inti,count_m=0,count_f=0;printf("Inpu
tData:\n");for(i=0;i<N;i++)scanf("%d%s%c%d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].score);printf("Result:\n");for(i=0;i<N;i++){if(stu[i]
.score>85)printf("%s,%d\n",stu[i].name,stu[i].score);if(stu[i].sex=='M'||stu[i].sex=='m')count_m++;elsecount_f++;}printf("Boys=%d,Gir
ls=%d\n",count_m,count_f);}C语言程序设计(第3版)张磊编著清华大学出版社8.4结构体指针变量⚫指向结构体变量的指针变量,简称为结构体指针变量。与其他类型的指针一样,结构体指针变量既可以指向单一的结构体变量,也可以指向结构体数组
变量,结构体指针还可以作函数的参数。C语言程序设计(第3版)张磊编著清华大学出版社8.4结构体指针变量⚫8.4.1结构体指针变量的定义及使用⚫8.4.2结构体指针作函数的参数C语言程序设计(第3版)张磊编著清华大学出版社8.4.1结构体指针变量的定义及使用⚫定义结构体指针变量的一般
形式:struct结构体名*结构体指针变量名;例如:structstudent*p,*q;structstudentstud1,info[10];p=&stud1;q=info;pstud1变量qinfo数组◼成员引用std1.num与p->num等价info[1].num与q[1]->num
等价C语言程序设计(第3版)张磊编著清华大学出版社8.4.1结构体指针变量的定义及使用voidmain(){structstudentstu,*p;p=&stu;p->num=9911;strcpy(p->name,"changjiang
");p->sex='F';p->score=91;printf("Num:%d\nName:%s\n",p->num,p->name);printf("Sex:%c\nScore:%d\n",p->sex,p->score);}例8-4结构体指针用法示例。/*programe8
-4.c*/#include<stdio.h>#include<string.h>structstudent{intnum;charname[20];charsex;intscore;};C语言程序设计(
第3版)张磊编著清华大学出版社8.4.1结构体指针变量的定义及使用例8-5指向结构体数组的指针应用示例。/*programe9-4.c*/#include<stdio.h>#include<string.h>structstudent{intnum;charname[20];
charsex;intscore;}stu[3]={9913,"xiaoli",'F',81,9914,"zhanghua",'M',82,9915,"wangjun",'F',88};voidmain(){structstu
dent*p;for(p=stu;p<stu+3;p++)printf("%d%20s%3c%4d\n",p->num,p->name,p->sex,p->score);}共3组初始化数据结构体指针C语言程序设计(第3版)张磊编著清华大学出版社voidmain(){voidout
put(structsudent*,int);output(stu,N);}voidoutput(structstudent*p,intn){inti;for(i=0;i<n;i++,p++)printf("%d
%20s%3c%4d\n",p->num,p->name,p->sex,p->score);return;}/*programe8-6.c*/#include<stdio.h>#include<string.h>#defineN3st
ructstudent{intnum;charname[20];charsex;intscore;}stu[N]={9913,"xiaoli",'F',81,9914,"zhanghua",'M',82,9915,"wangjun"
,'F',88};结构体指针8.4.2结构体指针作函数的参数例8-6结构体指针作函数参数示例。结构体数组名C语言程序设计(第3版)张磊编著清华大学出版社8.5链表概述⚫8.5.1链表的概念⚫8.5.2链表的特点⚫8.5.3动态内存管
理函数⚫8.5.4定义链表结构C语言程序设计(第3版)张磊编著清华大学出版社8.5.1链表的概念⚫链表是结构体最重要的应用,它是一种非固定长度的数据结构,是一种动态存储技术,它能够根据数据的结构特点和数量使用内存,尤其适用于数据个数可变的数据存储。⚫使用链表存储表中前3个学
生数据。9901liujiaM879902wangkaiM899903xiaohuaF81NULLhead学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905
wangfengM88⑴用calloc()申请一段内存M,并把它分成两部分:一部分存储数据;另一部分存储下一个内存段的地址。⑵将一个学生数据存储在M的数据区中。⑶若当前是第一个数据,则将M的首地址保存在指针变量head中;否则将M的首地保存在上一个内存段中。⑷重复⑴、⑵、⑶的过程,直到所有数据存
储完毕,在最后一段内存的地址区存储结束标志。C语言程序设计(第3版)张磊编著清华大学出版社8.5.2链表的特点⑴链表中的结点具有完全相同的结构,每一个结点存储一个独立的结构体数据;⑵链表的结点由系统随机分配,它们在内存中的位置可能是相邻的,也可能是不相
邻的,结点之间的联系是通过指针域实现的;⑶为了能准确的定位第一个结点,每个链表要有一个表头指针,从第一个结点开始,沿指针链能遍历链表中的所有结点;⑷链表中的结点是在需要时用calloc()申请的,当不再需要时,应有free()函数释放所占用的内存段。⑸一个链表不
需要事先说明它要包括的结点数目,在需要存储新的数据时,就可增加结点,需要删除数据时,就减少结点,链表结点是动态变化的。C语言程序设计(第3版)张磊编著清华大学出版社8.5.3动态内存管理函数⚫动态分配内存按需分
配内存,运行时需要多大的空间就分配多大的空间⚫C语言通过动态内存管理函数,实现动态内存管理。链表每一个结点的建立和删除过程,都需要使用动态内存管理函数。C语言程序设计(第3版)张磊编著清华大学出版社8
.5.3动态内存管理函数1.malloc()函数◼函数原型void*malloc(unsignedintsize);◼功能分配一块长度为size字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功执行,返回值
为空指针(NULL或0)。由于返回的指针的基类型为void,应该通过显式类型转换后才能存入其他基类型的指针变量中,否则会有警告提示。例如:int*p;p=(int*)malloc(sizeof(int));C语言程序设计(第3版)张磊编著清华大学出版社8.5.3动态内存管理函
数2.free()函数◼函数原型voidfree(void*block);◼功能释放以前分配给指针变量block的动态空间,但指针变量block不会自动变成空指针。3.calloc()函数◼函数原型void*calloc(unsignedn,unsignedsize);◼功
能以size为单位大小共分配n*size个字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功执行,返回值为空指针(NULL或0)。例如:int*p;p=(int*)calloc(10,sizeof(int));C语言程序设计(第3版)张
磊编著清华大学出版社8.5.4定义链表结构⚫要定义一个链表结点的结构,需要包括两个方面:➢定义数据存储所对应的各个成员;➢定义指向其他结点的指针成员。例如:假若要用链表逐个存储一批整数,其结点结构可定义如下:structnode{
intdata;structnode*next;};newdatanext存储具体数据存储下一个节点的地址data1data2data3datan∧...head◆structnode类型的结点形成的链表头指针空指针C语言程序设计
(第3版)张磊编著清华大学出版社8.5.4定义链表结构9901liujiaM879902wangkaiM899903xiaohuaF81NULLhead学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zh
angliF829905wangfengM88structstudent{intnum;charname[20];charsex;intscore;structstudent*next;};必须的成员,否则构不成链表◼学生链表的结点定义◼
结点C语言程序设计(第3版)张磊编著清华大学出版社8.6链表的基本操作⚫8.6.1链表结点的插入⚫8.6.2链表结点的删除⚫8.6.3链表结点的查找C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入⚫在链表中插入结点,就是把一个新结点连接
到链表中。⚫两种情况:➢在空链表中插入一个结点;➢在链表的p结点之后插入一个新结点。C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入1.在空链表中插入一个结点空链表就是头指针head为空的链表。⑴申请一个new结点
。new=(structnode*)calloc(1,sizeof(structnode));⑵为p结点填充数据。将要存储的数据对应赋值给p结点数据域的各个成员。⑶修改有关指针的指向。①将new的next成员置空,使new结点成为链表的最后一个结点。②将head
指向new结点。newdatanextheaddata∧C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入2.在head链表的p结点之后插入一个结点head链表和要插入结点new如图所示。要将new结点插入在p结点之后,就是将new结点变成结点C的下一个结
点,而使new的下一个结点成为结点D。⑴使new的指针域存储结点D的首地址。new->next=p->next;⑵把new的首地址存储到结点p的指针域中。p->next=new;data1data2data3data4∧headpd
atanew结点A结点B结点C结点Ddata1data2data3newdata4∧headpdata结点A结点B结点C结点DC语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入⚫insert()函数功能:在he
ad链表的p结点之后插入值为x的结点structstudent*insert(structnode*head,structnode*p,intx){structnode*new;new=(struct
node*)calloc(1,sizeof(structnode));new->data=x;if(head==NULL){head=new;head->next=NULL;}else{new->next=p->next;p->next=new;}return(h
ead);}C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入例8-8用插入结点的方法建立图示的学生成绩链表,链表head有10个结点,每个结点存储一个学生的学号和学习成绩数据。程序:e8-8.c⚫函数的功能➢creat_node()函数:生成一个链表结点
。➢creat_list()函数:生成有n个structs_node型结点的链表,函数的返回值是链表的头指针。➢out_list()函数:用于输出head链表的各结点值。0201920202870203
89021091∧...headC语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入#include<stdio.h>#defineN10structs_node/*定义结点类型*/{charnum[4]
;intscore;structs_node*next;};voidmain(){structs_node*create_node(void);structs_node*create_list(intn);void
out_list(structs_node*head);structs_node*head=NULL;head=create_list(N);out_list(head);}C语言程序设计(第3版)张磊编著清华大学出版社8.
6.1链表结点的插入/*生成一个链表结点的函数*/structs_node*create_node(void){structs_node*p;p=(structs_node*)calloc(1,sizeof(structs_node));sca
nf("%s%d",p->num,&(p->score));p->next=NULL;return(p);}C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入structs_node*create_l
ist(intn){structs_node*new,*p;structs_node*head;inti;if(n>=1){new=create_node();head=new;p=new;}for(i=2;i<=n;i++){new=create_node();p->n
ext=new;p=new;}if(n>=1)return(head);elsereturn(NULL);}建立含有n个结点的链表的函数C语言程序设计(第3版)张磊编著清华大学出版社8.6.1链表结点的插入/*输出
head链表中所有结点的函数*/voidout_list(structs_node*head){structs_node*p;if(head!=NULL){p=head;while(p!=NULL){prin
tf("%s%d\n",p->num,p->score);p=p->next;}}}C语言程序设计(第3版)张磊编著清华大学出版社8.6.2链表结点的删除⚫从链表中删除结点,就是撤销结点在链表中的链接,把结点从链表中孤立出来。⚫删除结点过程:➢把指定的结点
从链表中拿下来,通过修改有关结点的指针域实现;➢释放该结点使用的内存空间,使用free()函数来实现。data1data2data3data4∧headq结点A结点B结点C结点D×prdata1data2dat
a3data4∧headq结点A结点B结点C结点Dp◼删除p结点时指针变化情况◼删除p结点后的head链表C语言程序设计(第3版)张磊编著清华大学出版社8.6.2链表结点的删除⑴若p结点是链表的第一个
结点,则将p指针域的地址保存到head中,使p的后继结点成为head链表的第一个结点,然后转步骤⑶。修改指针操作:head=head->next;或head=p->next;⑵若p结点不是链表的第一个结点,则首先从head开始,找到p结点的前一个结点q,然后使q的指针域存
储p的后继结点的地址,这样沿链表的指针访问链表中的结点时,p结点将不会被访问到,亦即p结点从链表head中被删除了。修改指针操作:q->next=p->next;⑶释放p结点使用的内存空间free(p);◼在head链表中删除p
结点的delete()函数⚫删除结点步骤/*delete()函数*/structnode*delete(structnode*head,structnode*p){structnode*q;if(p==NULL){return(head);}if(p==h
ead)head=head->next;else{q=head;while(q->next!=p)q=q->next;q->next=p->next;}free(p);return(head);}C语言程
序设计(第3版)张磊编著清华大学出版社8.6.3链表结点的查找⚫链表查找是从链表的第一个结点开始,沿着指针链,用查找值与链表结点逐个比较的过程。找到符合要求的结点之后,停止查找过程,返回相应结点的指针,否则返回一个空指针。⚫在head链表中查找data值为m的结点的过程,其中
p为structnode型指针:➢⑴p=head;➢⑵当p≠NULL时,若p->data==m,则找到要求结点,查找结束,返回结点地址p;否则,执行下一步⑶;当p==NULL时,链表中不存在要找的结点,查找结束,返回空指针NULL;➢⑶p=p->next,转步骤⑵。C语言程序设计(第3版)张磊编
著清华大学出版社8.6.3链表结点的查找⚫查找函数find()structnode*find(structnode*head,intm){structnode*p=head;while(p!=NULL&&p->data!=m)p
=p->next;if(p==NULL)return(NULL)elsereturn(p);}C语言程序设计(第3版)张磊编著清华大学出版社8.6.3链表结点的查找例8-9对图示的head链表,删除其值是x的结点。具体要求:⑴输出被删除结点的值;⑵当指
定值结点不存在时,显示一个提示信息;⑶x的值由键盘输入。程序e8-9.cdata1data2data3datan∧...head◆分析该问题的关键点有两点:•查找data等于x的结点p;•删除p结点。
C语言程序设计(第3版)张磊编著清华大学出版社8.7结构体应用举例⚫8.7.1字符串加密⚫8.7.2学生成绩排序⚫8.7.3Josephus问题C语言程序设计(第3版)张磊编著清华大学出版社8.7.1字符串加密例8-10将输入的一个字符串加密后输出,加密表中未出现的源
字符原样输出。源字符加密后字符源字符加密后字符afbgwdf9v*xsm3hkptu?◆1.问题分析与算法设计⑴设计数据结构存储字母加密对照表。structtable{charinput;charoutput;};⑵定
义structtable型数组用于存储密码表。⑶输入一个字符串,在密码表的input成员中查找每一个输入的字符,查找成功后使用对应的output成员加密输出,否则,原样输出源字符。◆2.实现程序#include<stdio.h>structtable{charinput;
/*存储输入的源字符*/charoutput;/*存储加密后的字符*/};voidmain(){charch;intlength,i;structtableencrypt[10]={'a','f','b','g','w','d','f','9','v','*','x','s','m','
3','h','k','p','t','u','?'};while((ch=getchar())!='\n'){for(i=0;encrypt[i].input!=ch&&i<10;i++);if(i<10)putchar(encrypt[
i].output);elseputchar(ch);}}C语言程序设计(第3版)张磊编著清华大学出版社8.7.2学生成绩排序例8-11用一个结构体表示学生的姓名和成绩,编写程序,对一个班级的学生按成绩进行降序排序,并输出结果。⚫问题分析与算法设计
⑴定义结构体数据类型。structstu_info{charname[20];intscore;};⑵定义structstu_info类型的结构体数组stu用于存储一个班级的学生数据。⑶定义学生数据输入函数input(),用于建立结构体数组stu。⑷定义学生数据输出函数output(),用于输出数
组stu。⑸定义排序函数sort_stu(),用于对stu数组排序,排序方法选用冒泡排序法。⑹在主函数中调用input()函数、调用sort_stu()函数、调用output()函数。⚫程序实现C语言程序设计(第3版)张磊编著清华大学出版社⑴建立head为头指针的循环链表。⑵设置p指针,其初值为
head。⑶对p指向的结点从1开始报数,每数一个结点后,p指针便沿指针链下移一个位置(p=p->next),指向下一个结点。当p指向的结点数到m时,输出该结点的值并将其从链表中删除(出列),这时使p指向下一个结点,然后从1开始重新报数。当链表中只有一个
结点时,报数结束,输出该结点。8.7.3Josephus问题例9-10Josephus问题。有n个人围成一圈,从1开始顺序编号到n,现在从1号开始顺时针从1数数,数到m者自动出列,然后从下一个人开始重新数数,仍然每次数到m者自动出列。给出这n个人出列的顺序
。⚫问题分析与算法设计...head1234n⚫实现程序C语言程序设计(第3版)张磊编著清华大学出版社小结(1)(1)结构体数据类型不是系统固有的,它需要在程序中先行定义,然后才能使用。(2)结构体变量的定义有3种方法:先定义结构体类
型,再定义结构体变量;在定义结构体类型的同时定义结构体变量;不定义结构体类型名,直接定义结构体类型变量。(3)引用结构体成员的方法主要有两种:使用结构体变量名引用结构体成员;通过指向结构体变量的指针引用结构体成员。4.数组元素
是结构体类型的数组,称为结构体数组,结构体数组具有数组的一切性质。(4)指向结构体变量的指针,称为结构体指针,结构体指针既可以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针也可以作函数的参
数。使用结构体指针作函数的实参时,实参和形参必须是同一种结构体类型。C语言程序设计(第3版)张磊编著清华大学出版社小结(2)(6)链表是一种动态的数据存储结构,它的每一个结点都是结构体类型的数据,同一个链表中的所有结点具有相同的数据类型。一个链表结点包
括数据域和指针域两部分,数据域存储需要处理的数据,指针域存储下一个结点的位置。C语言使用动态内存管理函数为链表申请结点空间。(7)链表的基本操作有插入结点、删除结点、查找结点、结点数据读写等,向链表插入结点前必须先用动态内存分
配函数获得存储空间,从链表中删除的结点要进行释放操作。(8)从空链表开始不断地插入结点即可建立一个链表,任何一个链表必须有一个头指针,只有通过头指针才能访问链表结点。当一个链表结点的指针域为空时,表明是链表的最后一个结点,当最后一个结点的指针指向开头结点时,便形成一个循环链表。