电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

第5章数组与广义表习题练习答案


发布日期:2020/4/22
 

请按行及按列优先顺序列出四维数组A***的所有元素在内存中的存储次序开始结点为a

按行优先的顺序排列时先变化右边的下标也就是右到左依次变化这个四维数组的排列是这样的(将这个排列分行写出以便与阅读只要按从左到右的顺序存放就是在内存中的排列位置)

aaa

aaa

aaa

aaa

aaa

aaa

aaa

aaa

aaa

aaa

aaa

aa a

按列优先的顺序排列恰恰相反变化最快的是左边的下标然后向右变化所以这个四维数组的排列将是这样的(这里为了便于阅读也将其书写为分行形式)

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

a a

给出C语言的三维数组地址计算公式

因为C语言的数组下标下界是所以

Loc(Amnp)=Loc(A)+((i*n*p)+k)*d

其中 Amnp表示三维数组Loc(A)表示数组起始位置ijk表示当前元素的下标d表示每个元素所占单元数

设有三对角矩阵 An*n将其三条对角线上的元素逐行地存储到向量B[n]中使得B[k]=aij

()用i j 表示k的下标变换公式

()用 k 表示 ij 的下标变换公式

() 解

要求ij 到k 的下标变换公式就是要知道在k之前已有几个非零元素这些非零元素的个数就是k的值一个元素所在行为i所在列为j则在其前面已有的非零元素个数为

(i*)+j(i+)

其中 (i*)是这个元素前面所有行的非零元素个数j(i+)是它所在列前面的非零元素个数

化简可得

k=i+j; // c下标是从开始的

() 解

因为K和ij是一一对应的关系因此这也不难算出

i=(k+)/ //k+表示当前元素前有几个非零元素整除就得到行号

j=(k+)%+(k+)/ //k+除以的余数就是表示当前行中第几个非零元素

//加上前面的元素所点列数就是当前列号

设二维数组A*的每个元素占个字节已知Loc(a)=A共占多少个字节? A的终端结点a的起始地位为何?按行和按列优先存储时a的起始地址分别为何?

()因含*=个元素因此A共占*=个字节

()a的起始地址为

Loc(a)=Loc(a)+(i*n+j)*d=+(*+)*=

()按行优先顺序排列时

a=+(*+)*=

()按列优先顺序排列时(二维数组可用行列下标互换来计算)

a=+(*+)*=

特殊矩阵和稀疏矩阵哪一种压缩存储后会失去随机存取的功能?为什么?

后者在采用压缩存储后将会失去随机存储的功能因为在这种矩阵中非零元素的分布是没有规律的为了压缩存储就将每一个非零元素的值和它所在的行列号做为一个结点存放在一起这样的结点组成的线性表中叫三元组表它已不是简单的向量所以无法用下标直接存取矩阵中的元素

简述广义表和线性表的区别与联系

:

广义表是线性表的推广线性表是广义表的特例当广义表中的元素都是原子时即为线性表

画出下列广义表的图形表示

() A(aB(bd)C(eB(bd)L(fg))) () A(aB(bA))

:

()这是一个再入表()则是一个递归表

设广义表L=(()())试问head(L)tail(L)L的长度深度各为多少?

●head(L)=()

●tail(L)=(())

●L的长度为

●L的深度为

求下列广义表运算的结果

()head ((phw)); ()tail((bkph)); () head (((ab)(cd)));

()tail(((ab)(cd))); ()head(tail(((ab)(cd))));

()tailhead)(((ab)(cd))))

()head ((phw))=p;

()tail((bkph))=(kph);

()head (((ab)(cd)))=(ab);

()tail(((ab)(cd)))=((cd));

()head(tail(((ab)(cd))))=(cd);

()tail(head(((ab)(cd))))=(b)

当三角矩阵采用题所述的压缩存储时写一算法求三对角矩阵在这种压缩存储表示下的转置矩阵

转置矩阵就是将矩阵元素的行号与列号互换根据已知的三对角矩阵的特点其转置矩阵对角线元素不变非零的非对角线元素aij与aji互换位置又知元素的下标和存放一维数组空间位置的关系k=i+j我们可以设计出这个矩阵的转置算法

#define N //矩阵行列数

#define Length (*N)//压缩矩阵的长度

typedef struct{

int data[Length];

}DiaMatrix;

void TransMatrix(DiaMatrix * C)

{ //压缩三对角矩阵转置

int i j;

int t;

for(i=; i<N;i++)

for(j=i; j<N; j++)

if(ij<=&&ij>=)

{ //将对应于行列号的压缩矩阵内的元素互换

t=C>data[*i+j];

C>data[*i+j]=C>data[*j+i];

C>data[*j+i]=t;

}//endif

}//end

当稀疏矩阵A和B均以三元组表作为存储结构时试写出矩阵相加的算法其结果存放在三元组表C中

矩阵相加就是将两个矩阵中同一位置的元素值相加由于两个稀疏矩阵的非零元素按三元组表形式存放在建立新的三元组表C时为了使三元组元素仍按行优先排列所以每次插入的三元组不一定是A的按照矩阵元素的行列去找A中的三元组若有则加入C同时这个元素如果在B中也有则加上B的这个元素值否则这个值就不变;如果A中没有则找B有则插入C无则查找下一个矩阵元素

#define MaxSize //用户自定义

typedef int DataType; //用户自定义

typedef struct

{ //定义三元组

int ij;

DataType v;

}TriTupleNode;

typedef struct

{ //定义三元组表

TriTupleNode data[MaxSize];

int mnt;//矩阵行列及三元组表长度

}TriTupleTable;

//以下为矩阵加算法

void AddTriTuple( TriTupl

上一篇:树 - 二叉树 - 二叉树的性质

下一篇:树 - 二叉树 - 二叉树的存储结构(一)