实验目的: ⑴ 熟悉数组的定义和基本操作 ⑵ 掌握数组的顺序存储结构设计与基本操作的实现 ⑶ 掌握稀疏矩阵的三元组顺序表存储结构设计与基本操作的实现 实验内容: 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; 两种顺序存储方式: 以行序为主序(低下标优先)和以列序为主序 数组一般只进行初始化、销毁、取元素、修改元素值,一般不做插入和删除处理。而通过这次实验对数组的存储方式有了更深刻的领悟。 |
07 数组的存储表示和实现
最新推荐文章于 2024-07-24 14:54:00 发布