用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10

简介: 用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10

该问题涉及到了指针和动态内存分配的运用,以及对数组进行排序和逆序输出的实现。以下是一个基于C语言的技术博客,包含了对输入数据进行排序和逆序输出的详细代码案例。

首先,我们需要引入头文件 stdio.hstdlib.h 以使用标准输入输出函数和动态内存分配函数。

c复制代码
 #include <stdio.h>  
 #include <stdlib.h>

接下来,我们需要定义一个结构体 struct Number,用于存储输入的数字数据。同时,我们还需要定义一个指向该结构体的指针 struct Number *numbers,以便进行动态内存分配和排序操作。

c复制代码
 struct Number {  
 int number;
 };
 struct Number *numbers;

在主函数中,我们需要先使用 malloc() 函数为 numbers 分配足够的内存空间,以存储输入的数字数据。这里我们使用了 sizeof() 函数计算结构体 Number 的大小,并分配了能够存储 10 个 Number 结构体的内存空间。

c复制代码
 int main() {
 int count = 10;
 numbers = (struct Number *)malloc(count * sizeof(struct Number));
 if (numbers == NULL) {
 printf("Memory allocation failed.\n");
 return 1;
 }

接下来,我们需要从标准输入中读取 10 个数字数据,并将它们存储到 numbers 中。这里我们使用了循环和指针操作来实现。

c复制代码
 for (int i = 0; i < count; i++) {
 printf("Enter number %d: ", i + 1);
 scanf("%d", &(numbers[i].number));
 }

然后,我们需要对这些数字数据进行排序。这里我们使用了冒泡排序算法,通过比较相邻元素的大小,并进行交换操作来实现排序。排序完成后,我们就可以输出这些数字数据了。为了实现逆序输出,我们还需要将数组进行倒序排列。

c复制代码
 for (int i = 0; i < count - 1; i++) {
 for (int j = i + 1; j < count; j++) {
 if (numbers[i].number > numbers[j].number) {
 int temp = numbers[i].number;
 numbers[i].number = numbers[j].number;
 numbers[j].number = temp;
 }
 }
 }
 for (int i = count - 1; i >= 0; i--) {
 printf("%d ", numbers[i].number);
 }

最后,我们需要释放动态内存以避免内存泄漏。这里我们使用了 free() 函数来实现。

c复制代码
 free(numbers);
 return 0;

完整的代码如下:

c复制代码
 #include <stdio.h>  
 #include <stdlib.h>  
 struct Number {  
 int number;
 };
 int main() {
 int count = 10;
 struct Number *numbers = (struct Number *)malloc(count * sizeof(struct Number));
 if (numbers == NULL) {
 printf("Memory allocation failed.\n");
 return 1;
 }
 for (int i = 0; i < count; i++) {
 printf("Enter number %d: ", i + 1);
 scanf("%d", &(numbers[i].number));
 }
 for (int i = 0; i < count - 1; i++) {
 for (int j = i + 1; j < count; j++) {
 if (numbers[i].number > numbers[j].number) {
 int temp = numbers[i].number;
 numbers[i].number = numbers[j].number;
 numbers[j].number = temp;
 }
 }
 }
 for (int i = count - 1; i >= 0; i--) {
 printf("%d ", numbers[i].number);
 }
 free(numbers);
 return 0;
 }
目录
相关文章
|
14天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
3月前
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
94 0
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
13天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
27 2
|
24天前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
|
23天前
|
缓存 监控 Java
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
24天前
|
存储 Rust C#
内存指针解引用
【10月更文挑战第14天】
30 1
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
37 2
|
4月前
|
存储 监控 安全
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
今天,针对内存卡数据恢复,本期做一个详细的归纳,分析常见的数据丢失原因、详细的数据恢复步骤、以及如何保护内存卡数据。
内存卡数据恢复,3个方法帮你找回丢失的照片和视频
|
3月前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用