C语言数据结构之顺序数组的实现

C语言数据结构之顺序数组的实现

以下为展示顺序数组的示例:

1.用C语言实现的版本

#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<math.h> /* floor(),ceil(),abs() */
#include<stdlib.h> /*申请和释放内存*/
#include<stdarg.h> /*可变参数*/
#define OK 1 //成功标志
#define ERROR 0 //错误标志
#define MAX_ARRAY_DIM 8 //数组最大维数 

typedef int ElemType;
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef struct
{
  ElemType *base; /* 数组元素基址,由InitArray分配 */
  int dim; /* 数组维数 */
  intint *bounds; /* 数组维界基址,由InitArray分配 */
  intint *constants; /* 数组映象函数常量基数,相当于每一维度的权重值,由InitArray分配 */
}Array; 

/* 顺序存储数组的基本操作*/
Status InitArray(Array *A, int dim, ...)
{ /* 若维数dim和各维长度合法,则构造相应的数组A,并返回OK */
  int elemtotal = 1, i; /* elemtotal是元素总值 */
  if (dim<1 || dim>MAX_ARRAY_DIM) //判断数组维数
  {
    return ERROR;
  }
  (*A).dim = dim; /* 数组维数 */
  (*A).bounds = (intint *)malloc(dim*sizeof(int)); /* 数组维界基址 */
  if (!(*A).bounds)
  {
    exit(OVERFLOW);
  } 

  va_list ap;
  va_start(ap, dim);
  for (i = 0; i < dim; ++i)
  {
    (*A).bounds[i] = va_arg(ap, int);
    if ((*A).bounds[i] < 0)
    {
      return UNDERFLOW; /* 在math.h中定义为4 */
    }
    elemtotal *= (*A).bounds[i];
  }
  va_end(ap); 

  (*A).base = (ElemType *)malloc(elemtotal*sizeof(ElemType));
  if (!(*A).base)
  {
    exit(OVERFLOW);
  } 

  (*A).constants = (intint *)malloc(dim*sizeof(int));
  if (!(*A).constants)
  {
    exit(OVERFLOW);
  } 

  (*A).constants[dim - 1] = 1;
  for (i = dim - 2; i >= 0; --i)
  {
    (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1];
  } 

  return OK;
} 

/* 销毁数组A */
Status DestroyArray(Array *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;
} 

/* 若ap指示的各下标值合法,则求出该元素在A中的相对地址off */
/* Value()、Assign()调用此函数 */
Status Locate(Array A, va_list ap, intint *off)
{
  int i, ind;
  *off = 0;
  for (i = 0; i < A.dim; ++i)
  {
    ind = va_arg(ap, int);
    if (ind < 0 || ind >= A.bounds[i])
    {
      return OVERFLOW;
    }
    *off += A.constants[i] * ind;
  }
  return OK;
} 

/* ...依次为各维的下标值,若各下标合法,则e被赋值为A的相应的元素值 */
Status Value(ElemType *e, Array A, ...)
{
  va_list ap;
  Status result;
  int off;
  va_start(ap, A);
  if ((result = Locate(A, ap, &off)) == OVERFLOW) /* 调用Locate() */
  {
    return result;
  }
  *e = *(A.base + off);
  return OK;
} 

/* ...依次为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素 */
Status Assign(Array *A, ElemType e, ...)
{
  va_list ap;
  Status result;
  int off;
  va_start(ap, e);
  if ((result = Locate(*A, ap, &off)) == OVERFLOW) /* 调用Locate() */
  {
    return result;
  }
  *((*A).base + off) = e;
  return OK;
} 

void main()
{
  Array A;
  int i, j, k, *p, dim = 3, bound1 = 3, bound2 = 4, bound3 = 2; /* a[3][4][2]数组 */
  ElemType e, *p1; 

  /* 构造3*4*2的3维数组A */
  InitArray(&A, dim, bound1, bound2, bound3);  

  /* 顺序输出A.bounds */
  printf("输出数组各维度的值:\n ");
  p = A.bounds;
  for (i = 0; i < dim; ++i)
  {
    printf("A.bounds[%d] = %d\n ", i, *(p + i));
  }
  printf("\n"); 

  /* 顺序输出A.constants */
  printf("输出数组映像函数常量基数的值(相当于每一维度的权重值):\n ");
  p = A.constants;
  for (i = 0; i < dim; ++i)
  {
    printf("A.constants[%d] = %d\n ", i, *(p + i));
  }
  printf("\n\n"); 

  printf("%d页%d行%d列矩阵元素如下:\n", bound1, bound2, bound3);
  for (i = 0; i < bound1; ++i)
  {
    printf("第%d页:\n", 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] */
      }
      printf("\n");
    }
    printf("\n");
  } 

  p1 = A.base;
  printf("顺序输出Array的元素\n");
  for (i = 0; i < bound1*bound2*bound3; ++i) /* 顺序输出A.base */
  {
    printf("%4d", *(p1 + i));
    //输出换行
    if (i % (bound2*bound3) == (bound2*bound3 - 1))
    {
      printf("\n");
    }
  } 

  /* 销毁数组A */
  DestroyArray(&A);
}

运行结果如下图所示:

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 数据结构之数组翻转的实现方法

    数据结构之数组翻转的实现方法 以下为实现数组翻转的方法: 1.用c语言实现的版本 #include<stdio.h> #define M 20 void fun(int *x,int n) { int *i, *j, *p, m=n/2; i = x; j = x+n-1; p = x+m; for( ; i<p; ++i,--j) { int t = *i; *i = *j; *j = t; } } void main() { int i,a[M],n; printf("En

  • JavaScript数据结构之数组的表示方法示例

    本文实例讲述了JavaScript数据结构之数组的表示方法.分享给大家供大家参考,具体如下: 数组类似于线性表.基本上每种语言都会讲数组作为固有类型.这里主要讲一下二维数组.我们可以把二维数组看成这样一个定长线性表:它的每个数据元素也是一个定长的线性表.数组一旦被定义,它的维数和维界就不再改变.因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作(这里注意和JavaScript中的array类型做出区分,这里说的是数据结构,而不是某一种单独语言的语法). 由于数组一般不作插入或者

  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 线性表的数组实现,实现几个核心的功能,语言是C++,如果有更好的想法和意见,欢迎留言~~~ /* Author : Moyiii * 线性表的数组实现,仅作学习之用,当然如果 * 你想拿去用,随你好啦. */ #include<iostream> using namespace std; //顺序表 class SeqList { public: //构造函数,接受一个默认的列表大小 SeqList(int size = MAX_LIST_SIZE); //析

  • PHP中使用数组实现堆栈数据结构的代码

    在堆栈中,最后压入的数据(进栈),将会被最先弹出(出栈). 即在数据存储时采用"先进后出"的数据结构. PHP中,将数组当做一个栈,主要是使用array_push()和array_pop()两个系统函数来完成. 入栈主要是利用array_push()函数向第一个参数的数组尾部添加一个或多个元素,然后返回新数组的长度,示例如下: 复制代码 代码如下: <?php $zhan=array("WEB");//声明一个数组当做栈 array_push($zhan,&q

  • 数据结构之数组Array实例详解

    数据结构之数组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个下标值.

  • Java数组模拟优先级队列数据结构的实例

    优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先

  • C语言 数据结构之连续存储数组的算法

    数据结构之数组定义及基本操作 数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构.所谓的连续存储结构其实就是数组. 数组本质其实也是数据的一种存储方式,既然有了数据的存储,就会涉及到如何对数据进行寻址的问题.首先,先说一下在数组中数据是如何存储的,在内存中,数组中的数据是以一组连续的数据集合的形式存在于内存中.当我们访问存在于内存中的数组时,我们应该找到其在内存中的地址,当我们找到数据的地址后我们就可以找到对应的数据.了解了以上知识后,我们就可以进行数组的设计了(

  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 以下为展示顺序数组的示例: 1.用C语言实现的版本 #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<math.h> /* floor(),ceil(),abs() */ #include<stdlib.h> /*申请和释放内存*/ #include<stdarg.h> /*可变参数*/ #define OK 1 //成功标志 #define ERROR 0 //错误标志 #d

  • C语言数据结构之顺序表和单链表

    一.顺序表的创建.删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { int date[10]; int length; }; void InitList(sqlist& L) { for (int i = 0;i < 10;i++) { L.date[i] = 0; } L.length = 0; } void charu(sqlist& L) { for (int j =

  • C语言 数据结构之数组模拟实现顺序表流程详解

    目录 线性表和顺序表 线性表 顺序表 静态顺序表 动态顺序表 代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,这是我们广泛使用的数据结构. 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 常见的线性表:顺序表.链表.栈.队列.字符串- 顺序表 顺序表是用一段物理地址连

  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    目录 初始化 尾插 格局打开 尾删 初始化 在初步认识顺序表这一结构后,我们就可以继续深入探究这是我之前在.h文件中创建的结构体 typedef int type; typedef struct list { type* a; int size; int capacity; }st; 在处理顺序表结构时我们会用到的一些接口,处理其中的关系,其实本质上就是函数,这里我用复杂英文对应出来方便形成记忆. void init(st *s); //插入 void pushback( st* p, type

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • C语言数据结构深入探索顺序表

    目录 1.线性表 2.顺序表 2.1概念及结构 2.2 接口实现 2.2.1初始化 2.2.2 检查容量 2.2.3 顺序表打印 2.2.4 顺序表尾插 2.2.5 顺序表尾删 2.2.6 顺序表头插 2.2.7 顺序表头删 2.2.8 顺序表在pos位置插入x 2.2.9 顺序表删除pos位置的值 2.2.10 尾插.尾删.头插.头删的改进 2.2.11 顺序表查找 2.2.12 顺序表销毁 2.3 数组相关面试题 2.4 顺序表的问题及思考 1.线性表 线性表(linear list)是n个

  • C语言数据结构顺序表的进阶讲解

    目录 前言 一.顺序表的构造VS功能 1.顺序表的构造 2.接口实现(功能) 二.功能具体分析 1.初始化 2.销毁 3.检查size与capacity是否溢出 4.尾增功能(实现) 5.打印 三.实现具体功能代码页(SeqList.c) 四.总结 前言 在学习链表之前先掌握顺序表 什么是顺序表? 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储,在数组上完成数据的增删查改. 顺序表一般可分为: 1.静态顺序表:使用定长数组存储. 2.动态顺序表:使用动态开辟

  • C语言数据结构之中缀树转后缀树的实例

    C语言数据结构之中缀树转后缀树的实例 对于一个中缀表达式 a+b*c*(d-e/f) 转换成后缀是这样的形式 abc*def/-+ 后缀表达式是相当有用处的,转换成后缀表达式后求值会简单很多.那么该如何转换呢? 网上关于这方面的资料一搜一大把,每本数据结构的书中都会提及这个算法,在这个算法中,用到 栈 这个数据结构. 1,关键是比较运算符的优先级,谁的优先级高,谁就出现在前面上面的表达式中,有括号的时候括号优先级最高,*/次之,+-最后. 在上面的表达式中+的优先级不如*的高,因此,在后缀表达式

随机推荐