数据结构基础(1)--数组C语言实现--动态内存分配
基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc()。
难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定。规律:
1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动)
for( i=cnu;i>=pos;i--)
pBase[i]=pBase[i-1];
2.删除数组第pos位置的元素
for(i=pos+1;i<=cnu;i--)
pBase[i-2]=pBase[i-1];
使用malloc动态分配内存并将返回值赋给整形指针
int *pBase=(int *)malloc(sizeof(int)*len);//分配4*len字节长度的内存
这是pBase可以指向数组中的第一个元素,可以作为数组变量名称使用。
数组的优缺点:
优点:
存取速度快 o(1) 可以直接根据下标找到内存位置
缺点:
事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低
- #include<stdio.h>
- #include<malloc.h>
- #include<stdbool.h>
- struct Arr{
- int len;//数组能存取的最大元素个数
- int cnu;//数组中当前元素个数
- int * pBase;//存储指向数组的指针
- };
- /**
- *初始化数组
- */
- void init_array(struct Arr * pArray,int len){
- pArray->pBase=(int *)malloc(sizeof(int)*len);//分配4*len字节长度的内存
- if(NULL== pArray->pBase)//判断内存是否分配失败
- {
- printf("动态分配内存失败\n");
- // exit(-1);
- }else{
- pArray->len=len;
- pArray->cnu=0;
- }
- return ;
- }
- /**
- *判断数组是否为空,传地址省内存4字节,传结构体变量需要进行拷贝,12字节
- */
- bool isempty(struct Arr * pArray){
- if(0==pArray->cnu)
- {
- return true;
- }else{
- return false;
- }
- }
- /**
- **判断数组是否满了
- */
- bool isfull(struct Arr * pArray)
- {
- if(pArray->len==pArray->cnu)
- {
- return true;
- }else {
- return false;
- }
- }
- /**
- *显示数组内容
- */
- void show_array(struct Arr * pArray){
- if(isempty(pArray))
- printf("数组为空!\n");
- else{
- int i;
- for( i=0; i<pArray->cnu;i++)
- {
- printf("%d \n",pArray->pBase[i]);
- }
- printf("------------------------------------\n");
- }
- }
- /**
- **向数组追加元素
- */
- bool append(struct Arr * pArray,int val){
- if(isfull(pArray))
- {
- printf("数组已经满了!\n");
- return false;
- }else{
- pArray->pBase[pArray->cnu]=val;
- pArray->cnu++;
- }
- }
- /**
- **向数组中插入元素,pos为数组中第几个位置,pos=3就是向a[2]插入元素
- */
- bool insert(struct Arr * pArray,int pos,int val)
- {
- if(pos<1||pos>pArray->len+1)//插入的位置不能小于1,同时不能比最后一个元素大二
- {
- printf("插入的位置输入的不合法\n");
- return false;
- }
- if(isfull(pArray))
- {
- printf("数组已经满了,插入失败!\n");
- return false;
- }
- int i;
- //循环将pos位置开始的数组后移
- for(i=pArray->cnu;i>=pos;i--)
- //移动范围是从第pos个到底cnu个
- {
- pArray->pBase[i]=pArray->pBase[i-1];
- /**
- 若以i表示要移动元素的位置,从一开始的。右边都是i-1,若左移,左边是i-2,右移,左边是i
- */
- }
- pArray->pBase[pos-1]=val;
- pArray->cnu++;
- pArray->len++;
- return true;
- }
- /**
- **删除数组中的第pos个元素,同时返回删除的元素的值
- */
- bool delete(struct Arr * pArray,int pos,int * val)
- {
- if(pos<1||pos>pArray->cnu)
- {
- printf("删除失败,位置不合法\n");
- return false;
- }
- int i;
- *val=pArray->pBase[pos-1];
- for(i=pos+1;i<=pArray->cnu;i++)
- {
- //移动单位是从第pos+1个到cnu
- pArray->pBase[i-2]=pArray->pBase[i-1];
- }
- pArray->cnu--;
- return true;
- }
- /**
- **数组倒置
- */
- bool inverse(struct Arr * pArray)
- {
- if(isempty(pArray))
- {
- printf("倒置失败,因数组为空");
- return false;
- }
- int i=0;
- int j=pArray->cnu-1;
- int temp;
- while(i<j)
- {
- temp=pArray->pBase[i];
- pArray->pBase[i]= pArray->pBase[j];
- pArray->pBase[j]=temp;
- i++;
- j--;
- }
- return true;
- }
- int main()
- {
- struct Arr arr;
- init_array(&arr,6);//将结构体的地址作为实参,这样才能修改结构体中的值,如果传的是结构体变量,那么将进行拷贝,不会改变值
- append(&arr,1);
- append(&arr,2);
- append(&arr,3);
- append(&arr,4);
- show_array(&arr);
- insert(&arr,2,88);
- show_array(&arr);
- int val;
- delete(&arr,1,&val);
- show_array(&arr);
- printf("删除了 %d\n",val);
- inverse(&arr);
- show_array(&arr);
- return 0;
- }
数据结构基础(1)--数组C语言实现--动态内存分配的更多相关文章
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- c++ 动态数组,指针与动态内存分配
教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...
- 重拾c语言之动态内存分配
动态内存分配 传统数组的缺点: 1数组长度必须事先制定,且仅仅能是长整数不能是变量 2传统形式定义的数组该数组的内存程序无法手动释放 3数组一旦定义,系统就会为该数组分配的存储空间就会一直存在直到该函 ...
- C++指针与数组、函数、动态内存分配
C++指针 指针是用来存储地址的变量. 对于二维数组来说: a:代表的是首行地址: *a:代表的是首元素地址: **a:首元素: a+1:第二行地址: *a+2:首先*a是首元素地址,在首元素地址上+ ...
- C++语言之动态内存分配
在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中: 存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配 ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
- [C语言] 数据结构-预备知识动态内存分配
动态内存分配 静态内存分配数组 int a[5]={1,2,3,4,5} 动态内存分配数组 int len=5; int *parr=(int *)malloc(sizeof(int) * len) ...
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
随机推荐
- 前端日报-20160527 underscore 源码解读
underscore 源码解读 API文档浏览器 JavaScript 中加号操作符细节 抛弃 jQuery,拥抱原生 JS 从 0 开始学习 GitHub 系列之「加入 GitHub」 js实现克隆 ...
- L1 Cache, L2 Cache读取命中率与时钟周期计算
CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存.从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为8 ...
- overload与override的区别
override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之 ...
- linux centos7最小化安装NAT模式网络设置
1.网络连接设置为NAT模式2.开启CentOS7,以root登陆3.vi /etc/sysconfig/network-scripts/ifcfg-ensXXXX4.设置BOOTPROTO=dhcp ...
- 微信小程序接入腾讯云IM即时通讯(会话列表)
会话列表功能概述: 登录 :先用自己的账号登录腾讯云: 获取会话列表 :登录之后再获取会话列表: 更新未读消息数量 :获取会话列表之后更新未读消息数量 WXML代码(自己写的将就看一下) <vi ...
- node(2)
//app.js var express = require("express"); //以后的时后处理POST DELETE PATCH CHECKOUT 这些请求都可以用for ...
- 数据可视化d3.v4.js
<html> <head> <meta charset="utf-8"> <title>做一个简单的条形图</title> ...
- JQuery-学习。
jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由约翰·雷西格(John Resig)在2006年1月的BarCamp NYC上发布第一个版本.目前是 ...
- scrapy简单入门及选择器(xpath\css)
简介 scrapy被认为是比较简单的爬虫框架,资料比较齐全,网上也有很多教程.官网上介绍了它的四种安装方法,PyPI.Conda.APT.Source,我们只介绍最简单的安装方法. 安装 Window ...
- 需要警惕的linux命令
Linux shell/terminal命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除.为了避免这样的事情发生,我们应该时刻注意PHP代码&命令,今天为大家带来9 ...