第九章数组.docx
- 文档编号:9543974
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:829.27KB
第九章数组.docx
《第九章数组.docx》由会员分享,可在线阅读,更多相关《第九章数组.docx(20页珍藏版)》请在冰豆网上搜索。
第九章数组
第九章结构体与链表
9.1结构体类型的定义
❑程序设计者自己定义的数据类型
❑包含若干成员,各成员可有不同的数据类型(与数组的区别)
❑结构体类型定义
struct结构体名
{类型标识符成员名1;
类型标识符成员名2;
…………….
类型标识符成员名n;};
大括号内为成员说明列表
❑如,处理学生成绩数据,每个学生有三门课程的成绩、总成绩等变量。
structstudent
{
longnum;/*学号*/
charname[10];/*姓名*/
intscore1;/*成绩*/
intscore2;
intscore3;
inttotal;/*总成绩*/
};
这样,student就是一个新的结构数据类型,可用它定义变量
structstudenta1,a2;注意:
struct不能省略
结构体就是一个专有名词,代表一类事物,如:
学生,教师,汽车等,是泛指
结构体成员是描述该类事物的指标,如:
学生的学号,名字,成绩等
结构体变量是该类事物的一个具体事例,每个事例都具有全部成员,如每个学生都有学号,名字,成绩等
9.2结构体类型变量的定义
1先定义结构体类型,再定义变量
如:
structstudent
{longnum;/*学号*/
charname[10];/*姓名*/
intscore1;/*成绩*/
intscore2;
intscore3;
inttotal;/*总成绩*/
};
structstudenta1,a2;注意:
struct不能省略
2定义类型的同时定义变量
structstudent
{longnum;/*学号*/
charname[10];/*姓名*/
intscore1;/*成绩*/
intscore2;
intscore3;
inttotal;/*总成绩*/
}a1,a2;
3直接定义结构体类型变量
struct
{longnum;/*学号*/
charname[10];/*姓名*/
intscore1;/*成绩*/
intscore2;
intscore3;
inttotal;/*总成绩*/
}a1,a2;
每个结构体变量都拥有结构体的全部成员
9.2.2结构变量的引用
❑结构变量的引用是通过引用其成员(分量)的形式来实现的,
格式为:
结构变量名.结构成员名
❑若定义了structstudenta1,a2;就可以使用其成员
a1.num=00001;
a2.num=00002;
strcpy(a1.name,“John”);
strcpy(a2.name,“Andrew”);
a1.total=a1.score1+a1.score2+a1.score3;
❑每个结构成员都可当做一个变量来使用,类型为在定义结构时所指定的数据类型
❑结构变量的成员使用方法与普通内存变量没有区别。
可以对其赋值、参与运算或作为函数的参数。
v如,
va1.score1=60;
vstrcpy(a2.name,"Li");
va2.total=a2.score1+a2.score2+a2.score3;
vprintf("a2.name=%s\n",a2.name);
❑不能用结构体来访问结构成员,如student.name,student.num是错的,不能说学生的名字是什么,只能说某个学生的名字是什么
❑可以对结构变量的各个成员取地址,或用指针进行访问(与普通变量相同)
如:
structstudenta1,a2;
long*p;
scanf("%ld",&a1.num);
p=&a1.num;
printf("a1.num=%ld\n",*p);
结构体变量的初始化
在定义语句中,结构体变量={用逗号隔开的初始值};
在非定义语句中,结构体变量.成员=成员值;
❑可以在定义变量时赋初值,称为结构变量的"初始化"
structstudent
{
longnum;
charname[10];
intscore1;
intscore2;
intscore3;
inttotal;
}s1={2390,"LiMing",84,74,90,0};
❑此时赋值的顺序应与结构变量各成员的顺序一致
❑先定义结构,再定义结构变量并初始化
structstudent
{
longnum;
charname[10];
intscore1;
intscore2;
intscore3;
inttotal;
};
structstudents1={2390,"LiMing",84,74,90,0};
structstudents2={2391,"WangPing",74,86,90,0};
注意:
不能对结构体本身赋初值,如:
structstudent
{longnum;
charname[10];
intscore=90;
inttotal;
};
错,结构体只是数据类型,不是变量
--------------------------------------------------------------------------------------
结构数组
❑一个结构变量可存储一个数据的整体,如一个学生的信息,若要同时定义相同类型结构变量,如需要同时存储多个学生的信息,此时可以使用结构数组
❑若数组的每一个元素是一个结构变量,则该数组称为结构数组
❑定义方法
struct结构体名数组名[元素个数];
如:
structstudent
{longnum;
charname[10];
intscore1;intscore2;intscore3;
inttotal;
}
structstudents[3];
❑此时s[3]是一个有3个元素的数组,但每个数组元素s[0],s[1],s[2]是一个结构类型的变量,引用数组元素时要按结构变量的方式来使用
❑每个结构数组的元素(s[0],s[1],s[2])是一个结构变量;此时,数组元素的使用方式应按结构变量来使用,如:
s[0].num
s[0].name
s[0].score1
s[0].score2
s[0].score3
s[0].total
s[1].num
s[1].name
…
结构数组的存储
结构数组的初始化
❑结构数组变量的初始化与数组初始化相同,按数组元素的顺序进行赋值,但要考虑到每个元素都是一个结构变量,注意变量各成员的顺序,如:
structstudents[3]={{2390,"Li",84,74,90,0},
{2391,"Wang",75,86,90,0},
{2392,"Zhao",71,84,76,0}
};
结构数组初始化后的结果
s[2]
s[1]
s[0]
total
score3
score2
score1
name
num
结构数组应用举例
❑例:
对候选人得票的统计程序。
设有三个候选人,每次输入一个人的名字,统计各人得票结果
候选人的信息用一个结构来描述
structperson
{charname[20];/*候选名字*/
intcount;/*票数*/};
程序:
三个候选人
#include
structperson
{charname[20];
intcount;
}leader[3]={"L",0,"Z",0,"F",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)该候选人.count加一
leader[j].count++;
}
printf("\n");
for(i=0;i<3;i++)/*输出每个候选人的得票数*/
printf("%5s:
%d\n",leader[i].name,leader[i].count);
}
结构体类型指针------指向结构体变量的指针
❑一个结构变量的指针就是该结构体变量所占内存空间的起始地址
❑与其他类型的指针用法相似,可以通过指针来引用结构变量
❑结构指针变量的定义格式
struct结构名*结构指针变量名;
如,
structstudent*p,s1;
p=&s1;
结构体类型指针实例
❑例:
structstudent
{longnum;
charname[10];
floatscore1;floatscore2;floatscore3;
floattotal;};
structstudents;
structstudent*p;
此时p为结构指针变量,*p相当于一个结构变量
可以对用结构变量的地址对结构指针变量赋值
p=&s;
结构成员引用方式
结构嵌套中成员引用方式-----一个结构体的成员是结构体变量(成员只能是变量,不能是结构体)
1一个结构体的成员是另外一个结构体的结构体变量或结构体变量指针
structmm
{inta;
intb;};
structnn
{intx;
inty;
structmm*z;}a1;
a1.z->b=100;
structmm
{inta;
intb;};
structnn
{intx;
inty;
structmmz;}a1;
a1.z.b=100;
注:
->后是成员,前面是结构体变量指针
2一个结构体的成员是自身结构体的结构体变量指针
structnn
{intx;
inty;
structnnz;}a1;
结构体自身嵌套时只能用指针
structnn
{intx;
inty;
structnn*z;}a1;
a1.z->x=100;
--------------------------------------------------------------------------------
指针与结构数组
p+2
p+1
s[2]
s[1]
&s[0]
p
s[9]
s[0]
❑例
structstudent
{intnum;
charname[20];
intage;};
structstudents[3]={{10101,"Li",18},
{10102,"Zhang",19},
{10104,"Wang",20}};
main()
{structstudent*p;
printf("No.Nameage\n");
for(p=s;p<=s+2;p++)
printf("%5d%-10s%4d\n",p->num,p->name,p->age);
}
结构应用实例—链表
一个结构变量可存储一个数据的整体,如一个学生的信息,多个数据的信息需多个结构变量来存储,多个结构变量有两种存放方式:
1结构变量数组:
这些结构变量是连续存放的,其大小在程序运行前指定
2链表:
这些结构变量是分散存放的,其大小可在程序运行改变,不用事先指定大小
其中A,B,C,D的定义方式如下:
A指向B:
A.next=&B;
structstudent每个节点都设置一个next指针,用于存放下一个节点的地址
{longnum;
floatscore;
structstudent*next;
}A,B,C,D;
内存动态管理函数
–malloc函数---在内存中开辟指定大小的存储空间
void*malloc(分配的字节数);
返回值
若成功,返回指向分配区域起始地址的指针
若失败,返回NULL
使用时应进行强制转换
如:
int*p,*q;
p=(int*)malloc(20);
q=(int*)malloc(10*sizeof(int));
calloc函数---分配n1个大小为n2的存储空间
void*calloc(n1,n2);
–free函数
voidfree(指针变量);
释放该指针变量指向的存储空间,
注意,只有用malloc和calloc开辟的存储空间才可释放
简单链表举例---链表的建立
❑定义
structstudent
{longnum;
floatscore;
structstudent*next;
}*p,*head,*tail;定义节点指针
main()
{p=(structstudent*)malloc(sizeof(structstudent));
创建第一个节点
输入p->num和p->score;
if(输入数据满足结束条件)return;
head=tail=p;
tail->next=NULL;
while
(1)
{p=(structstudent*)malloc(sizeof(structstudent));新建一个节点
输入p->num和p->score;
if(输入数据满足结束条件)break;
if(head==tail)head->next=p
elsetail->next=p;
tail=p;
tail->next=NULL;}
}
在链表中间加一个节点
删除节点
链表的遍历
❑从头结点开始,沿链的顺序走过所有的结点,通常用于处理链表中的数据,如输出、查找等。
structstudent*;
p=head;head为链表的头指针
if(head!
=NULL)
do
{程序段(如输出结点p内容);
p=p->next;}
while(p!
=NULL)
结构体数组的元素和链表的节点都是结构体变量
结构体数组与链表的区别:
数组元素个数固定,在定义时必须指明,当事先不知道所需个数时,只能按最大可能设置,造成资源浪费
链表的节点个数不固定,可随时加、减,
数组是连续存储,添加、删除一个元素,其后所有元素都要移动
链表对节点的存储位置没有要求,不存在此问题
数组可随机访问其任一元素,数组名[下标]
链表没有下标,访问任一元素都要从头开始逐个节点的寻找
-----------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 数组