day5_结构体做函数参数

1、结构体做函数参数

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef struct teacher
{
    char name[64];
    int age;
    int id;
}teacher;

void printteacher(teacher *array, int num)
{
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("age:%d \n",array[i].age);
    }

}

void sortteacher(teacher *array, int num)
{
    int i, j;
    teacher tmp;
    for(i = 0; i<num; i++)
    {
        for(j = i + 1; j<num; j++)
        {
            if(array[i].age > array[j].age)
            {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}

teacher* createteacher(int num)
{
    teacher *tmp = NULL;
    tmp = (teacher *)malloc(sizeof(teacher) * num);
    if(NULL == tmp)
    {
        return NULL;
    }
    return tmp;
}

void Freeteacher(teacher *p)
{

    if(NULL != p)
    {
        free(p);
        p = NULL;
    }
}

int main0201()
{
    int i = 0;
    teacher Array[3];//在栈上分配内存

    for(i = 0; i<3; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(Array[i].age));
    }

    //打印老师的年龄
    printteacher(Array, 3);
    sortteacher(Array,3);
    printf("排序后;\n");
    printteacher(Array, 3);

    system("pause");
    return 0;
}


int main0202()
{
    int i = 0;
//    teacher Array[3];//在栈上分配内存
    int num  = 3;
    teacher *pArray = NULL;
    pArray = createteacher(num);

    for(i = 0; i<num; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(pArray[i].age));
    }

    //打印老师的年龄
    printteacher(pArray, num);
    sortteacher(pArray,num);
    printf("排序后;\n");
    printteacher(pArray, num);

    system("pause");
    return 0;
}

2、结构体套一级指针

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef struct teacher
{
    char name[64];
    char *sname;
    int age;
    int id;
}teacher;

void printteacher(teacher *array, int num)
{
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("age:%d \n",array[i].age);
    }

}

void sortteacher(teacher *array, int num)
{
    int i, j;
    teacher tmp;
    for(i = 0; i<num; i++)
    {
        for(j = i + 1; j<num; j++)
        {
            if(array[i].age > array[j].age)
            {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}

teacher* createteacher(int num)
{
    teacher *tmp = NULL;
    tmp = (teacher *)malloc(sizeof(teacher) * num);
    if(NULL == tmp)
    {
        return NULL;
    }
    return tmp;
}

int createteacher02(teacher **pt, int num)
{
    int i = 0;
    teacher *tmp = NULL;
    tmp = (teacher *)malloc(sizeof(teacher) * num);//teacher Array[3]
    if(NULL == tmp)
    {
        return -1;
    }
    memset(tmp,0,sizeof(teacher) * num);

    for(i = 0; i<num; i++)
    {
        tmp[i].sname = (char *)malloc(60);
    }
    *pt = tmp;//二级指针 形参间接的修改实参的值
    return 0;
}

void Freeteacher(teacher *p, int num)
{
    int i = 0;
    if(NULL == p)
    {
        return;
    }
    for(i = 0; i<num; i++)
    {
        if(NULL != p->sname)
        {
            free(p[i].sname );
        }
    }
    free(p);
}

int main0201()
{
    int i = 0;
    teacher Array[3];//在栈上分配内存

    for(i = 0; i<3; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(Array[i].age));
    }

    //打印老师的年龄
    printteacher(Array, 3);
    sortteacher(Array,3);
    printf("排序后;\n");
    printteacher(Array, 3);

    system("pause");
    return 0;
}


int main0302()
{
    int i = 0;
//    teacher Array[3];//在栈上分配内存
    int num  = 3;
    teacher *pArray = NULL;
    createteacher02(&pArray, num);

    for(i = 0; i<num; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(pArray[i].age));

        printf("输入姓名:\n");
        scanf("%s",pArray[i].name);//向指针所指向的内存空间写入数据

        printf("输入别名:\n");
        scanf("%s",pArray[i].sname);//sname没有分配空间
    }

    //打印老师的年龄
    printteacher(pArray, num);
    sortteacher(pArray,num);
    printf("排序后;\n");
    printteacher(pArray, num);
    Freeteacher(pArray, num);

    system("pause");
    return 0;
}

3、结构体套二级指针

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef struct teacher
{
    char name[64];
    char *sname;
    char **stuname;// char student[10][30]
    int age;
    int id;
}teacher;

void printteacher(teacher *array, int num)
{
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("age:%d \n",array[i].age);
    }

}

void sortteacher(teacher *array, int num)
{
    int i, j;
    teacher tmp;
    for(i = 0; i<num; i++)
    {
        for(j = i + 1; j<num; j++)
        {
            if(array[i].age > array[j].age)
            {
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
}

int createteacher02(teacher **pt, int num)
{
    int i = 0;
    int j = 0;
    teacher *tmp = NULL;
    char **p = NULL;

    tmp = (teacher *)malloc(sizeof(teacher) * num);//teacher Array[3]
    if(NULL == tmp)
    {
        return -1;
    }
    memset(tmp,0,sizeof(teacher) * num);

    for(i = 0; i<num; i++)
    {
        //malloc一级指针
        tmp[i].sname = (char *)malloc(60);
        //二级指针的第三种内存模型
        {
            //打造二维内存
            p = (char **)malloc(3 * sizeof(char *));
            for(j = 0; j<3; j++)
            {
                p[j] = (char *)malloc(120);
            }
            tmp[i].stuname = p;
        }
    }
    *pt = tmp;//二级指针 形参间接的修改实参的值
    return 0;
}

void Freeteacher(teacher *p, int num)
{
    int i = 0;
    int j = 0;
    if(NULL == p)
    {
        return;
    }
    for(i = 0; i<num; i++)
    {
        //释放一级指针
        if(NULL != p->sname)
        {
            free(p[i].sname );
        }
        //释放二级指针
        if(NULL != p[i].stuname)
        {
            char **myp = p[i].stuname;
            for(j = 0; j<3; j++)
            {
                if(NULL != myp[j])
                {
                    free(myp[j]);
                }
            }
            free(myp);
            p[i].stuname = NULL;
        }
    }
    free(p);
}

int main0201()
{
    int i = 0;
    teacher Array[3];//在栈上分配内存

    for(i = 0; i<3; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(Array[i].age));
    }

    //打印老师的年龄
    printteacher(Array, 3);
    sortteacher(Array,3);
    printf("排序后;\n");
    printteacher(Array, 3);

    system("pause");
    return 0;
}


int main()
{
    int i = 0;
    int j = 0;
//    teacher Array[3];//在栈上分配内存
    int num  = 3;
    teacher *pArray = NULL;
    createteacher02(&pArray, num);

    for(i = 0; i<num; i++)
    {
        printf("输入年龄:\n");
        scanf("%d",&(pArray[i].age));

        printf("输入姓名:\n");
        scanf("%s",pArray[i].name);//向指针所指向的内存空间写入数据

        printf("输入别名:\n");
        scanf("%s",pArray[i].sname);//sname没有分配空间

        for(j = 0; j<3; j++)
        {
            printf("input student name:");
            scanf("%s",pArray[i].stuname[j]);
        }
    }

    //打印老师的年龄
    printteacher(pArray, num);
    sortteacher(pArray,num);
    printf("排序后;\n");
    printteacher(pArray, num);
    Freeteacher(pArray, num);

    system("pause");
    return 0;
}










猜你喜欢

转载自blog.csdn.net/qq_34624951/article/details/77938943