数据结构答案第6章多维数组和广义表 学习 指导资料

上传人:w****i 文档编号:92506240 上传时间:2019-07-10 格式:DOC 页数:8 大小:122KB
返回 下载 相关 举报
数据结构答案第6章多维数组和广义表 学习 指导资料_第1页
第1页 / 共8页
数据结构答案第6章多维数组和广义表 学习 指导资料_第2页
第2页 / 共8页
数据结构答案第6章多维数组和广义表 学习 指导资料_第3页
第3页 / 共8页
数据结构答案第6章多维数组和广义表 学习 指导资料_第4页
第4页 / 共8页
数据结构答案第6章多维数组和广义表 学习 指导资料_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《数据结构答案第6章多维数组和广义表 学习 指导资料》由会员分享,可在线阅读,更多相关《数据结构答案第6章多维数组和广义表 学习 指导资料(8页珍藏版)》请在金锄头文库上搜索。

1、第6章 多维数组和广义表6.1 知识点分析1多维数组概念多维数组是向量的推广,对于二维数组A mn既可以看成m行向量组成的向量,也可以看成n行向量组成的向量。多维数组在计算机中有两种存储形式:按行优先顺序存储和按列优先顺序存储。2多维数组的存储二维数组aij的地址为:LOC(aij) = LOC(a00) + ( in + j ) d (0下标起始的语言)三维数组aijk的地址为:LOC(aijk)=LOC(a000)+( (inp+ jp +k) d (0下标起始的语言)d为每个数据元素占有的字节数。3特殊矩阵在矩阵中非零元素或零元素的分布有一定规律的矩阵称为特殊矩阵,如三角矩阵、对称矩阵、

2、稀疏矩阵等。当矩阵的阶数很大时,用普通的二维数组存储这些特殊矩阵将会占用很多的存储单元。从节约存储空间的角度考虑,以下特殊矩阵的存储方法。(1)对称矩阵对称矩阵是一种特殊矩阵,n阶方阵的元素满足性质:aij=aji (0i , jn-1)。对称矩阵是关于主对角线的对称,因此只需存储上三角或下三角部分的数据即可。(2)三角矩阵三角矩阵的特殊性是以主对角线划分矩阵。下三角矩阵,主对角线以上均为同一个常数;上三角矩阵,主对角线以下均为同一个常数,可以采用压缩存储。(3)稀疏矩阵在m*n的矩阵中有t个非零元素,且t远小于mn,这样的矩阵称稀疏矩阵。为了节约存储空间,稀疏矩阵中零元素无需存储,只需存储矩

3、阵中的非零元素。稀疏矩阵常用的有:三元组表存储、带行指针的链表存储、十字链表存储等存储方法。4 广义表广义表是n(n0)个数据元素的有序序列,广义表的元素可以是单元素,也可以是一个广义表。由于广义表的元素有两种形式,所以其结点的存储形式也有两种:(1)表结点由标志域、表头指针域、表尾指针域组成。(2)原子结点由标志域和值域组成。5广义表与线性表的区别和联系线性表是具有相同类型的n个数据元素的有限序列,记为a1、a2、a3、an。广义表也是n个数据元素的有限序列,记为a1、a2、a3、an。线性表中的元素必须具有相同的类型,而广义表中的成员,既可以是单个元素(原子),也可以是一个广义表(子表)。

4、当广义表中的每一个ai元素都是数据元素,且具有相同类型时,则它就是一个线性表,因此可以说广义表是线性表的一种推广,或者说线性表是广义表的一个特例。6.2 典型习题分析【例1】 设二维数组A56的每个元素占4个字节,存储器按字节编址。已知A的起始地址为2000,计算:(1)数组的大小?(2)A的终端结点a45的存储地址?(3)按行优先顺序存储时,a25的存储地址?(4)按列优先顺序存储时,a25的存储地址?答:(1)数组的大小(即数组A共占多少字节):564=120B。(2)一个结点aij的存储地址是该结点所占用的存储空间的第1个字节的地址(即起始地址),它等于:基地址+排在aij之前的结点个数

5、每个结点所占用的字节数。a45的起始地址:LOC(a45)=2000+(46+5)4=2116(3)在按行优先顺序存储时,排在aij之前的结点的个数为:在前i行(即0i-1行)上共有in个结点,在第i行上aij之前有j个结点(0j-1列)。所以按行优先存储的地址计算公式为: LOC(aij)= LOC(a00)+(in+j)dLOC(a25)= 2000+(26+5)4=2068(4)在按列优先顺序存储时,排在aij之前的结点的个数为:在前j列(即0j-1列)上共有jm个结点,在第j列上aij之前有i个结点(0i-1行)。所以按列优先存储的地址计算公式为: LOC(aij)= LOC(a00)

6、+(jm+i)dLOC(a25)=2000+(55+2)4=2108【例2】 特殊矩阵和稀疏矩阵哪一种压缩存储后会失去随机存储功能?为什么?答: 对于像三角矩阵等特殊矩阵由于压缩存储时将其存储在一个线性数组向量中,矩阵元素aij的下标i,j与它在向量中的对应元素bk下标k有一对应关系,故不会失去随机存储功能。而像稀疏矩阵,其压缩存储的方式是将其非零元素存储在一个三元组中,以三元组数组ak形式存储,矩阵元素aij下标i,j与数组中对应元素ak行下标k无对应关系,故失去随机存储功能。【例3】 求矩阵的转置矩阵分析:对于一个mn的矩阵Amn,其转置矩阵是一个nm的矩阵Bnm,且Bij=Aji,0in

7、,0im。其函数如下:void trs(A,B)maxix A,B; int i,j; for (i=0;im;i+) for (j=0;jn;j+) Bji=Aij;【例4】求两个矩阵的乘分析:设两个矩阵相乘:C=AB,其中A是一个mn的矩阵,B是一个nk的矩阵,则C为一个mk的矩阵。其函数如下:void mut(C,A,B)maxix A,B,C; int i,j,k; for (i=0;im;i+) for (j=0;jk;j+) Cij=0; for (k=0;kn;k+)Cij=Cij+Aik*Bkj; 【例5】 若矩阵Amn中存在一个元素aij,满足aij是第i行最小的元素,且是第

8、j列最大的元素,则称aij是矩阵A的鞍点,请编写一个算法,找出矩阵A的所有鞍点。分析:找矩阵A的所有鞍点的基本思想是:先逐行找出本行值最小的元素,确定其所在的列,并在此列中选值最大的元素,若两者值相等,即选中一个鞍点。void Spoint(int *a,int m,int n) int i,j,k,c,max,min,r=0; for (i=0;im;i+) min=ai0; / 假设ai0为最小 c=0; for (j=1;jn;j+) / 本循环找出本行值最小的元素 if aijmin min=aij; c=j; / c记录最小值的列值 max=a0c; for (k=1;kmax) m

9、ax=akc; if (max=min) / max=min,即鞍点 printf(“ni=%d,j=%d,aij=%d”,i,j,max); r+; / r记录鞍点的个数 if (r=0) printf(“n no saddlepointer”); / 无鞍点【例6】试编写一个在以H为头的十字链表中查找数据为k的结点的算法。分析:每个非零元素作为一个结点,结点中除了表示非零元素所在的行(i)、列(j)、值(v)的三元组以外还有两个指针域,其结构如图6-1所示。其中:列指针域down用来指向本列中下一个非零元素;行指针域right用来指向本行中下一个非零元素。ijvdownright图6-1

10、十字链表的结点结构结点的结构定义如下:typedef struct node int row,col; / 定义行、列struct node *down ,*right; / 定义列指针、行指针union / 定义一个共用体 int v; / 定义值域struct node *next; / 表头结点使用的next域tag; int Searchmat(struct node *H, int k, int *rown, int *coln) struct node *p, *q; p=H-tag.next; while (p!=H) q=p-right; while (p!=q) if (q-

11、tag.v= =k) / 查找成功处理 *rown=q-row; *coln=q-col return 1; q=q-right;p=p-tag.next;return 0;main() / 主函数 struct node *H; int i,j,k; H=Createmat(); / 设创建十字链表的函数Createmat()已存在 printf(“输入要查找的值:”); scanf(“%d“, &k); / 输入要查找的值 if (Searchmat(H,k,&i,&j) / 调用查找函数 printf(“%d在第%d行第%d列n“,k,i,j); else printf(“查无此值!“)

12、;【例7】 已知广义表LS=(a,b,c),(d,e,f,g),写出用取表头(Head)和取表尾(Tail)函数驱除取出原子e的运算。分析:L1=Tail(LS)=((d,e,f,g))L2=Head(L1)= (d,e,f,g)L3=Tail(L2)=( e,f,g)L4=Head(L3)=e所以取出原子的运算是Head(Tail(Head(Tail(L2)=e【例8】画出广义表:A(a,B(b,d),C(e,B(b,d),L(A,f,g) 的图形表示。分析:在广义表中为了把单元素和表区分开来,一般用小写字母表示元素,用大写字母表示子表;在画图时用圆圈表示表,用方框表示元素,并用线段把表和它的元素连接起来,则可以得到如图6-2所示广义表的图形表示。abdfegACLB图6-2 广义表图形【例9】设广义表采用如下存储结构:表结点为:tag=1hptp元素结点为:tag=0data其C语言描述如下:typedef enumATOM,LIST Elemtag;typedef struct GLNode Elemtag tag; / 公共部分,用于区分原素和表 union

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号