07 数组的存储表示和实现

实验目的:

⑴ 熟悉数组的定义和基本操作

⑵ 掌握数组的顺序存储结构设计与基本操作的实现

⑶ 掌握稀疏矩阵的三元组顺序表存储结构设计与基本操作的实现

实验内容:

1、采用书上第 93 页定义的数组的顺序存储表示,编程实现数组的下列基本操作。

1)构造数组

2)销毁数组

3)取数组元素值

4)给数组元素赋值

2、采用书上第 98 页定义的稀疏矩阵的三元组顺序表存储表示,编程实现矩阵的转置运算算法和快速转置算法

程序清单:

第一题:

#include<malloc.h>

#include<stdio.h>

#include<process.h>

#include<math.h>

#include<stdarg.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define MAX_ARRAY_DIM 8

typedef int Status;

typedef int Boolean;

typedef int ElemType;

typedef struct {

    ElemType* base; //锟斤拷锟斤拷幕锟斤拷锟街?

    int dim;

    int* bounds; //锟斤拷维锟侥斤拷

    int* constants; //锟斤拷址锟斤拷锟斤拷锟斤拷系锟斤拷

}Array;

Status InitArray(Array* A, int dim, ...) {

    int elemtotal = 1;

    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)

         exit(OVERFLOW);

    va_start(ap, dim);

    for (int 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)

         exit(OVERFLOW);

    (*A).constants = (int*)malloc(dim * sizeof(int));

    if (!(*A).constants)

         exit(OVERFLOW);

    (*A).constants[dim - 1] = 1;

    for (int i = dim - 2; i >= 0; --i)

         (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1];

    return OK;

}

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;

}

Status Locate(Array A, va_list ap, int* off) {

    int ind;

    *off = 0;

    for (int 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;

}

Status Value(Array* A, ElemType* e, ...) {

    va_list ap;

    Status result;

    int off;

    va_start(ap, e);

    if ((result = Locate(*A, ap, &off)) == OVERFLOW)

         return result;

    *e = *((*A).base + off);

    return OK;

}

Status Assign(Array* A, ElemType e, ...) {

    va_list ap;

    Status result;

    int off;

    va_start(ap, e);

    if ((result = Locate(*A, ap, &off)) == OVERFLOW)

         return result;

    *((*A).base + off) = e;

    return OK;

}

int main() {

    Array A;

    ElemType e = 0;

    InitArray(&A, 3, 3, 3, 3);

    Assign(&A, 10, 0, 1, 2);

    if (Value(&A, &e, 0, 1, 2) == OK) printf("输出e的值: %d\n", e);

    if (DestroyArray(&A) == OK) printf("数组A销毁成功!");

}

第二题:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define MAXSIZE 12500

#define MU 5

#define NU 6

#define OK 1

typedef struct {

    int i, j;

    int e;

}Triple;

typedef struct {

    Triple data[MAXSIZE + 1];

    int mu, nu, tu;

}TSMatrix;

int CreateMatrix(TSMatrix& M) {//建立一个三元数组

    int e, i, j, k = 1;

    M.mu = MU;

    M.nu = NU;

    srand((unsigned)time(NULL));

    M.tu = rand() % 15;

    if (M.tu < 1) return 0;

    for (i = 1; i <= M.mu; i++)

         for (j = 1; j <= M.nu; j++)

         {

             e = rand() % 30;

             if (e != 0) {

                  M.data[k].i = i;

                  M.data[k].j = j;

                  M.data[k].e = e;

                  k++;

             }

             if (k - 1 == M.tu) return OK;

         }

    return OK;

}

void print(TSMatrix M) {//输出三元组表中元素值

    int k;

    printf("mu=%-2d, nu=%-2d, tu=%-2d", M.mu, M.nu, M.tu);

    printf("\n");

    for (k = 1; k <= M.tu; k++)

    {

         printf("i=%-2d, j=%-2d, e=%-2d", M.data[k].i, M.data[k].j, M.data[k].e);

         printf("\n");

    }

}

int TransposeSMatrix(TSMatrix M, TSMatrix& T) {

    int p, q = 1, col;

    T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;

    if (T.tu) {

         q = 1;

         for (col = 1; col <= M.nu; col++)

             for (p = 1; p <= M.tu; p++)

                  if (M.data[p].j == col)

                  {

                      T.data[q].i = M.data[p].j;

                      T.data[q].j = M.data[p].i;

                      T.data[q].e = M.data[p].e;

                      q++;

                  }

    }

    return OK;

}

int main() {

    TSMatrix M, T;

    CreateMatrix(M);

    TransposeSMatrix(M, T);

    printf("输出稀疏矩阵M:\n");

    print(M);

    printf("输出转置矩阵T:\n");

    print(T);

    return 0;

}

运行情况:

第一题:

第二题:

实验体会:

数组:按一定格式排列起来的,具有相同类型的数据元素的合集

一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组

一维数组的逻辑结构:线性结构。定长的线性表

声明格式:数据类型 变量名称【长度】 例如:int num[5]={0,1,2,3,4};

二维数组:若一维数组中的数据元素又是一维数组,则称为二维数组

二维数组的逻辑结构:

1.非线性结构:每一个元素既在一个行表中,又在一个列表中。

2.线性结构(定长的线性表):该线性表的每个元素数据也是一个定长的线性表

声明格式: 数据类型 变量名称[行数][列数];例如:int num[5][8];

Typedef elemtype array2[m][n];

等价于:

Typedef elemtype array1[n];

Typedef array1 array2[m];

三维数组:若二维数组中的元素又是一个一维数组,则称作三维数组。

结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展

数组特点:结构固定—定义好,维数和维界不再改变

数组的基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作

数组的抽象数据类型的定义

数据结构:R={ROW,COL}行和列

基本操作:

构造:InitArray(&A,bound1,…boundn)

销毁DestroyArray(&A)

取数组元素的值Value(A,&e,index1,…,indexn)

给数组元素赋值Assign (&A,&e,index1,…,indexn)

数组的顺序存储:

数组特点:结构固定—维数和维界不变

数组的基本操作:初始化、销毁、取元素、修改元素值、一般不做插入和删除处理

注意:数组可以多维的,但存储数据元素的内存单元地址是一维的。在存储数组之前,需要解决将多维关系映射到一维关系的问题

初始值 地址存放在a,每一个元素占L个空间

那第a[i]存放在a+i*L;

LOC(i):

LOC(i)=a; i=0

LOC(i)=a+i*L=LOC(i-1)+L; i>0;

两种顺序存储方式:

以行序为主序(低下标优先)和以列序为主序

数组一般只进行初始化、销毁、取元素、修改元素值,一般不做插入和删除处理。而通过这次实验对数组的存储方式有了更深刻的领悟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值