首页 > 其他分享 >静态和动态结构体命名方式和区别

静态和动态结构体命名方式和区别

时间:2024-11-03 15:46:52浏览次数:6  
标签:顺序 静态 元素 int length 命名 长度 动态 data

静态和动态结构体命名方式和区别

  • 静态结构体

    • 在定义结构体时,直接在结构体中定义一个固定大小的数组来存储元素。
    • 命名方式通常为 struct 结构体名
    • 优点是简单,直接,适用于已知数据量大小且不会改变的情况。
    • 缺点是灵活性差,因为数组大小固定,不能动态扩展或收缩。
  • 动态结构体

    • 在定义结构体时,使用指针来动态分配内存空间。
    • 命名方式通常为 typedef struct 后跟结构体名,然后使用 typedef 关键字来简化类型名。
    • 优点是灵活性高,可以根据需要动态分配和释放内存,适用于数据量大小不确定或经常变化的情况。
    • 缺点是管理内存的复杂性增加,需要手动进行内存分配和释放。
这段代码实现了一个动态顺序表的基本操作,包括初始化和动态扩容:
#include <stdio.h>

#include <stdlib.h>


//顺序表的实现动态分配。开辟一个新内存 

#define InitSize 10	//定义顺序表的初始长度 


typedef struct

{

	int *data;	//指向动态分配的空间的指针 

	int MaxSize;//当前表的最大容量 

	int length;//当前表的长度 

}Sqlist;



//初始化一个顺序表

void InitList(Sqlist *L){

	//顺序表的长度是10,然后里面的每个储存的内存是int类型占据4B,那就是说十个这样的就要40B才够 

	L->data=(int*)malloc(InitSize*sizeof(int));

	L->MaxSize = InitSize;

	L->length = 0;	//初始长度设置为0 

} 



//增加该顺序表的长度

void IncreateSize(Sqlist *L,int len){

	//p指向原先L的data数据,保存 

	int *p = L->data;

	//L的data区域开辟一个更大的空间出来 MaxSize+len

	L->data=(int*)malloc((L->MaxSize+len)*sizeof(int));

	//再把p刚刚储存的数据放回L的data区域内 

	for(int i=0;i<L->length;i++){

		L->data[i] = p[i];//把数据复制到新的区域 

	}

	//最大的数组长度变了 

	L->MaxSize =L->length + len;

	//将p保存的数据清空 

	free(p);	//释放原来p的内存空间 

} 



int main() {

	Sqlist L;

	//这里要写入的是地址值 ,所以使用* 

	//L是个结构体变量,因此使用 “结构体名.成员变量” 来引用变量

	InitList(&L);

	for(int i=0;i<L.MaxSize;i++){

		L.data[i] = i;

		L.length++;

		printf("data[%d] = %d\n",i,L.data[i]);

	}
		printf("----------------------------------------\n");
	IncreateSize(&L,5);

	//C语言需要输出结构体的值要这样调用,而且必须前面是“% s字符串d数组” 

	for(int i=0; i<L.MaxSize; i++)	

		//L是一个结构体指针,因此使用“结构体指针名->成员变量名”来引用变量

		printf("data[%d] = %d\n",i,L.data[i]);

	return 0;

}
 
对代码的解释:
  1. 结构体定义

    • 使用 typedef 关键字定义了一个名为 Sqlist 的结构体,该结构体包含三个成员:
      • data 是一个指向整数的指针,用于动态分配内存空间。
      • MaxSize 表示顺序表的最大容量。
      • length 表示顺序表的当前长度。
  2. 宏定义

    • InitSize 定义了顺序表的初始长度为10。
  3. 函数 InitList

    • 该函数用于初始化顺序表。它动态分配一个初始长度为 InitSize 的整数数组,并将最大容量和当前长度分别设置为 InitSize 和 0。
  4. 函数 IncreateSize

    • 该函数用于增加顺序表的长度。它首先保存原有数据,然后重新分配一个更大的内存空间,将原有数据复制到新空间,并更新最大容量。最后,释放原有内存空间。
  5. main 函数

    • 定义一个 Sqlist 类型的变量 L
    • 调用 InitList 函数初始化顺序表。
    • 使用循环给顺序表赋值,并更新长度,同时打印每个元素的值。
    • 调用 IncreateSize 函数增加顺序表的长度,并再次打印每个元素的值

下面是一个基于静态顺序表的基本操作的实现。静态顺序表使用固定大小的数组来存储元素:

#include <stdio.h>

#define MaxSize 10  // 定义顺序表的最大长度

// 静态顺序表的定义
typedef struct {
    int data[MaxSize];  // 固定大小的数组
    int length;         // 当前顺序表的长度
} SqList;

// 初始化顺序表
void InitList(SqList *L) {
    L->length = 0;  // 初始化长度为0
}

