c提高第五次作业
重写结构体嵌套一级指针老师和二级指针学生的代码
//结构体类型,每个导师有三个学生
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提高第五次作业的更多相关文章
- c提高第三次作业
1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...
- c提高第四次作业
1. 简述指针数组和数组指针的区别?答: 指针数组:是一个数组,每个元素都是指针 数组指针:是一个指针,指向数组的指针 2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种 ...
- 第五次作业——python效能分析与几个问题(个人作业)
第五次作业--效能分析与几个问题(个人作业) 前言 阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下. 阅读 阅读 ...
- 耿丹CS16-2班第五次作业汇总
Deadline: 2016-10-26 23:59 作业内容 实验4-1 求1到20的阶乘的和,其中求阶乘用函数完成. 实验4-2 写一个判素数的函数,在主函数输入一个整数,输出其是否是素数的信息. ...
- C 语言学习 第五次作业总结
第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...
- Android提高第十二篇之蓝牙传感应用
请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...
- C语言第五次作业——循环结构
C语言程序设计第五次作业--循环结构(1) (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增 ...
- 17秋 软件工程 团队第五次作业 Alpha
题目:团队作业--Alpha冲刺 17秋 软件工程 团队第五次作业 Alpha 12次Scrum 第一次Scrum 第二次Scrum 第三次Scrum 第四次Scrum 第五次Scrum 第六次Scr ...
- C语言基础课第五次作业
PTA第五次作业 7-2 统计一行文本中的单词个数 一.程序代码 #include<stdio.h> int main(void) { ]; ,word=; char c; gets(st ...
随机推荐
- [开发技巧]·Numpy广播机制的深入理解与应用
[开发技巧]·Numpy广播机制的深入理解与应用 1.问题描述 我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作.广播机制很 ...
- java内存溢出的情况解决方法
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决. 第一步,就是修改JVM启动参数,直接增加内存.这一点看上去似乎很简单,但很容易被忽略.JVM默认可以使用的内存为64M,To ...
- vue.js之动画篇
本文引入类库的方式均采用CND的方式,可直接复制代码到编辑器中学习和测试 不使用动画切换元素 <div id="app"> <input type="b ...
- C#--深入理解类型
今日无事,回顾了一下C#基础知识,颇有收获,就自己的理解,写了这篇文章,如有不对,欢迎指正. C#中的类型可以分为两类:值类型与引用类型,如下图所示. 值类型通常被分配到线程的堆栈上,而引用类型则被分 ...
- 【转】使用MySQL处理百万级以上数据时,不得不知道的几个常识
---------------------------------------------------------------------------------------------------- ...
- javascript面向对象习题答案
第二章 1.如果我们在控制台中执行下列语句,结果分别是什么?为什么? var a; typeof a; undefined > var s = '1s'; s++; NaN > !!&qu ...
- C++一种高精度计时器
在windows下可以通过QueryPerformanceFrequency()和QueryPerformanceCounter()等系列函数来实现计时器的功能. 根据其函数说明,其精度能够达到微秒级 ...
- DevExpress TreeList 禁止节点拖动到其他节点上
背景 在做一个类似文件树的控件,支持节点从树上向其它的控件拖动程序,但是要保证树上的节点不能拖动上其他的节点上. 代码 /// <summary> /// 拖动节点完成 /// </ ...
- git错误--ssh: Could not resolve hostname ssh.github.com: Name or service not known--解决方式
错误如下: git push origin ssh: Could not resolve hostname ssh.github.com: Name or service not known fata ...
- 数据加密--详解 RSA加密算法 原理与实现
RSA算法简介 RSA是最流行的非对称加密算法之一.也被称为公钥加密.它是由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adlema ...