结构体中套二级指针.c

该代码示例展示了如何在C语言中定义一个包含年龄、名字以及学生名字列表的老师结构体,并通过CreatTeacher函数动态分配内存。程序允许用户输入老师和学生的年龄及名字,然后按老师的年龄进行排序。同时,代码还包括了释放内存的函数FreeTeacher,确保内存得到正确释放。
摘要由CSDN通过智能技术生成
#define _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include<string.h> 
#include <stdio.h> 
#include<ctype.h> 

//输入老师结构体的年龄 并按年龄排序  
//一个老师带三个学生

typedef struct Teacher
{
	int age;
	char name[20];
	char* aliname;
	char** stuname;   //二级指针

}Teacher;

int CreatTeacher(Teacher** p, int num)
{
	Teacher* tmp = NULL;  //利用辅助指针
	tmp = (Teacher*)malloc(num * sizeof(Teacher));
	if (tmp == NULL)
	{
		return -1;
	}

	for (int i = 0; i < num; i++)
	{
		/*tmp[i].aliname = (char*)malloc(sizeof(char) * 10);*/

		//手工打造内存空间 二级指针的第三种内存模型
		char** tmp2 = (char**)malloc(num*sizeof(char*));   //一个老师带三个学生

		for (int j = 0; j < num; j++)
		{
			tmp2[j] = (char*)malloc(sizeof(char) * 10);
		}

		tmp[i].stuname = tmp2;

	}

	*p = tmp;
	return 0;   //最后一定要返回值啊 不然OS怎么知道你想要的正确值是多少
}

void PrintfTeacherage(Teacher* p, int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("老师年龄:%d\n", p[i].age);

		printf("老师name:%s\n", p[i].name);

		/*printf("老师aliname:%s\n", p[i].aliname);*/

		
		for (int j = 0; j < num; j++)
		{
			printf("学生%d名字:%s\n",j+1, p[i].stuname[j]);

		}
	}

}

void SortTeacherage(Teacher* p, int num)
{
	int tmp;

	for (int i = 0; i < num; i++)
		for (int j = i + 1; j < num; j++)
		{
			if (p[i].age > p[j].age)
			{
				tmp = p[i].age;
				p[i].age = p[j].age;
				p[j].age = tmp;
			}
		}

}

void FreeTeacher(Teacher** p, int num)
{
	Teacher* tmp = *p;
	int i = 0;
	int j = 0;

	/*for (i = 0; i < num; i++)
	{
		if (tmp[i].aliname != NULL)
			free((tmp[i]).aliname);
	}*/

	for (j = 0; j < num; j++)
	{
		if (tmp[i].stuname[j] != NULL)
			free(tmp[i].stuname[j]);
	}

	if (tmp[i].stuname != NULL)
		free(tmp[i].stuname);

	if (tmp != NULL)
		free(*p);
}



int main()

{
	//输入老师结构体的年龄 并按年龄排序
	int num = 3, ret = 0;
	//Teacher array[3];   //在栈上分配内存
	Teacher* array = NULL;
	//CreatTeacher(&array, num);
	ret = CreatTeacher(&array, num);
	if (ret != 0)
	{
		printf("func.CreatTeacher2() error:%d\n", ret);
		return ret;
	}


	int i = 0;

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

		printf("\n请输入老师名字:");
		scanf("%s", &array[i].name);

		//printf("\n请输入老师别名:");
		//scanf("%s", array[i].aliname);

		
		for (int j = 0; j < num; j++)
		{
			printf("\n请输入第%d个老师第%d学生的名字:",i+1,j+1);
			scanf("%s", array[i].stuname[j]);
		}

	}

	printf("排序前\n");
	PrintfTeacherage(array, num);

	printf("排序后\n");
	SortTeacherage(array, num);
	PrintfTeacherage(array, num);

	FreeTeacher(&array, num);

	printf("HELLO WORLD!\n");
	system("pause");
	return 0;

}

请输入老师年龄:3

请输入老师名字:33

请输入第1个老师第1学生的名字:3q

请输入第1个老师第2学生的名字:3a

请输入第1个老师第3学生的名字:3z

请输入老师年龄:2

请输入老师名字:22

请输入第2个老师第1学生的名字:2q

请输入第2个老师第2学生的名字:2a

请输入第2个老师第3学生的名字:2z

请输入老师年龄:1

请输入老师名字:11

请输入第3个老师第1学生的名字:1q

请输入第3个老师第2学生的名字:1a

请输入第3个老师第3学生的名字:1z
排序前
老师年龄:3
老师name:33
学生1名字:3q
学生2名字:3a
学生3名字:3z
老师年龄:2
老师name:22
学生1名字:2q
学生2名字:2a
学生3名字:2z
老师年龄:1
老师name:11
学生1名字:1q
学生2名字:1a
学生3名字:1z
排序后
老师年龄:1
老师name:33
学生1名字:3q
学生2名字:3a
学生3名字:3z
老师年龄:2
老师name:22
学生1名字:2q
学生2名字:2a
学生3名字:2z
老师年龄:3
老师name:11
学生1名字:1q
学生2名字:1a
学生3名字:1z
HELLO WORLD!
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值