结构体嵌套二级指针

2017-03-02  本文已影响207人  76577fe9b28b
要求:老师人数不限,老师有id,姓名,学生人数,学生姓名。

结构体定义

#define  NAME_MAX 40  //定义name创建内存大小
typedef struct{
    int id;    //老师id
    char *name;  //老师名字
    int stu_num;  //学生人数
    char **stu_name;  //学生姓名
} Teacher;

数组名指向数组首元素地址

 /*
     *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);
}
上一篇 下一篇

猜你喜欢

热点阅读