Linux(五)
- 结构体
- 如何定义一个结构体
- 如何定义一个结构体变量
- 结构体变量如何访问成员
- 如何定义一个指向结构体的指针
- 动态分配空间 malloc,free
- 在堆区分配5个存Stu的空间

#include <stdio.h>
//编写一子函数,对pstr中的值进行输出
/*void output(int * arr,int n);
void output(int arr[],int n); //[]表示你传过来的是个数组,该数组中的每个元素是 int
*/
//参数1: &pstr[0] pstr[0]-->char * &pstr[0]---->char **
//参数2:
//void output(char **pstr,int n);
void output(char *pstr[],int n);
void output(char *pstr[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
printf("%s ",pstr[i]);
}
printf("\n");
}
int main(void)
{
//定义一个长度为5的数组,该数组中的每个元素是char *
char * pstr[5]={"xian","beijing","shanghai","guangzhou","chongqing"};
output(pstr,5); //pstr<====>&pstr[0]
//output(&pstr[0],5); //pstr<====>&pstr[0]
return 0;
}
结构体
如何定义一个结构体
struct 结构体名
{
//该类型的属性:
成员1;
成员2;
成员3;
};
//定义一个学生的数据类型
//学生的属性: 姓名 学号 身高 成绩 等等
2.如何定义一个结构体变量
struct date
{
int year;
int month;
int day;
};
//定义一个结构体数据类型,该结构体体数据类型的名字叫 struct date
struct student
{
char name[20]; //姓名 字符数组 ----->字符串
int height; //身高
};
//定义一个结构体数据类型,该结构体数据类型的名字叫struct student
如何定义一个结构体变量
//如何定义一个整型变量
//类型名 变量名;
int i=12;
//如何定义一个结构体变量
//类型名 变量名;
struct student s1={"zhangsan",176};
#include <stdio.h>
//1.定义一个日期的结构体
struct date
{
int year;
int month;
int day;
};
//定义一个日期的结构体 strut date
//1,定义一个结构体数据类型
struct student
{
char name[20]; //姓名
int height; //身高
struct date birDay; //出生日期
};
//定义一个结构体数据类型,该数据类型的名字叫struct student
int main(void)
{
//1.定义一个结构体变量
struct student s1;
return 0;
}
结构体变量如何访问成员
//结构体变量访问成员
变量名.成员名
#include <stdio.h>
//定义一个日期的结构体 strut date
//1,定义一个结构体数据类型
struct student
{
char name[20]; //姓名
int height; //身高
};
//定义一个结构体数据类型,该数据类型的名字叫struct student
int main(void)
{
//2.定义一个结构体变量 类型名 变量名
struct student s1={"zhangsan",176};
//3.结构体变量访问成员 变量名.成员名
printf("请输入姓名和身高\n");
scanf("%s",s1.name);
scanf("%d",&s1.height);
printf("s1: name:%s height=%d\n",s1.name,s1.height);
//4.定义一个结构体变量
struct student s2;
s2=s1; //将s1中的值赋值给s2
printf("s2: name:%s height=%d\n",s2.name,s2.height);
return 0;
}
如何定义一个指向结构体的指针
#include <stdio.h>
/*
//1.定义一个结构体数据类型
struct student
{
char name[20];
int height;
};
//该数据类型的名字叫struct student
//2.给结构体数据类型取个别名
typedef struct student Stu; // Stu <===>struct student
*/
//1.在定义结构体数据类型的同时给它取别名
typedef struct student
{
char name[20];
int height;
}Stu;
//该结构体数据类型的名字叫Stu
int main(void)
{
//2.定义一个结构体变量并赋值
//类型名 变量名
Stu s1={"zhangsan",178};
printf("name:%s height=%d\n",s1.name,s1.height);
//定义一个指向int的指针
int * pi=NULL; //sizeof(pi)=8
//3.定义一个指向结构体的指针
Stu * ps=NULL; //sizeof(ps)=8
ps=&s1; //ps指向s1 s1<===>*ps
printf("name:%s height=%d\n",(*ps).name,(*ps).height);
printf("name:%s height=%d\n",ps->name,ps->height);
return 0;
}
动态分配空间 malloc,free
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
在堆区分配5个存Stu的空间
#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
char name[20];
int height;
}Stu;
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("请输入姓名和身高\n");
scanf("%s%d",ps->name,&ps->height);
ps++;
}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("name:%20sheight:%d\n",ps->name,ps->height);
ps++;
}
}
int main(void)
{
//1.在堆区分配5个存结构体的空间
Stu * ps=NULL;
ps=(Stu *)malloc(sizeof(Stu)*5);
input(ps,5);
output(ps,5);
//2.释放
free(ps);
ps=NULL;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
char name[20];
int height;
}Stu;
void menu(void)
{
printf("1-----input\n");
printf("2-----output\n");
printf("3-----calpMax\n"); //求身高最高的人的首地址
printf("4-----calpMin\n"); //求身高最低的人的首地址
printf("5-----swap(pMax,pMin)\n"); //交换两个人的位置
printf("6-----sortByHeight\n");
printf("7-----sortByName\n");
printf("-1----exit\n");
}
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("请输入姓名和身高\n");
scanf("%s%d",ps->name,&ps->height);
ps++;
}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("name:%-20s height:%d\n",ps->name,ps->height);
ps++;
}
}
int main(void)
{
int op=0;
//1.在堆区分配5个存结构体的空间
Stu * ps=NULL;
ps=(Stu *)malloc(sizeof(Stu)*5);
while(1)
{
menu();
printf("请输入选项\n");
scanf("%d",&op);
if(-1==op) break;
switch(op)
{
case 1:
input(ps,5);
break;
case 2:
output(ps,5);
break;
}
}
//2.释放
free(ps);
ps=NULL;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
char name[20];
int height;
//float scores[5];
}Stu;
void menu(void);
void menu(void)
{
printf("1-----input\n");
printf("2-----output\n");
printf("3-----calpMax\n"); //求身高最高的人的首地址
printf("4-----calpMin\n"); //求身高最低的人的首地址
printf("5-----swap(pMax,pMin)\n"); //交换两个人的位置
printf("6-----sortByHeight\n");
printf("7-----sortByName\n");
printf("-1----exit\n");
}
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size);
void input(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("请输入姓名和身高\n");
scanf("%s%d",ps->name,&ps->height);
ps++;
}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size);
void output(Stu * ps,int size)
{
int i=0;
for(i=0;i<size;i++)
{
printf("name:%-20s height:%d\n",ps->name,ps->height);
ps++;
}
}
//编写一子函数,获得ps指向的空间中身高最高的那个人的首地址
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:身高最高的那个人的首地址 Stu *
Stu * calpMax(Stu *ps,int size);
Stu * calpMax(Stu *ps,int size)
{
//1.定义一个指针变量,用它来保存最大值的地址
Stu * pMax=NULL;
//2.假设第一个为最大
pMax=ps;
//3.用pMax->height和后面的每一个height进行比较,循环size-1次
int i=0;
for(i=0;i<size-1;i++)
{
ps++;
if(pMax->height<ps->height)
{
pMax=ps;
}
}
//4.返回pMax;
return pMax;
}
//编写一子函数,获得ps指向的空间中身高最矮的那个人的首地址
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:身高最矮的那个人的首地址 Stu *
Stu * calpMin(Stu *ps,int size);
Stu * calpMin(Stu *ps,int size)
{
//1.定义一个指针变量,用它来保存最大值的地址
Stu * pMin=NULL;
//2.假设第一个为最矮
pMin=ps;
//3.用pMax->height和后面的每一个height进行比较,循环size-1次
int i=0;
for(i=0;i<size-1;i++)
{
ps++;
if(pMin->height>ps->height)
{
pMin=ps;
}
}
//4.返回pMin;
return pMin;
}
//编写一子函数,交换两个人的位置
//参数1:第一个人的首地址 参数2:第二个人的首地址
//返回值:void
void swap(Stu * pMax,Stu * pMin);
void swap(Stu * pMax,Stu * pMin)
{
Stu tmp;
tmp=*pMax;
*pMax=*pMin;
*pMin=tmp;
}
//编写一子函数,按照身高进行排序
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:void
void sortByHeight(Stu * ps,int size);
void sortByHeight(Stu * ps,int size)
{
int i=0;
int j=0;
for(i=0;i<size-1;i++)
{
for(j=0;j<size-1-i;j++)
{
//if(strcmp((ps+j)->name,(ps+j+1)->name)>0)
if((ps+j)->height > (ps+j+1)->height)
{
//交换ps+j ps+j+1 这两个人的位置
swap(ps+j,ps+j+1);
}
}
}
printf("sort over\n");
}
int main(void)
{
int op=0;
//1.在堆区分配5个存结构体的空间
Stu * ps=NULL;
ps=(Stu *)malloc(sizeof(Stu)*5);
Stu * pMax=NULL;
Stu * pMin=NULL;
while(1)
{
menu();
printf("请输入选项\n");
scanf("%d",&op);
if(-1==op) break;
switch(op)
{
case 1:
input(ps,5);
break;
case 2:
output(ps,5);
break;
case 3:
pMax=calpMax(ps,5);
printf("身高最高是 %s %d\n",pMax->name,pMax->height);
break;
case 4:
pMin=calpMin(ps,5);
printf("身高最矮是 %s %d\n",pMin->name,pMin->height);
break;
case 5:
swap(pMax,pMin);
break;
case 6:
sortByHeight(ps,5);
break;
}
}
//2.释放
free(ps);
ps=NULL;
return 0;
}