当前位置: 首页 > article >正文

[练习]简单结构体操作程序

在学习C语言的过程中,我们经常会接触到各种数据结构的操作,其中数列(数组)是最基本也是最常用的一种。今天,我们分析一个简单的C语言程序,以及进行一定程度的改进。

程序概述

这个程序的主要目的是实现一个简单的数列操作,包括数列的内存分配、删除指定元素以及输出数列的功能。程序的核心是一个名为sequence的结构体,它包含数列的大小和指向数列元素的指针。通过几个函数的配合,程序完成了数列的创建、修改和输出。以下是程序的代码:

#include<stdio.h>
#include<stdlib.h>

struct sequence {
	int size;
	int* arr;
};typedef struct sequence SEQ;

SEQ memory();
void delete(SEQ seq);
void print_arr(SEQ seq);

int main() {

	SEQ seq = memory();
	delete(seq);
	print_arr(seq);

	return 0;
}

//接受数列[内存分配01]
#define ARR (seq.arr+i)
SEQ memory() {
	
	SEQ seq = {0,NULL};
	scanf_s("%d", &seq.size);

	seq.arr = (int*)calloc(seq.size, sizeof(int));

	for (int i = 0; i < seq.size; i++)
	{
		scanf_s("%d", ARR);
	}
	return seq;
}


//删除单元
void delete(SEQ seq) {

	int del;
	scanf_s("%d", &del);

	for (int i = 0; i < seq.size; i++)
	{
		if (*ARR == del) *ARR = -1;
	}
}

//输出单元
void print_arr(SEQ seq) {

	for (int i = 0; i < seq.size; i++)
	{
		if(*ARR != -1)printf("%d ", *ARR);
	}

}

#undef ARR

代码解析

结构体定义

struct sequence {
    int size;
    int* arr;
};typedef struct sequence SEQ;

这里定义了一个sequence结构体,并为其创建了一个别名SEQ。结构体包含两个成员:size用于存储数列的大小,arr是一个指向整型数组的指针,用于存储数列的元素。

主函数main

int main() {
    SEQ seq = memory();
    delete(seq);
    print_arr(seq);
    return 0;
}

主函数是程序的入口。首先,通过调用memory函数创建一个数列,并将其赋值给变量seq。接着,调用delete函数删除数列中的指定元素,最后调用print_arr函数输出处理后的数列。

memory函数

#define ARR (seq.arr+i)
SEQ memory() {
    SEQ seq = {0,NULL};
    scanf_s("%d", &seq.size);
    seq.arr = (int*)calloc(seq.size, sizeof(int));
    for (int i = 0; i < seq.size; i++) {
        scanf_s("%d", ARR);
    }
    return seq;
}

memory函数用于创建一个数列并分配内存。它首先定义并初始化一个SEQ类型的变量seq,然后读取用户输入的数列大小,并使用calloc函数为数列分配内存。之后,通过循环读取用户输入的数列元素,并存储到seq.arr中。最后返回创建好的数列seq。

delete函数

void delete(SEQ seq) {
    int del;
    scanf_s("%d", &del);
    for (int i = 0; i < seq.size; i++) {
        if (*ARR == del) *ARR = -1;
    }
}

delete函数用于删除数列中的指定元素。它首先读取用户输入的要删除的元素值del,然后遍历数列,如果发现某个元素等于del,则将其值修改为-1,表示该元素被删除。

print_arr函数

void print_arr(SEQ seq) {
    for (int i = 0; i < seq.size; i++) {
        if(*ARR != -1)printf("%d ", *ARR);
    }
}

print_arr函数用于输出处理后的数列。它通过循环遍历数列,如果某个元素的值不等于-1(即未被删除),则输出该元素。

内存释放问题

其实代码基本实现了功能,但是有一个致命的问题,它没有进行内存释放,我们可以在main函数的末尾添加free(seq.arr);来释放内存,确保内存安全。

关注代码的质量,不断优化和改进,以写出更优秀的程序。


http://www.kler.cn/a/511649.html

相关文章:

  • C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况
  • 【人工智能】:搭建本地AI服务——Ollama、LobeChat和Go语言的全方位实践指南
  • 多种vue前端框架介绍
  • OSPF小实验
  • windows配置 Conda 使用阿里云镜像源
  • minio https配置
  • 告别 Excel,拥抱 R 语言:开启数据分析新时代
  • k8s集成MinIo
  • 精品PPT | 某制造集团灯塔工厂解决方案
  • C# 操作 文件
  • [STM32 HAL库]串口中断编程思路
  • 微服务入门:从零开始构建你的微服务架构
  • xiao esp32 S3播放SD卡wav音频
  • 最大矩阵面积问题
  • 【GPT进化之路】从 GPT-1 的初试锋芒到 GPT-4 的跨模态智能时代
  • 青少年CTF练习平台 EasyMD5解题思路
  • go语言zero框架通过chromedp实现网页在线截图的设计与功能实现
  • SQLMAP的下载安装和使用(Windows)
  • HTML 的基础知识及其重要性
  • go语言 goc覆盖率统计
  • 如何安装linux版本的node.js
  • 本地仓库管理之当前分支内的操作
  • Stata应用:将数据“画”在中国地图上|Python数据分析
  • springboot财务管理系统
  • Unity3D仿星露谷物语开发24之创建时间管理器
  • 【Kafka】Linux+KRaft集群部署指南