// 在顺序表L中第i个位置插入元素e
int ListInsert(SqList *L, int i, int e) {
    if (i < 1 || i > L->length + 1) {  // 检查插入位置是否合法
        return 0;  // 插入位置不合法
    }
    if (L->length >= MaxSize) {  // 检查顺序表是否已满
        return 0;  // 顺序表已满,无法插入
    }
    for (int j = L->length; j >= i; j--) {  // 从后往前移动元素,为新元素腾出位置
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e;  // 在位置i处插入元素e
    L->length++;         // 顺序表长度增加
    return 1;            // 插入成功
}

// 获取顺序表L中第i个位置的元素
int GetElem(SqList L, int i) {
    if (i < 1 || i > L.length) {  // 检查位置是否合法
        return 0;  // 位置不合法
    }
    return L.data[i - 1];  // 返回位置i的元素
}

// 查找顺序表L中第一个值为e的元素的位置
int LocateElem(SqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == e) {
            return i + 1;  // 返回位置,位置从1开始计数
        }
    }
    return 0;  // 没有找到返回0
}

int main() {
    SqList L;
    InitList(&L);  // 初始化顺序表

    // 向顺序表中插入元素
    for (int i = 1; i <= MaxSize; i++) {
        ListInsert(&L, i, i);  // 在位置i处插入元素i
    }

    // 打印顺序表中的元素
    for (int i = 0; i < L.length; i++) {
        printf("data[%d] = %d\n", i, L.data[i]);
    }

    // 获取并打印顺序表中的第5个元素
    printf("Element at position 5: %d\n", GetElem(L, 5));

    // 查找元素7的位置
    int position = LocateElem(L, 7);
    if (position) {
        printf("Element 7 is at position: %d\n", position);
    } else {
        printf("Element 7 not found.\n");
    }

    return 0;
}

代码解释:

  1. 结构体定义

    • SqList 结构体定义了一个静态顺序表,其中包含一个固定大小的数组 data 和一个表示当前长度的变量 length
  2. 初始化函数 InitList

    • 将顺序表的长度设置为0。
  3. 插入函数 ListInsert

    • 在顺序表的第 i 个位置插入元素 e
    • 检查插入位置是否合法以及顺序表是否已满。
    • 从后往前移动元素,为新元素腾出位置。
    • 插入元素并更新顺序表长度。
  4. 获取元素函数 GetElem

    • 获取顺序表中第 i 个位置的元素。
    • 检查位置是否合法。
    • 返回指定位置的元素。
  5. 查找函数 LocateElem

    • 在顺序表中查找第一个值为 e 的元素的位置。
    • 遍历顺序表,返回找到的元素的位置(从1开始计数)。
  6. main 函数

    • 初始化顺序表。
    • 向顺序表中插入元素。
    • 打印顺序表中的所有元素。
    • 获取并打印顺序表中的特定位置的元素。
    • 查找并打印特定元素的位置。

标签:顺序,静态,元素,int,length,命名,长度,动态,data
From: https://blog.csdn.net/weixin_63445900/article/details/143466114

相关文章

  • 【笔记】动态规划
    前言动态规划(DynamicProgramming)是c++算法学习当中十分重要而变化灵活的一部分分支,这种算法是通过递推的方式从而达到求出最优解的目的。动态规划基本原理能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。最优子结构:每个子问题的解是其本身的最优......
  • 超详细解读:成员内部类、静态内部类、局部内部类和匿名内部类
            内部类(InnerClass)是Java中一种特殊的类,它定义在另一个类的内部。内部类(四种内部类)可以访问其外部类(即包含它的类)的所有成员(属性和方法),包括私有成员,因为内部类作为类的五大成员(属性、方法、构造器、代码块、内部类)之一相当于外部类的一部分,因此它有权访问外部......
  • 「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
    在鸿蒙应用中,Canvas组件可以实现丰富的动态效果,适合用于动画和实时更新的场景。本篇将介绍如何在Canvas中实现动画循环、动态进度条、旋转和缩放动画,以及性能优化策略。关键词Canvas组件动态绘制动画效果动态进度条旋转和缩放性能优化一、使用定时器实现动......
  • 易语言模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • Python模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • 猿人学web端爬虫攻防大赛赛题第2题——动态cookie
    题目网址:https://match.yuanrenxue.cn/match/2解题步骤看触发的数据包。在请求头中的cookie字段中m变量的值一看就是加密过的。看Initiator模块中的request。点进去,打断点。我们只能在响应内容中看到页面数据,但是关于m的加密却是没有看到。刷新界面,出现如下画面......
  • C++模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)
    【LetMeFly】3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)力扣题目链接:https://leetcode.cn/problems/maximum-sum-of-subsequence-with-non-adjacent-elements/给你一个整数数组nums和一个二维数组queries,其中queries[i]=[posi,xi]。对于每个查......
  • 6.1、实验一:静态路由
    一、目的理解路由表的概念会使用基础命令根据需求正确配置静态路由二、准备实验1.实验要求让PC0、PC1、PC2三台电脑能够相互连通2.拓扑图三、开始实验1.连接设备安装路由器模块每个交换机都需要安装什么是NIM-2T模块?NIM-2T是思科用于ISR(IntegratedServices......