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

//结构体类型,每个导师有三个学生
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. DotNetCore深入了解之三HttpClientFactory类

    当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. usi ...

  2. 『练手』005 Laura.SqlForever历史遗留 的 架构思想缺陷

    005 Laura.SqlForever历史遗留 的 架构思想缺陷 我们 比较一下 Laura.WinFramework 和 Laura.XtraFramework 的差异: Laura.WinFra ...

  3. 前端笔记之移动端&响应式(下)默认样式&事件&惯性抛掷&swiper&loaction对象

    一.移动端默认样式 ·IOS和Android下触摸元素时出现半透明灰色遮罩 a,input,button{ -webkit-tap-highlight-color: transparent; } ·I ...

  4. 使用 ASP.NET Core MVC 创建 Web API(三)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 十 ...

  5. Service Worker

    Service Worker 随着前端快速发展,应用的性能已经变得至关重要,关于这一点大佬做了很多统计.你可以去看看. 如何降低一个页面的网络请求成本从而缩短页面加载资源的时间并降低用户可感知的延时是 ...

  6. 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理

    1.概述 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.菜单分为默认菜单与个性化菜单.个性化菜单接口是为了帮助公众号实现灵活的业务运营,开发者可以通过该接口,让公众号的不同用户群 ...

  7. SLAM+语音机器人DIY系列:(八)高阶拓展——1.miiboo机器人安卓手机APP开发

    android要与ROS通讯,一种是基于rosbridge,另一种是基于rosjava库. 相关参考例子工程 rosbridge例子: https://github.com/hibernate2011 ...

  8. Vue源码解析(一):入口文件

    在学习Vue源码之前,首先要做的一件事情,就是去GitHub上将Vue源码clone下来,目前我这里分析的Vue版本是V2.5.21,下面开始分析: 一.源码的目录结构: Vue的源码都在src目录下 ...

  9. python的学习笔记01_5文件操作

    一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  10. 基于Html5 Plus + Vue + Mui 移动App开发(三)-文件操作(读取、保存、更新数据)

      随着手机的发展,现在越来越多的人选择在手机上看书.无论是专业书籍.文学.英语还是网络小说,在手机上看新闻成了人们处理零碎时间的办法.在智能手机里安装一个资讯APP,可以随时.随地查看自己想看的资讯 ...