数据结构之数组Array

数组Array

基本操作

Status InitArray(int dimm,...)//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK
Status DestroyArray()    //销毁数组A
Status Locate(va_list ap,int &off)    //若ap指示的各下标值合法,则求出该元素在A中相对地址off
Status Value(ElemType &e,...)    //A是n维数组,e为元素变量,随后是n个下标值。若各下表不越界,则e赋值为所指定的A的元素值,并返回OK。
Status Assign(ElemType e,...)    //A是n维数组,e为元素变量,随后是n各下表值。若各下标不越界,则将e的值付给所指定的A的元素,并返回OK。

几个小程序

  1 //
  2 //by coolxxx
  3 //#include<bits/stdc++.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<map>
  9 #include<stack>
 10 #include<queue>
 11 #include<set>
 12 #include<bitset>
 13 #include<memory.h>
 14 #include<time.h>
 15 #include<stdio.h>
 16 #include<stdlib.h>
 17 #include<string.h>
 18 //#include<stdbool.h>
 19 #include<math.h>
 20 #define min(a,b) ((a)<(b)?(a):(b))
 21 #define max(a,b) ((a)>(b)?(a):(b))
 22 #define abs(a) ((a)>0?(a):(-(a)))
 23 #define lowbit(a) (a&(-a))
 24 #define sqr(a) ((a)*(a))
 25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 26 #define mem(a,b) memset(a,b,sizeof(a))
 27 #define eps (1e-10)
 28 #define J 10000
 29 #define mod 1000000007
 30 #define MAX 0x7f7f7f7f
 31 #define PI 3.14159265358979323
 32 #pragma comment(linker,"/STACK:1024000000,1024000000")
 33 #define N 8
 34 const int OK=1;
 35 const int ERROR=0;
 36 const int INFEASIBLE=-1;
 37 typedef int Status;
 38 using namespace std;
 39 typedef long long LL;
 40 double anss;
 41 LL aans;
 42 int cas,cass;
 43 LL n,m,lll,ans;
 44
 45 typedef int ElemType;
 46 #include<stdarg.h>            //标准头文件,提供宏va_start、va_arg、va_end 用于存取变长参数表
 47 const int MAX_ARRAY_DIM=8;    //假设数组维数的最大值为8
 48 typedef struct
 49 {
 50     ElemType *base;            //数组元素基址,由InitArray分配
 51     int dim;                //数组维数
 52     int *bounds;            //数组维界基址,由InitArray分配
 53     int *constants;            //数组映像函数常量基址,由InitArray分配
 54     int elemtotal;
 55     Status InitArray(int dimm,...)//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK
 56     {
 57         int i;
 58         va_list ap;
 59         if(dimm<1 || dimm>MAX_ARRAY_DIM)return ERROR;
 60         dim=dimm;
 61         bounds=(int *)malloc(dim*sizeof(int));
 62         if(!bounds)exit(OVERFLOW);//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
 63         elemtotal=1;
 64         va_start(ap,dim);    //ap为va_list类型,是存放变长参量数表信息的数组
 65         for(i=0;i<dim;i++)
 66         {
 67             bounds[i]=va_arg(ap,int);
 68             if(bounds[i]<0)return UNDERFLOW;
 69             elemtotal*=bounds[i];
 70         }
 71         va_end(ap);
 72         base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
 73         if(!base)exit(OVERFLOW);
 74         constants=(int *)malloc(dim*sizeof(int));
 75         //求映像函数的常数ci,并存入A.constants[i-1],i=1,...,dim
 76         if(!constants)exit(OVERFLOW);
 77         constants[dim-1]=1;    //L=1,指针的增减以元素的大小为单位
 78         for(i=dim-2;i>=0;i--)
 79             constants[i]=bounds[i+1]*constants[i+1];
 80         return OK;
 81     }//InitArray
 82
 83     Status DestroyArray()    //销毁数组A
 84     {
 85         if(!base)return ERROR;
 86         free(base);base=NULL;
 87         if(!bounds)return ERROR;
 88         free(bounds);bounds=NULL;
 89         if(!constants)return ERROR;
 90         free(constants);constants=NULL;
 91         return OK;
 92     }//DestroyArray
 93
 94     Status Locate(va_list ap,int &off)    //若ap指示的各下标值合法,则求出该元素在A中相对地址off
 95     {
 96         int i,ind;
 97         off=0;
 98         for(i=0;i<dim;i++)
 99         {
100             ind=va_arg(ap,int);
101             if(ind<0 || ind>=bounds[i])return OVERFLOW;
102             off+=constants[i]*ind;
103         }
104         return OK;
105     }//Locate
106
107     Status Value(ElemType &e,...)    //A是n维数组,e为元素变量,随后是n个下标值。
108                                     //若各下表不越界,则e赋值为所指定的A的元素值,并返回OK。
109     {
110         va_list ap;
111         int result,off;
112         va_start(ap,e);
113         if((result=Locate(ap,off))<=0)return result;
114         e=*(base+off);
115         return OK;
116     }//Value
117
118     Status Assign(ElemType e,...)    //A是n维数组,e为元素变量,随后是n各下表值。
119                                     //若各下标不越界,则将e的值付给所指定的A的元素,并返回OK。
120     {
121         va_list ap;
122         int result,off;
123         va_start(ap,e);
124         if((result=Locate(ap,off))<=0)return result;
125         *(base+off)=e;
126         return OK;
127     }//Assign
128
129 }Array;
130 void ArrayCheck()
131 {
132     int i,j,k;
133     Array A;
134     ElemType e;
135     A.InitArray(3,2,3,2);
136     printf("维度:%d\n总元素个数:%d\n各维维界:",A.dim,A.elemtotal);
137     for(i=0;i<A.dim;i++)
138         printf("%d ",A.bounds[i]);
139     puts("");
140     for(i=0;i<A.bounds[0];i++)
141         for(j=0;j<A.bounds[1];j++)
142             for(k=0;k<A.bounds[2];k++)
143                 A.Assign(i*100+j*10+k+111,i,j,k);
144     for(i=0;i<A.bounds[0];i++,puts(""))
145         for(j=0;j<A.bounds[1];j++,puts(""))
146             for(k=0;k<A.bounds[2];k++)
147                 printf("%d ",(A.Value(e,i,j,k),e));
148     A.DestroyArray();
149     puts("");
150 }
151 /*
152 程序结果:
153 维度:3
154 总元素个数:12
155 各维维界:2 3 2
156 111 112
157 121 122
158 131 132
159
160 211 212
161 221 222
162 231 232
163 */
164 int main()
165 {
166     #ifndef ONLINE_JUDGEW
167 //    freopen("1.txt","r",stdin);
168     freopen("2.txt","w",stdout);
169     #endif
170     int i,j,k;
171     int x,y,z,xx,yy;
172 //    init();
173 //    for(scanf("%d",&cass);cass;cass--)
174 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
175 //    while(~scanf("%s",s))
176 //    while(~scanf("%d%d",&n,&m))
177     {
178         ArrayCheck();
179     }
180     return 0;
181 }
182 /*
183 //
184
185 //
186 */
时间: 2024-12-24 11:35:20

