重写结构体嵌套一级指针老师和二级指针学生的代码

//结构体类型,每个导师有三个学生
typedef struct Teacher
{
char *tName; //导师
char **stu; //三个学生
int age;
}Teacher;

//在createTeacher中分配空间
int createTeacher(Teacher **p/*out*/, int n1, int n2);

//给成员赋值
void initTeacher(Teacher *p, int n1, int n2);

//打印结构体成员信息
void printTeacher(Teacher *p, int n1, int n2);

//根据导师名字排序, 降序
void sortTeacher(Teacher *p, int n);

//释放空间,在函数内部把p赋值为NULL
void freeTeacher(Teacher **p, int n1, int n2);

int main(void)
{
int ret = 0;
int n1 = 3; //导师个数
int n2 = 3; //学生
Teacher *p = NULL;

ret = createTeacher(&p, n1, n2);
if (ret != 0)
{
printf("createTeacher err:%d\n", ret);
return ret;
}

initTeacher(p, n1, n2); //给成员赋值

//打印成员,排序前
printf("排序前:\n");
printTeacher(p, n1, n2);

//根据导师名字排序, 降序
sortTeacher(p, n1);

//打印成员,排序后
printf("\n排序后:\n");
printTeacher(p, n1, n2);

//释放空间,在函数内部把p赋值为NULL
freeTeacher(&p, n1, n2);

return 0;
}

