要求:老师人数不限,老师有id,姓名,学生人数,学生姓名。
结构体定义
#define NAME_MAX 40 //定义name创建内存大小
typedef struct{
int id; //老师id
char *name; //老师名字
int stu_num; //学生人数
char **stu_name; //学生姓名
} Teacher;
数组名指向数组首元素地址
- 功能:开辟num个老师内存地址
/*
*teacher:指向老师数组的指针的
num:开辟老师内存个数
*/
int zcalloc_struct(Teacher **teacher, int num){
if (teacher == NULL || num <= 0) {
return -1;
}
Teacher *teacher_in = NULL;
teacher_in = calloc(num, sizeof(Teacher));
for (int i = 0; i < num; i++) {
(teacher_in + i)->name = malloc(sizeof(char) * NAME_MAX);
memset((teacher_in + i)->name, 0, sizeof(char) * NAME_MAX);
}
*teacher = teacher_in;
return 0;
}
- 创建学生姓名数组
//stu_num:学生人数
int create_two_point_struct(Teacher **teacher, int stu_num){
char * *stu_name = malloc(sizeof(char *) * stu_num);
for (int i = 0; i < stu_num; i++) {
//*(stu_name + i): 向stu_name + i指向的地址存放值
*(stu_name + i) = calloc(NAME_MAX, sizeof(char));
}
(*teacher)->stu_name = stu_name;
return 0;
}
- 打印数据
void print_struct(Teacher *teacher, int num){
for (int i = 0; i < num; i++) {
Teacher *tea = teacher + i;
printf("id:%d,姓名:%s,学生人数:%d\n", tea->id,tea->name, tea->stu_num);
for (int j = 0; j < tea->stu_num ; j++) {
printf("%s\n", *(tea->stu_name + j));
}
}
}
- 释放内存
int static free_struct(Teacher **teacher , int num){
if (teacher == NULL) {
return -1;
}
for (int i = 0; i < num; i++) {
Teacher *tea = *teacher + i;
if (tea != NULL && tea->name != NULL) {
free(tea->name);
if (tea->stu_name != NULL) {
for (int j = 0; j < tea->stu_num; j++) {
// *(tea->stu_name + j) :取出tea->stu_name + j指向地址的值
char *ch = *(tea->stu_name + j);
if (ch != NULL) {
free(ch);
}
}
free(tea->stu_name);
}
}
}
free(*teacher);
*teacher = NULL;
return 0;
}
- 测试
void struct_two_point(){
Teacher *teacher = NULL;
int num = 0;
printf("请输入老师人数:");
scanf("%d", &num);
zcalloc_struct(&teacher,num);
for (int i = 0; i < num; i++) {
Teacher *tea = (teacher + i);
printf("请输入老师Id:");
scanf("%d",&(tea->id)) ;
printf("请输入老师名字:");
scanf("%s",tea->name) ;
printf("请输入老师学生人数:");
scanf("%d",&tea->stu_num);
create_two_point_struct(&tea, tea->stu_num);
for (int j = 0; j < tea->stu_num; j++) {
scanf("%s",*(tea->stu_name + j));
}
}
print_struct(teacher, num);
free_struct(&teacher, num);
}
网友评论