前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >连续存储数组的算法(包含数组倒置、冒泡排序……)

连续存储数组的算法(包含数组倒置、冒泡排序……)

作者头像
孙晨c
发布于 2019-09-10 11:15:19
发布于 2019-09-10 11:15:19
83700
代码可运行
举报
文章被收录于专栏:无题~无题~
运行总次数:0
代码可运行

线性结构【把所有的结点用一根直线穿起来】

  连续存储【数组】、离散存储【链表】(不连续的,可分隔开来)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  4 #include<stdio.h>
  5 #include<malloc.h>//包含malloc函数
  6 #include<stdlib.h>//包含exit函数
  7 //定义了一个(复合)数据类型,名字叫struct Arr,该数据类型有三个成员:
  8 struct Arr{
  9     int * pBase; //存储的是数组第一个元素的地址
 10     int len; //数组所能容纳的最大元素个数
 11     int cnt; //当前数组有效元素的个数
 12 };
 13 
 14 void init_arr(struct Arr *pArr,int length); //初始化
 15 bool append_arr(struct Arr *pArr,int val); //追加
 16 bool insert_arr(struct Arr *pArr,int pos,int val); //插入,pos的值从1开始,表示在第pos个元素上插入
 17 bool delete_arr(struct Arr *pArr,int pos,int *pVal); //删除
 18 int get(); //获取某下标的值
 19 bool is_empty(struct Arr *pArr);//判断数组是否为空
 20 bool is_full(struct Arr *pArr); //判断数组是否满
 21 void sort_arr(struct Arr *pArr); //排序
 22 void show_arr(struct Arr *pArr); //输出
 23 void inversion_arr(struct Arr *pArr); //倒置
 24 
 25 int main(){
 26     struct Arr arr;//仅仅是用struct Arr数据类型定义了一个arr变量,并未初始化
 27     int val;
 28     
 29     init_arr(&arr,6);//不能直接传结构体变量,传实参(结构体变量)给形参赋值,没有联系!
 30     show_arr(&arr);//此处可以直接传变量
 31     append_arr(&arr,1);
 32     insert_arr(&arr,1,99);
 33     delete_arr(&arr,1,&val);
 34     return 0;
 35 }
 36 
 37 void init_arr(struct Arr *pArr,int length){
 38     pArr->pBase = (int *)malloc"(sizeof(int)*length);//sizeof(int)*length表示内存大小
 39     if (pArr->pBase == NULL){ //检测分配内存是否成功
 40         printf("动态内存分配失败");
 41         exit(-1);//终止整个程序
 42     }
 43     else{
 44         pArr -> len = length;
 45         pArr -> cnt = 0;
 46     }
 47     return;//函数终止
 48 }
 49 
 50 bool is_empty(struct Arr *pArr){
 51     if(pArr->cnt == 0){
 52         return true;
 53     }
 54     else{
 55         return false;
 56     }
 57 }
 58 
 59 bool is_full(struct Arr *pArr){
 60     if(pArr->cnt == pArr->len){
 61         return true;
 62     }
 63     else{
 64         return false;
 65     }
 66 }
 67 
 68 void show_arr(struct Arr *pArr){
 69     if(is_empty(pAarr)){//此处不能传&pArr,因为pArr已经接收了结构体变量的地址
 70         printf("数组为空");
 71     }
 72     else{ //输出数组有效内容
 73         for(int i =0;i < pArr->cnt; i++){
 74             printf("%d ", pArr->pBase[i]);
 75         }
 76     }
 77 }
 78 
 79 bool append_arr(struct Arr *pArr,int val){
 80     if(is_full(pArr)){
 81         return false;//数组满时返回false
 82     }
 83     else{//不满时追加
 84         pArr->pBase[pArr->cnt] = val;//追加元素的下标就是pArr->cnt,数组目前的有效长度
 85         (pArr->cnt)++;//添加了一个元素,所以有效长度加一
 86         return true;
 87     }
 88 }
 89 
 90 bool insert_arr(struct Arr *pArr,int pos,int val){
 91     int i;
 92     if(is_full(pArr)){
 93         return false;
 94     }
 95     
 96     if(pos<1 || pos > pArr->cnt+1 ){ 
 97         return false;
 98     }
 99     
100     for(i = pArr->cnt-1;i>=pos-1;i--){
101         pArr->pBase[i+1] = pArr->pBase[i];
102     }
103     pArr->pBase[pos-1] = val;
104     (pArr->cnt)++;//插入一位元素后,有效长度加一
105     return true;
106 }
107 
108 bool delete_arr(struct Arr *pArr,int pos,int *pVal){
109        int i;
110      if(is_empty(pArr)){
111         return false;
112     }
113     if(pos<1 || pos > pArr->cnt){
114         return false;
115     }
116     *pVal=pArr->pBase[pos-1];//等待被删除的元素赋值给形参对应的主函数中的val
117     for(i=pos;i< pAr->cnt;i++){
118         pArr->pBase[i-1] = pArr->pBase[i];
119     }
120     (pArr->cnt)--;
121 }
122 
123 void inversion_arr(struct Arr *pArr){
124     int i =0;//第一个元素
125     int j = pArr->cnt-1;//最后一个元素
126     int t;
127     while(i<j){//无论元素个数的奇偶,此算法都可以搞定!
128         t = pArr->pBase[i];
129         pArr->pBase[i]=pArr->pBase[j];
130         pArr->pBase[j] = t;
131         i++;
132         j--;
133     }
134 }
135 
136 void sort_arr(struct Arr *pArr){
137     int i,j,t;
138     for(i=0;i < pArr->cnt;i++){   //冒泡排序优化算法,最多进行(pArr->cnt)-1轮比较
139         for(j=i+1;j<pArr->cnt;j++){ //若j=0,那么条件就是j < pArr->cnt-i-1
140             if(pArr->pBase[i]>pArr->pBase[j]){
141                  t = pArr->pBase[i];
142                  pArr->pBase[i]=pArr->pBase[j];
143                  pArr->pBase[j] = t;
144             }
145         }
146     }
147 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flash/Flex学习笔记(40):弹性运动续--弹簧
上一篇里演示的弹性运动加上摩擦力因素后,物体最终基本上都会比较准确的停在目标位置。但是我们回想一下现实世界中的弹簧,如果把弹簧的一头固定起来(即相当于目标点),而另一端栓一个球,把球拉开或压缩一定距离然后松手,事实上小球永远也不可能到达弹簧固定的那一端(因为弹簧即使压缩到最紧,也总有一定的长度) 所以如果要在Flash里模拟现实中的弹簧,真正的目标点绝不是弹簧的端点,而是目标点再偏移一段距离(即弹簧自然伸展时的长度) var ball:Ball = new Ball(6); addChild(ball);
菩提树下的杨过
2018/01/23
9270
Flash/Flex学习笔记(40):弹性运动续--弹簧
Flash/Flex学习笔记(25):摩擦力与屏幕环绕
摩擦力: 假如一个物体在某个方向上沿直线运行,摩擦力会使该方向上的速度越来越小,直到停止。 上图示意了该过程,物体以moveAngle角度正向运动,最终的速度speed矢量为vx矢量与vy矢量的矢量
菩提树下的杨过
2018/01/19
5410
Flash/Flex学习笔记(25):摩擦力与屏幕环绕
Flash/Flex学习笔记(57):实用技巧
布朗运动: varnumDots:uint=50; varfriction:Number=0.9; vardots:Array; varlife:uint=0; functioninit(){ graphics.lineStyle(0,0xffffff,.5); dots=newArray(); for(vari:uint=0;i<numDots;i++){ vardot:Ball=newBall(2,0x00ff00); dot.x=Math.random()*stage.stageWid
菩提树下的杨过
2018/01/22
7670
Flash/Flex学习笔记(57):实用技巧
Flash/Flex学习笔记(49):3D基础
之前我们所做的动画都是基于x,y二维坐标轴的,在三维动画中我们还需要增加一个垂直于屏幕“向里”或“向外”的Z轴,那么z轴到底是应该向外,还是向里呢?这个其实无所谓,不过为了统一,习惯上通常把z轴约定为
菩提树下的杨过
2018/01/22
9470
Flash/Flex学习笔记(49):3D基础
Flash/Flex学习笔记(39):弹性运动
动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运动或弹簧(胡克定律F=Kx)振动 先看下面的模拟演示: 规律: 小球先从出发点(初始为最左侧)向目标点(中心点)加速狂奔,奔的过程中速度越来越大,但加速度越来越小,等经过目标点时,发现速度太大刹不住车(此时速度达到最大值,但加速度减为0),奔过头了!于是加速度发生逆转,从0开始变为负值,从而导致速度越来越小,等速度减到0时,也奔到了最右侧(此时负加速度也达到最大值),然后在负加速度的影响下,开始掉头又狂奔....这样不断下去,直接摩擦力让它筋疲力尽,
菩提树下的杨过
2018/01/19
6490
Flash/Flex学习笔记(23):运动学原理
先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class Ball extends Sprite{ private var radius:Number ;//半径 private var color:uint;//颜色 public function Ball(r:Number=50,c:uint=0xff0000){ this.radius = r; this.color
菩提树下的杨过
2018/01/19
7890
Flash/Flex学习笔记(47):反向运动学(上)
先回顾上篇所说的"正向运动学":以人行走的例子来说,基本上可以理解为大腿驱动小腿,小腿驱动脚,从而引发的一系列姿态调整和运动。再举一个例子,我们用着拿一根软鞭或链条的一端挥舞,被手挥舞的这一端会把"能量"向另一端传递(即固定端驱动紧接的部分,而紧接的部分又驱动下一段紧接的部分),从而使整个系统也随之运动. 而"反向运动学"正好相反,举个不恰当的例子,小时候估计很多人玩过“死”青蛙(之所以要说是死的,是为了排除活体的自主运动),用手去拖死青蛙的脚(即自由端),会发现拉脚的同时,也带动青蛙的大腿在拖动,进而拖动
菩提树下的杨过
2018/01/23
6440
Flash/Flex学习笔记(47):反向运动学(上)
Flash/Flex学习笔记(38):缓动动画
缓动 与 匀变速 看上去很类似,但其实有区别: 匀变速的公式为 V = V0 + at --速度v与时间t是线性(正比)关系,而且这种运动不需要确定目标点,速度可以按照这种规律一直变下去 而缓动指的是物体越接近目标时速度越慢,速度跟距离成反比关系,用公式描述为 V = k S  (0<k<1),这种运动需要先确定一个目标点,比如车辆定点停车:先指定一个位置,然后汽车从远处开过来,快到停车点时,逐渐慢下来,直到准确停在指定位置。 先看个演示: 代码: package { import flash.displ
菩提树下的杨过
2018/01/23
5930
Flash/Flex学习笔记(41):碰撞检测
碰撞检测基本上可能分为二类:对象与对象的碰撞检测、对象与点的碰撞检测 为了方便测试,先写一个box类(生成一个小矩形) package { import flash.display.Sprite; public class Box extends Sprite { private var w:Number; private var h:Number; private var color:uint; public var vx:Number=0; public var v
菩提树下的杨过
2018/01/19
9630
Flash/Flex学习笔记(41):碰撞检测
Flash/Flex学习笔记(24):粒子效果
粒子爆炸: 仍然要用到以前的小球类,不过稍加改造 package { import flash.display.Sprite; //小球 类 public class Ball extends Sprite { public var radius:uint;//半径 public var color:uint;//颜色 public var vx:Number=0;//x轴速度 public var vy:Number=0;//y轴速度 public function Bal
菩提树下的杨过
2018/01/23
6740
Flash/Flex学习笔记(44):万有引力与粒子系统
万有引用公式: 其中G为万有引力常数 var numParticles:uint=50;//粒子总数 var G:Number=0.03;//万有引力常数 var particles:Array=ne
菩提树下的杨过
2018/01/19
7970
Flash/Flex学习笔记(44):万有引力与粒子系统
Flash/Flex学习笔记(43):动量守恒与能量守恒
动能公式: 动量公式: 动量守恒: 能量守恒: 根据这些规律可以得到下列方程组: 解该方程组,得到下面的公式: 把这二个公式相减,可以得到: 即: 我们也经常利用这个公式简化运算 基本的动量守恒演示
菩提树下的杨过
2018/01/22
4970
Flash/Flex学习笔记(43):动量守恒与能量守恒
Flash/Flex学习笔记(18):画线及三角函数的基本使用
Sprite有一个graphics可以用来绘制基本图形,比如我们要画下面这个图形: 对应的AS3代码为: package { import flash.display.Sprite; publ
菩提树下的杨过
2018/01/23
6640
Flash/Flex学习笔记(18):画线及三角函数的基本使用
“AS3.0高级动画编程”学习:第一章高级碰撞检测
AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了,打算下一阶段开始啃这本书。 今天开始学习高级碰撞检测,所用到的预备知识: 1、BitmapData的透明与不透明区别 位图数据(BitmapData)有二种模式,一种支持透明(即每个像素的值采用AARRGGBB这种32位颜色表示);另一种不支持透明度(即传统的RRGGBB这种24位颜色表示,简单点讲就是alpha分量默认为FF,
菩提树下的杨过
2018/01/19
1.5K0
Flash/Flex学习笔记(50):3D线条与填充
3D线条:把上一篇中的3D坐标旋转示例稍做修改,用线把各个小球连接起来即可。 var balls:Array; var numBalls:uint=30; var fl:Number=250; var vpx:Number=stage.stageWidth/2; var vpy:Number=stage.stageHeight/2; function init():void { balls=new Array(numBalls); for (var i:uint=0; i<numBalls; i++
菩提树下的杨过
2018/01/22
1.4K0
Flash/Flex学习笔记(50):3D线条与填充
Flash/Flex学习笔记(31):对象拖拽与投掷
对象拖拽: 这其实就是以前所学知识:Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) + Flash/Flex学习笔记(23):运动学原理 的综合运用,要提一下的是下面代码中对于EnterFrame的添加与移除操作 package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.eve
菩提树下的杨过
2018/01/23
6780
关于坐标旋转
在看<Flash actionscript动画教程>(中文版)的第十章的第二节,它提到“高级坐标旋转”,书中只给出了一个基本公式:
meteoric
2018/11/16
8570
AS3 斜坡角度反弹【算法】
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
py3study
2020/01/07
5060
Canvas系列(14):实战-小球碰撞
两小球碰撞是Canvas非常经典的案例,他是一个很简单的需求,但做起来却非常复杂。
kai666666
2020/10/19
1.8K0
Canvas系列(14):实战-小球碰撞
Flash/Flex学习笔记(48):反向运动学(下)
先要复习一下三角函数与余弦定理: 对于直角三角形,三边长a,b,c与三个角A,B,C的关系如下: 正弦函数: 余弦函数: 正切函数: 反正切函数:(好象现在的教科书里改叫“余切”函数)   或 勾股
菩提树下的杨过
2018/01/23
5770
Flash/Flex学习笔记(48):反向运动学(下)
推荐阅读
相关推荐
Flash/Flex学习笔记(40):弹性运动续--弹簧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验