结构体中含有结构体指针

头文件:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

全局变量:

const int t_length = 2;

int s_index = 5000;

typedef struct Student{
    int id;
    char name[64];
    int age;
}Student;
typedef struct Teacher{
    int id;
    char name[64];
    int age;
    int s_num;
    Student *stu;
}Teacher;

函数原型:

void createTeahcer(Teacher **ppt,int t_num);//为教师数组分配内存

void freeTeacher(Teacher *pt, int t_num); //释放内存

void sortStudent( Student * pt, int num ); //学生数组的排序

void sortTeacher(Teacher *pt, int num); //教师数组的排序

void printTeacher(Teacher *pt, int num); //遍历数组

实现方法:

void createTeahcer(Teacher **ppt,int t_num){

    Teacher *temp;

    temp = (Teacher *)malloc(sizeof(Teacher) * t_num);

    *ppt = temp;

}

void freeTeacher(Teacher *pt, int t_num){

    int i;

    if(pt != NULL){

        for (i = 0; i < t_num; ++i){
            if(pt[i].stu != NULL){
                free(pt[i].stu);
                pt[i].stu = NULL;
            }
        }

        free(pt);
    }

}

void sortStudent( Student * pt, int num ) {

    int i, j;

    Student temp;

    for(i = 0; i < num; ++i){

        for(j = i + 1; j < num; ++j){

            if(pt[j].age < pt[i].age){

                temp = pt[j];
                pt[j] = pt[i];
                pt[i] = temp;

            }
        }

    }
}

void sortTeacher(Teacher *pt, int num){

    int i, j;

    Teacher temp;

    for(i = 0; i < num; ++i){

        for(j = i + 1; j < num; ++j){

            if(pt[j].age < pt[i].age){

                temp = pt[j];
                pt[j] = pt[i];
                pt[i] = temp;

            }
        }

        sortStudent(pt[i].stu, pt[i].s_num);

    }

}

void printTeacher(Teacher *pt, int num){

    int i, j = 0;

    Student stu;
    printf("\n");
    for(i = 0; i < num; ++i){
        printf("学号:%d 姓名:%s 年龄:%d\n", pt[i].id, pt[i].name, pt[i].age);

        for(j = 0; j < pt[i].s_num; ++j){
            stu = (pt[i].stu)[j];
            printf("第%d位学生 学号:%d 姓名:%s 年龄:%d\n",j + 1, stu.id, stu.name, stu.age);
        }

    }

}

测试:

int main(){

    int i, j;

    Teacher *pt = NULL;

    createTeahcer(&pt, t_length);

    for(i = 0; i < t_length; ++i){
        pt[i].id = i + 1002;
        printf("请输入第%d老师位的名字:", i + 1);
        scanf("%s",&(pt[i].name));

        printf("请输入第%d位老师的年龄:", i + 1);
        scanf("%d", &(pt[i].age));

        printf("请输入第%d位老师的所带学生的人数:", i + 1);
        scanf("%d", &(pt[i].s_num));

        pt[i].stu = (Student *)malloc(sizeof(Student) * (pt[i].s_num)); //为老师所拥有的学生分配内存

        for( j = 0; j < pt[i].s_num; ++j){
            (pt[i].stu)[j].id = 5000 + s_index++;

            printf("请输入第%d位同学的名字:", j + 1);
            scanf("%s",&((pt[i].stu)[j].name));

            printf("请输入第%d位同学的年龄:", j + 1);
            scanf("%d", &((pt[i].stu)[j].age));
        }

    }
    sortTeacher(pt,t_length);
    printTeacher(pt, t_length);
    freeTeacher(pt, t_length);

    system("pause");
    return 0;
}

运行结果:

时间: 2024-09-30 14:27:58

结构体中含有结构体指针的相关文章

C++结构体中sizeof

说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,一.解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 各个硬件平台对存储空间的处理上有很大的不同.一些平

结构体中定义函数指针

转自:http://blog.csdn.net/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n }; 形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列表;… } *指针变量名;

C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warning(disable:4996) typedef struct _Student { char name[64]; int age; }Student; typedef struct _Teacher { char name[64]; int age; char *p1; char **p2; Student

C++结构体中sizeof(1)

sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本.他是一个和机器相关的unsigned类型,其大小足以保证内存中对象的大小. 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, as

C/C++ 学习之旅 - 实战3 - 在Struct结构体中使用函数Function

Coding部分: #include<stdio.h> struct Student{ int ID; char* Name; int Age; void(*toString)(int id,char* name,int age); };//定义包含学生ID.姓名.年龄和输出函数指针的结构体Student void toString(int id,char* name,int age){ printf("myStudent实例变量的ID值:%d\n",id); printf

结构体中的数据对齐

c语言结构中需要注意的就是数据存储的对齐方式. 对齐的好处:对齐主要是为了方便数据的访问,提高计算机的处理速度,但同时它会浪费内存空间. CPU的优化规则大致是这样的:对于n字节的元素,它的首地址能被n整除,才能获得最好的性能. 对齐的使用原则: 1.一般的基本对齐原则是按着最大的基本类型的长度进行对齐.较小的元素可以组合起来填充一段内存,实现基本的对齐.前提是其满足条件2. 2.结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度. 3.在结构体中存在结构

MATLAB中的结构数组

MATLAB中的结构数组 结构数组: 结构是包含一组记录的数据类型,而记录则是存储在相应的字段中.结构的字段可以是任意一种MATLAB数据类型的变量或者对象.结构类型的变量也可以是一维的.二维的或多维的数组.结构数组也称为架构数组.不过,在访问结构类型数据的元素时,需要使用下标配合字段的形式. 可以在一个数组中放置各类的数据,并且一个结构数组还能是另一个结构数组的一部分.相比较而言,比元胞数组更为强大,也更加富于变化. (1)直接赋值法创建结构数组 >> employee.name='tige

file结构体中private_data指针的疑惑【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private_data在字符驱动中的作用,我们在 驱动中添加一个设备结构体,然后定义了这个结构体的全局指针变量,接着我们就能在 驱动程序中使用这个指针了.我看到很多驱动程序中都把结构体指针付给private_data, 然后对private_data操作. 为什么要使用private_data,难道仅仅是避免使

c语言中的结构体指针类型的cast

1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针,并且 在这个结构体中,第一个结构成员必须也是一个结构体(最好是结构体类型). 那么我们可以这个结构体指针转换为指向这个结构体中第一个成员结构体的指针. 直接看代码: ************************************ /* struct transform for struct