#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct Teacher
{
char *tName; //导师
char **stu; //三个学生
int age;
}Teacher; //在createTeacher中分配空间
int createTeacher(Teacher **p/*out*/, int n1, int n2) {
if (p == NULL) { return -;
}
int i = ;
int j = ;
Teacher *tmp = NULL;//Teacher tmp[3]
tmp =(Teacher*)malloc(n1 * sizeof(Teacher));
if (tmp == NULL) {
return -;
}
for (i = ; i < n1; i++) {
//导师
tmp[i].tName = (char *)malloc(); //学生
char **s = (char **)malloc(n2 * sizeof(char *));
for (j = ; j < n2; j++) {
s[j] = (char *)malloc(); }
//直接赋值
tmp[i].stu = s;
} //间接赋值是指针存在的最大意义
*p = tmp; return ;
} //给成员赋值
void initTeacher(Teacher *p, int n1, int n2) {
if (p == NULL) {
return;
}
int i = ;
int j = ;
char buf[];
for (i = ; i < n1; i++) {
//导师名字
sprintf(buf, "teacher%d%d%d", i, i, i);
strcpy(p[i].tName, buf); //年龄
p[i].age = + * i; //n2学生
for (j = ; j < n2; j++) {
sprintf(buf, "stu%d%d%d%d", i, i, j, j);
strcpy(p[i].stu[j], buf);
}
}
} //打印结构体成员信息
void printTeacher(Teacher *p, int n1, int n2) {
if (p == NULL)
return;
int i = ;
int j = ; for (i = ; i < n1; i++) {
//导师名字
//年龄
printf("%s[%d]\n", p[i].tName, p[i].age);
//学生
for (j = ; j < n2; j++) {
printf("\t%s", p[i].stu[j]);
}
printf("\n");
}
} //根据导师名字排序, 降序
void sortTeacher(Teacher *p, int n) {
if (p == NULL) {
return;
}
int i = ;
int j = ;
Teacher tmp; for (i = ; i < n-; ++i) {
for (j = i + ; j < n; j++) {
if (strcmp(p[i].tName, p[j].tName) < ) {
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
} //释放空间,在函数内部把p赋值为NULL
void freeTeacher(Teacher **p, int n1, int n2) {
if (p == NULL) {
return;
}
Teacher *tmp = *p; int i = ;
int j = ;
for (i = ; i < n1; i++) {
//可以释放导师
if (tmp[i].tName != NULL) {
free(tmp[i].tName);
tmp[i].tName = NULL;
} //学生
for (j = ; j < n2; j++) {
if (tmp[i].stu[j] != NULL) {
free(tmp[i].stu[j]);
tmp[i].stu[j] = NULL;
}
}
if (tmp[i].stu != NULL) {
free(tmp[i].stu);
}
}
if (tmp != NULL) {
free(tmp);
*p = NULL;
}
} int main(void)
{
int ret = ;
int n1 = ; //导师个数
int n2 = ; //学生
Teacher *p = NULL; ret = createTeacher(&p, n1, n2);
if (ret != )
{
printf("createTeacher err:%d\n", ret);
return ret;
} initTeacher(p, n1, n2); //给成员赋值 //打印成员,排序前
printf("排序前:\n");
printTeacher(p, n1, n2); //根据导师名字排序, 降序
sortTeacher(p, n1); //打印成员,排序后
printf("\n排序后:\n");
printTeacher(p, n1, n2); //释放空间,在函数内部把p赋值为NULL
freeTeacher(&p, n1, n2); return ;
}

c提高第五次作业的更多相关文章

  1. c提高第三次作业

    1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...

  2. c提高第四次作业

    1. 简述指针数组和数组指针的区别?答: 指针数组:是一个数组,每个元素都是指针 数组指针:是一个指针,指向数组的指针 2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种 ...

  3. 第五次作业——python效能分析与几个问题(个人作业)

    第五次作业--效能分析与几个问题(个人作业) 前言 阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下. 阅读 阅读 ...

  4. 耿丹CS16-2班第五次作业汇总

    Deadline: 2016-10-26 23:59 作业内容 实验4-1 求1到20的阶乘的和,其中求阶乘用函数完成. 实验4-2 写一个判素数的函数,在主函数输入一个整数,输出其是否是素数的信息. ...

  5. C 语言学习 第五次作业总结

    第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...

  6. Android提高第十二篇之蓝牙传感应用

        请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...

  7. C语言第五次作业——循环结构

    C语言程序设计第五次作业--循环结构(1) (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增 ...

  8. 17秋 软件工程 团队第五次作业 Alpha

    题目:团队作业--Alpha冲刺 17秋 软件工程 团队第五次作业 Alpha 12次Scrum 第一次Scrum 第二次Scrum 第三次Scrum 第四次Scrum 第五次Scrum 第六次Scr ...

  9. C语言基础课第五次作业

    PTA第五次作业 7-2 统计一行文本中的单词个数 一.程序代码 #include<stdio.h> int main(void) { ]; ,word=; char c; gets(st ...

随机推荐

  1. Java~类,抽象类和接口

    最近有空就着迷于java的世界,希望可以把自己的lind重构一个java版本出来,虽然遇到一些小问题,但也都解决了,还是那句话,知识需要积累,程序员需要一个追求! 类 抽象类 接口 泛型类 泛型接口 ...

  2. 个人完善的springboot拦截器

    import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...

  3. ByteView和Sink

    久违啦米娜桑!!! 最近有点忙,一月有余没有更新了,实在对不起大家!!! 上线后看到不少朋友发的私信,感谢大家的赞许与信任,后面我会尽最大的努力按时更新,不断推出更优质的文章!!! 本来计划最后花1讲 ...

  4. C#连接基于Java开发IM——Openfire

    Openfire简介    Openfire 是开源的.基于可拓展通讯和表示协议(XMPP).采用Java编程语言开发的实时协作服务器.Openfire的效率很高,单台服务器可支持上万并发用户.    ...

  5. DataTable增加行

  6. 百度地图API开发一——仿照现有测距效果实现测面功能

      最近做了一个百度地图API的开发项目,里面有测量距离和测量面积的功能需求.测量距离百度给出了封装好的javascript包——BMapLib.DistanceTool,效果如下: 这个效果体验很好 ...

  7. Flutter项目之app升级方案

    题接上篇的文章的项目,还是那个空货管理app.本篇文章用于讲解基于Flutter的app项目的升级方案. 在我接触Flutter之前,做过一个比较失败的基于DCloud的HTML5+技术的app,做过 ...

  8. typescript的数据类型

    typescript是JavaScript的扩展,说到js的数据类型,大家肯定会想到它是一种弱类型的语言,不需要指定特定的数据类型,ts的语言也正在往java这些强类型的语言靠近: 看看typescr ...

  9. 章节十、4-CSS Classes---用多个CSS Classes定位元素

    以下演示操作以该网址中的输入框为例:https://learn.letskodeit.com/p/practice 一.使用input[class=inputs]验证元素是否唯一 注意:使用“clas ...

  10. Jmeter 接口测试实战-有趣的cookie

    Jmeter 接口测试实战-有趣的cookie 场景: 接口测试时常都需要登录,请求方式(post), 登录常用的方法有通过获取token, 获取session, 获取cookie, 等等. 这几种都 ...