自定义数据类型
结构体类型的概念及定义
**构造类型:**不是基本类型也不是指针,他是若干个相同或不相同类型数据的集合。
int id;//学号
char name[20];
int age;
char add[20];
概念
结构体是一种构造类型的数据结构。
定义方法
①声明结构体类型:
struct stu
{
int id;//学号
char name[20];
int age;
char add[20];
};
②定义结构体变量:
struct stu lisi= {100,"lisi",20,"阿斯达"};
给数据类型取别名typedef:
typedef struct stu1
{
int id;//学号
char name[20];
int age;
char add[20];
}STU;//重新起名
结构体变量的初始化及引用
定义和初始化
STU wangmazi = {
.id=102,
.name="wangmazi",
.age=22,
.add="爱送票",
}; //赋值
引用
简单引用
struct stu
{
int id;//学号
char name[20];
int age;
char add[20];
};
typedef struct stu1
{
int id;//学号
char name[20];
int age;
char add[20];
}STU;//重新起名
STU wangmazi = {
.id=102,
.name="wangmazi",
.age=22,
.add="爱送票",
}; //赋值
int main()
{
struct stu lisi= {100,"lisi",20,"阿斯达"};
struct stu zhangsan = {101,"zhangsan",21,"啦啦啦"};
printf("%d%s%d%s",zhangsan.id,zhangsan.name,zhangsan.age,zhangsan.add);
return 0;
}
结构体嵌套使用
typedef struct bir
{
int year;
int month;
int day;
}BIR;
struct pe
{
int id;
char name[20];
int age;
BIR birth;
};
int main()
{
struct pe pe1;
pe1.id=1;
strcpy(pe1.name,"zhangsan");
pe1.age=23;
pe1.birth.year=1999;
pe1.birth.month=12;
pe1.birth.day=11;
printf("%d %s %d %d-%d-%d",pe1.id,pe1.name,pe1.age,pe1.birth.year,
pe1.birth.month,pe1.birth.day);
return 0;
}
结构体指针
typedef struct stu
{
int id;
char name[10];
int age;
float score;
}STU;
int main()
{
STU stu={1,"zs",26,72.1};
STU *pstu;
pstu = &stu;
pstu->id = 2;
pstu->age = 15;
strcpy(pstu->name,"ls");
pstu->score = 88.8;
printf("%d %d %s %.1f",pstu->id,pstu->age,pstu->name,pstu->score);
return 0;
}
结构体数组
定义
typedef struct stu
{
int id;
char name[10];
float cj;
}STU;
STU stu[3];
引用
typedef struct stu
{
int id;
char name[10];
float cj;
}STU;
int main()
{
STU stu[3];
int i;
for(i=0;i<3;i++)
{
scanf("%d%s%f",&stu[i].id,stu[i].name,&stu[i].cj);
}
for(i=0;i<3;i++)
{
printf("%d %s %f\n",stu[i].id,stu[i].name,stu[i].cj);
}
return 0;
}
结构体变量做函数参数
typedef struct stu
{
int id;
char name[20];
int age;
float score;
}STU;
void scanf_stu(STU stu[],int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d%s%d%f",&stu[i].id,stu[i].name,&stu[i].age,
&stu[i].score);
}
}
void printf_stu(STU stu[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d %s %d %.1f\n",stu[i].id,stu[i].name,stu[i].age,
stu[i].score);
}
}
void paixu(STU stu[],int n)
{
int i,j;
STU temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(stu[j].score>stu[j+1].score)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
}
int main()
{
STU stu[5];
scanf_stu(stu,5);
printf_stu(stu,5);
paixu(stu,5);
printf_stu(stu,5);
return 0;
}
结构体指针传参,作为函数返回值
typedef struct stu{
int id;
char name[20];
float cj;
}STU;
void scanf_stu(STU stu[],int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d%s%f",&stu[i].id,stu[i].name,
&stu[i].cj);
}
}
STU p_a(STU *pstu,int n)
{
int i;
float max=pstu[0].cj;
STU temp;
for(i=0;i<n;i++)
{
if(max<pstu[i].cj)
{
max=pstu[i].cj;
temp=pstu[i];
}
}
return temp;
}
int main()
{
STU stu[5];
scanf_stu(stu,5);
STU red=p_a(stu,5);
printf("%d %s %.1f",red.id,red.name,red.cj);
return 0;
用typedef生命新类型名
命名规定
声明的类型名的第一个字母用大写表示。
typedef操作方法
typedef 旧名字 新名字
结构体指针
定义方法
struct 结构体类型名 *指针变量名
结构体指针变量的引用
typedef struct home{
char name[10];
int age;
char add[10];
}HOME;
typedef struct per{
int age;
char name[10];
HOME *home;
}PER;
int main()
{
HOME home={"zs",23,"xian"};
PER per1={
.age=23,
.name="zs",
.home=&home,
};
printf("%d %s %s %d %s",per1.age,per1.name,per1.home->name,
per1.home->age,per1.home->add);
return 0;
}