加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_马鞍山站长网 (https://www.0555zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

数组的排序存储 C语言版

发布时间:2022-07-09 11:15:54 所属栏目:编程 来源:互联网
导读:数组作为一种线性存储结构,对存储的数据通常只做查找和修改操作,因此数组结构的实现使用的是顺序存储结构。 要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。 通过以上内容,我们掌握了将多维数组存储在一维内存空间的方法。那么,后
  数组作为一种线性存储结构,对存储的数据通常只做查找和修改操作,因此数组结构的实现使用的是顺序存储结构。
  要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。
 
  通过以上内容,我们掌握了将多维数组存储在一维内存空间的方法。那么,后期如何对指定的数据进行查找和修改操作呢?
  多维数组查找指定元素
  当需要在顺序存储的多维数组中查找某个指定元素时,需知道以下信息:
  多维数组的存储方式;
  多维数组在内存中存放的起始地址;
  该指定元素在原多维数组的坐标(比如说,二维数组中是通过行标和列标来表明数据元素的具体位置的);
  数组中数组的具体类型,即数组中单个数据元素所占内存的大小,通常用字母 L 表示;
 
  根据存储方式的不同,查找目标元素的方式也不同。如果二维数组采用以行序为主的方式,则在二维数组 anm 中查找 aij 存放位置的公式为:
  LOC(i,j) = LOC(0,0) + (i*m + j) * L;
 
  其中,LOC(i,j) 为 aij 在内存中的地址,LOC(0,0) 为二维数组在内存中存放的起始位置(也就是 a00 的位置)。
 
  而如果采用以列存储的方式,在 anm 中查找 aij 的方式为:
  LOC(i,j) = LOC(0,0) + (i*n + j) * L;
 
  以下给出了采用以行序为主的方式存储三维数组 a[3][4][2] 的 C 语言代码实现,这里不再对该代码进行分析(代码中有详细注释),有兴趣的读者可以自行拷贝运行:
  #include<stdarg.h>
  #include<malloc.h>
  #include<stdio.h>
  #include<stdlib.h> // atoi()
  #include<io.h> // eof()
  #include<math.h>
  #define TRUE 1
  #define FALSE 0
  #define OK 1
  #define ERROR 0
  #define INFEASIBLE -1
  #define OVERFLOW 3
  #define UNDERFLOW 4
  typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等
  typedef int Boolean; //Boolean是布尔类型,其值是TRUE或FALSE
  typedef int ElemType;
  #define MAX_ARRAY_DIM 8 //假设数组维数的最大值为8
  typedef struct
  {
      ElemType *base; //数组元素基址,由InitArray分配
      int dim; //数组维数
      int *bounds; //数组维界基址,由InitArray分配
      int *constants; // 数组映象函数常量基址,由InitArray分配
  } Array;
  Status InitArray(Array *A,int dim,...)
  {
 
      //销毁数组A
      if((*A).base)
      {
          free((*A).base);
          (*A).base=NULL;
      }
      else
          return ERROR;
      if((*A).bounds)
      {
          free((*A).bounds);
          (*A).bounds=NULL;
      }
      else
          return ERROR;
      if((*A).constants)
      {
          free((*A).constants);
          (*A).constants=NULL;
      }
      else
          return ERROR;
      return OK;
  }
  Status Locate(Array A,va_list ap,int *off) // Value()、Assign()调用此函数 */
  {
 
      Array A;
      int i,j,k,*p,dim=3,bound1=3,bound2=4,bound3=2; //a[3][4][2]数组
      ElemType e,*p1;
      InitArray(&A,dim,bound1,bound2,bound3); //构造3*4*2的3维数组A
      p=A.bounds;
      printf("A.bounds=");
      for(i=0; i<dim; i++) //顺序输出A.bounds
          printf("%d ",*(p+i));
      p=A.constants;
      printf("nA.constants=");
      for(i=0; i<dim; i++) //顺序输出A.constants
          printf("%d ",*(p+i));
      printf("n%d页%d行%d列矩阵元素如下:n",bound1,bound2,bound3);
      for(i=0; i<bound1; i++)
      {
          for(j=0; j<bound2; j++)
          {
              for(k=0; k<bound3; k++)
              {
                  Assign(&A,i*100+j*10+k,i,j,k); // 将i*100+j*10+k赋值给A[i][j][k]
                  Value(&e,A,i,j,k); //将A[i][j][k]的值赋给e
                  printf("A[%d][%d][%d]=%2d ",i,j,k,e); //输出A[i][j][k]
   
  A.base=
     0   1  10  11  20  21  30  31
  100 101 110 111 120 121 130 131
  200 201 210 211 220 221 230 231

(编辑:网站开发网_马鞍山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!