数据结构之数组Array的相关文章

表示集合的数据结构:数组(Array),对象(Object),Map和Set

Map和Set是ES6标准新增的数据类型 Map: 是一组键值对的结构,使用一个二维数组来初始化Map,例如: var m = new Map([['xiaohong',100],['xiaolan',99],['xiaoming',108]]); 或者直接初始化一个空Map: var m = new Map(); m.set('xiaoli',98); m.get('xiaoli'); // 98 m.delete('xiaoli');//删除xiaoli这个键值对 m.get('xiaoli

javascript数组array

注意:1.array的length不是只读的.可以从数组的末尾移出项或者向数组中添加新项.看下面例子: var colors = ["red","yellow","blue"];colors.length = 2;console.info(colors[2]);结果:undefined原因:将length属性设置为2会移出最后一项.如果将length设置大于数组长度,则新增的每一项都是undefined值. 利用length可以方便的在数组末尾添

js — 数组Array

目录 1. isArray 2. 转换方法 3. 分割字符串 join 4. 栈方法 5. 队列方法 6. 重排序方法 7. 操作方法 8. 位置方法 - 索引 9. 迭代方法 数组 array 解释器 遇到var声明的变量,会把var声明的变量提升到全局作用域下 1. isArray isArray() 判断当前数组是否为数组,返回值是true,则证明是数组 var arr = ['red','green','yellow']; console.log(Array.isArray(arr));

oracle 数组 array

一维数组示例如下: -- Created on 2014-5-15 by ADMINISTRATOR DECLARE TYPE Arr1 IS VARRAY(10) OF NUMBER; Tab_1 Arr1; TYPE Arr2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; Tab_2 Arr2; BEGIN -- Test statements here Tab_1 := Arr1(1, 3, 4, 6, 3, 2, 8, 5); FOR a IN

C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

 使用C++风格的数组,不需要管理内存. array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string>   //C++字符串 #include <stdlib.h> using  std::array; //静态数组,栈上 using std::vector; //动态

Scala 数组-Array

环境: CentOS 6.3 1. 定义且同时初始化数组 $ cat array.scala val numNames2 = Array.apply("France","US","china") println(numNames2(0)) [[email protected] scala]$ scala array.scala France Array.apply("France","US","c

元组Tuple、数组Array、映射Map

一.元组Tuple 元组Tuple是不同类型的值的聚集,元组的值将单个的值包含在圆括号中来构成,元组可以包含一个不同类型的元素 如 val riple = (100, "Scala" , "Spark")1.元组中可以包含不同类型的元素,如上,把鼠标放在riple上,IDE会自动推断出元组riple里面的3个元素类型分别是Int.String.String2.元组实例化后,和数组Array不同,数组Array的索引从0开始,而元组Tuple的索引从1开始.3.调用元

学习Swift -- 数组(Array) - 持续更新

集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方法 // 如果声明可变数组 就设置为变量 var someMutableArray = [Int]() // 声明了空数组 类型为Int // 相反声明不可变数组就设置为常量 let someArray = Array(count: 5, repeatedValue: 0.03) // 声明了一个不

C#中数组Array、ArrayList、泛型List&lt;T&gt;的比较

在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义. 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也非常简单. Array数组具体用法: using System; names