⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.c

📁 这是我的一些数据结构(C语言)源代码 比如LinkList
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define MAX_ARRAY_DIM   8 //假设数组维数的最大值为8 
typedef enum {ERROR = -2,OVERLOW,FALSE, TRUE, OK} Status;
typedef int ElemType;
typedef struct{
    ElemType* base;       //数组元素基址,由InitArray分配 
    int     dim;          //数组维数 
    int*    bounds;       //数组维界基址,由InitArray分配 
    int*    constants;    //数组映像函数常量基址,由InitArray分配 
}Array;

Status InitArray(Array* A, int dim,...) {
    //若维数dim和各维长度合法,则构造相应的数组A,并返回OK 
    if(dim<1 || dim>MAX_ARRAY_DIM) return ERROR;
    A->dim = dim;
    A->bounds = (int*) malloc(dim*sizeof(int));
    if(!A->bounds) exit(OVERLOW);
    //若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal 
    int elemtotal = 1;
    int i;
    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 OVERLOW;
        elemtotal *= A->bounds[i];
    }
    va_end(ap);
    
    A->base = (ElemType*) malloc(elemtotal * sizeof(ElemType));
    if(!A->base) exit(OVERLOW);
    
    A->constants = (int*) malloc(dim*sizeof(int));
    if(!A->constants) exit(OVERLOW);
    
    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) {
    //销毁数组A 
    if(A->base) free(A->base);
    if(A->bounds) free(A->bounds);
    if(A->constants) free(A->constants);
    return OK;
}

Status Locate(Array* A, va_list ap, int* off) {
    //若ap指示的各下标值合法,则求出该元素在A中相对地址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 OVERLOW;
        *off += A->constants[i] * ind;
    }
    return OK;
}                     
        
Status Value(Array* A, ElemType *e, ...) {
    //A是n维数组,e为元素变量,随后是n个下标值
    //若各下标不超界,则e赋值为所指定的A的元素值,并返回OK 
    va_list ap;
    int off;
    Status result;
    
    va_start(ap, e);
    if((result = Locate(A, ap, &off)) <= 0) return result;
    *e = *(A->base + off);
    return OK;
}

Status Assign(Array* A, ElemType e, ...) {
    //A是n维数组,e为元素变量,随后是n个下标值
    //若各下标不超界,则将e的值给所指定的A的元素值,并返回OK 
    va_list ap;
    int off;
    Status result;
    
    va_start(ap, e);
    if((result = Locate(A, ap, &off)) <= 0) return result;
    *(A->base + off) = e;
    return OK;
}    
    
int main()
{
    Array array1;
    int i, j, k=1;
    int m, n;
    ElemType e;
    
    printf("请输入数组的第1、2维的维数:"); 
    scanf("%d%d", &i, &j);
    printf("输出数组: \n"); 
    InitArray(&array1, 2, i, j);
    for(m = 0; m < i; ++m) 
        for(n = 0; n < j; ++n){
            Assign(&array1, k, m, n);
            Value(&array1, &e, m, n);
            printf("%d\t", e);
            if(k%8 == 0) printf("\n");
            ++k;
    }
    DestroyArray(&array1);
    
    system("pause");
    return 0;
}        
     
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -