数据结构之---C语言实现数组的顺序存储表示(可运行)

//数组的顺序存储表示
//杨鑫
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#define OK  1
#define ERROR 0
#define UNDERFLOW 2
#define MAX_ARRAY_DIM 8
typedef int Status;
typedef int ElemType;
typedef struct {
    ElemType  *base;   				//数组的实体
    int       dim;     				//数组维数
    int       *bounds;				//根据下文bound应该是bounds,数组各维的长度
    int       *constants;			//数组映像函数常量的基址
}Array;

//数组初始化
Status InitArray(Array *A, int dim,...)
{

    int elemtotal=1,i;
    va_list ap;
    if (dim < 1 || dim > MAX_ARRAY_DIM)
			return ERROR;
    A->dim = dim;
    A->bounds = (int*)malloc(dim*sizeof(int));
    if(!A->bounds)
			return ERROR;
    va_start(ap,dim);
    for(i=0;i<dim;i++)
	{
        A->bounds[i] = va_arg(ap,int);
        if(A->bounds[i]<0)
				return UNDERFLOW;
        elemtotal*=A->bounds[i];
    }
    va_end(ap);
	A->base = (ElemType*)malloc(elemtotal*sizeof(ElemType));
    if(!A->base)
			return ERROR;
    A->constants=(int*)malloc(dim*sizeof(int));
    if(!A->constants)
			return ERROR;
    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;
}

//数组的销毁
Status DestroyArray(Array *A)
{
    free(A->base);
    free(A->bounds);
    free(A->constants);
    return OK;
}

//找到A的地址
Status Locate(Array A,va_list ap,int *off)
{

    int ind, i;

    *off=0;
    for(i=0;i<A.dim;++i){
        ind=va_arg(ap,int);
        if(ind<0||ind>=A.bounds[i])
				return ERROR;
        *off+=A.constants[i]*ind;
    }
    return  OK;
}

//赋值把值赋值给数组A
Status Assign(Array *A,ElemType e,...)
{
    va_list ap;
    Status result;
    int i,j,k;
    int off;
    va_start(ap,e);
    if((result=Locate(*A,ap,&off))<0)
			return result;
    *(A->base+off)=e;
    va_end(ap);
    return OK;
}

//把值赋值给数组A中指定的元素e
Status Value(Array A,ElemType *e,...)
{
    int off;
    Status result;
    va_list ap;
    va_start(ap,e);
	if ((result=Locate(A,ap,&off))<0)
			return result;
	*e=*(A.base+off);
 	va_start(ap,e);
	return OK;
}

int main()
{
 int i,j,k;
 Array A;
 ElemType e;
 A.dim=3;
 InitArray(&A,A.dim,2,2,2);
 printf("这是一个 %d 维的数组!\n",A.dim);
 printf("数组每个维度的大小:\n");
 for (i=0;i<A.dim;i++)
		 printf("第 %d 个维度大小为: %5d\n",i + 1, A.bounds[i]);
 printf("函数常量的基址:\n");
 for (i=0;i<A.dim;i++)
		 printf("第 %d 个基址 : %5d\n",i + 1,A.constants[i]);
 printf("\n输入任意值继续程序!\n");
 getchar();
 printf("随机生成一组数据:\n");
 srand(time(0));
 for (i=0;i<A.bounds[0];i++)
   for (j=0;j<A.bounds[1];j++)
      for(k=0;k<A.bounds[2];k++)
        Assign(&A,rand()%100,i,j,k);
 printf("数组A的成员是::\n");
 for (i=0;i<A.bounds[0];i++)
  {
     for (j=0;j<A.bounds[1];j++)
      {
			printf("(");
        	for (k=0;k<A.bounds[2];k++)
          	 {
					 Value(A,&e,i,j,k);
           			printf(" %5d ", e);
           	}
       		 printf(")  ");
       	}
     		printf("\n");
   }
 printf("与之等效的一维数组是:\n");
 for (i=0; i<A.bounds[0]*A.bounds[1]*A.bounds[2]; i++)
		 printf("%5d",A.base[i]);
 printf("\n");
 DestroyArray(&A);
 getchar();
 return 0;
}

如图:

时间: 2024-08-15 00:52:26

数据结构之---C语言实现数组的顺序存储表示(可运行)的相关文章

数据结构之---C语言实现二叉树的顺序存储

//二叉树的顺序存储 //这里利用循环队列存储数据 //杨鑫 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1) #define MAX_TREE_SIZE 100 // 二叉树的最大结点数 #define ClearBiTree InitBiTree // 在顺序

数据结构之---C语言实现队列的顺序存储

//C语言串的顺序存储表示 //串的堆分配存储表示 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSTRLEN 255 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //定义数据元素结的构 typedef int

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

数据结构基础(1)--数组C语言实现--动态内存分配

数据结构基础(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--)

数据结构(c语言描述)

数据结构(c语言描述) 目录 预备的数学知识 什么是数据结构 线性表 栈和队列 数组 串 树和二叉树 查找 排序 预备的数学知识 等差数列求和 Sn=(a1+an)*n/2 等比数列求和 Sn=a1*(1-q?)/(1-q) 什么是数据结构 基本概念 数据: 能够被计算机识别和处理的符号的集合 数据元素:是数据的基本单位,由若干的数据项构成,如一个人有手有脚 数据对象:由同类型的数据元素组成的集合,如一群人 数据类型:由一个集合和定义在此集合上的操作组成 原子类型:值不可再分的数据类型,如int

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 46 9 10 #ifndef _3_1_H_ 11 #define _3_1_H_ 12

C语言关于数组与指针内容小结

数组的基本概念 什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式]: 其中,类型说明符是任一种基本数据类型或构造数据类型.数组名是用户定义的数组标识符.方括号中的常量表达式表示数据元素的个数,也称为数组的长度.例如: int a[10]; /* 说明整型数组a,有10个元素 */ float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */ char ch[20]; /* 说明字符数组ch,有20个元

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio