admin 管理员组

文章数量: 1087139


2024年4月21日发(作者:vb是什么语言表达)

数组和广义表

作业4

单项选择题

1

.有一矩阵为

A[-3:1,2:6]

,每个元素占一个存储单元,存储的首地址为

100

,以行序

为主,则元素

a

-1,4

的地址为( )。

A

111 B

112 C

113 D

125

【分析】对于二维数组

A[c

1

:d

1

,c

2

:d

2

]

,设每个元素占用

l

个存储单元,

LOC(c

1

,c

2

)

是第

一个元素

a

c

1

,c

2

的存储位置,则按行存放时,

a

ij

的存储位置如下:

LOC(i,j)=LOC(c

1

,c

2

)+[(d

2

-c

2

+1)(i-c

1

)+(j-c

2

)]

l

对于本题,

c

1

=-3

c

2

=2

d

1

=1

d

2

=6

l

=1

LOC(c

1

,c

2

)=100

,所以元素

a

-1,4

的地址为:

LOC(-1,4)=100+[(6-2+1)*(-1-(-3))+(4-2)]*1=112

【答案:

B

2

.一

n

×

n

的三角矩阵

A=[a

ij

]

如下:

a

11

a

12

a

22

a

1n

a

2n

a

nn

将三角矩阵中元素

a

ij

(i

j)

按行序为主序的顺序存储在一维数组

(n+1)/2]

中,则

a

ij

B

中的位置是( )。

A

(i-1)(2n+i)/2+i-j+1 B

(i-1)(2n-i+2)/2+j-i+1

C

(i-1)(2n-i)/2+j-i D

(i-1)(2n-i+2)/2+j-i

【分析】存储位置

=n+(n-1)+…+(n-i+2)+i-j+1=(i-1)(2n-i+2)/2+j-i+1

【答案:

B

3

.广义表

((a,b),(c,d))

的表尾是

(

)

。(四川大学计算机学院

2004

年试题)

A

(c,d) B

((c,d)) C

(d) D

d

【分析】广义表

((a,b),(c,d))

可看成是

(d1,d2)

所组成,其中

d1=(a,b)

d2=(c,d)

,所以表

尾为

(d2)=((c,d))

【答案:

B

4

.若广义表

A

满足

Head(A)==Tail(A)

,则

A

为( )。(北方名校经典试题)

A

() B

(()) C

((),()) D

((),(),())

326

数据结构

【分析】根据广义表

Head

运算和

Tail

运算的定义,可用代入法求解:

A

Head(A)

Tail(A)

:无定义

B

Head(A)=()

Tail(A)=()

C

Head(A)=()

Tail(A)=(()) D

Head(A)=()

Tail(A)=((),())

【答案:

B

二、综合题

1

.有三维数组

A[0:7,0:8,0:9]

,数组的起始地址是

1000

,每个元素长为

2

,试给出下

面结果:(南方名校经典试题)

1

)元素

a

1,6,8

的起始地址;

2

)数组

a

所占用的存储空间。

【解答】

1

)对于三维数组

A[c

1

:d

1

,c

2

:d

2

,c

3

:d

3

]

,设每个元素占用

l

个存储单元,

LOC(c

1

,c

2

,c

3

)

是第一个元素

a

c

1

,c

2

,c

3

的存储位置,则按行存放时,

a

j1,j2,j3

的存储位置如下:

LOC(j1,j2,j3)=LOC(c

1

,c

2

,c

3

)+[ (j1-c

1

) (d

2

-c

2

+1)(d

3

-c

2

+1) +(j

2

-c

2

)(d

3

-c

2

+1)+ (j

3

-c

3

)]

l

对于本题,

c

1

=0

c

2

=0

c

3

=0

d

1

=7

d

2

=8

d

3

=9

l

=2

LOC(c

1

,c

2

,c

3

)=1000

,所以元

a

1,6,8

的地址为:

LOC(1,6,8)=1000+[(1-0) (8-0+1)(9-0+1) +(6-0)(9-0+1)+(8-0)]*2=1316

2

)数组

A

所占用的存储空间:

=

数组

a

的元素个数

*

每个元素的长度

=(d

1

-c

1

+1)(d

2

-c

2

+1) (d

3

-c

2

+1)

l

= (7-0+1) (8-0+1)(9-0+1)*2=1440

2

.已知稀疏矩阵如下图所示,试写出三元组表示。(南方名校经典试题)

15

0

0

9

0016

6000

0800

00180

0

【解答】

4

1

1

2

3

4

4

5

1

5

2

3

1

4

6

15

16

6

8

9

18

其中,第一行的(

4

5

6

)表示稀疏矩阵的行数,列数及非零元素的值,其他各行

为三元组。

3

.若在矩阵

A

n

×

n

中存在一个元素

a

i-1,j-1

满足

a

i-1,j-1

是第

i

行元素中最小值且又是第

j

列元素中的最大值,则称此元素为该矩阵的一个马鞍点。假设以二维数组存储矩阵

A

n

×

n

9

文件与动态存储管理

327

试设计一个求该矩阵所有马鞍点的算法。(北方名校经典试题)

注:本题选择作。

【解答】用数组

S[n]

存储某一行(如第

i

行,

i=1~m

)的元素值最小的元素的下标,

c

表示此行的元素值等于最小值的元素的个数(元素值等于最小值的元素可能不止一个),对

每个元素值最小的元素再验证是否是所在列的元素值最大的元素,如是则为马鞍点,将其输

出。

C++

语言版测试程序见

4_2_3c++

,具体算当如下:

template

void SaddlePoint(ElemType *A,int m,int n)

输出矩阵

A

所有马鞍点

//

{

ElemType *S=new ElemType[n+1]; //

存储某一行的元素值最小元素的下标

int c; //

表示此行的最小值等于最小的元素的个数

int count=0; //

马鞍点的个数

int i,j,k;

ElemType min; //

某一行的最小元素值

for(i=1;i<=m;i++)

{

min=*(A+(i-1)*n+(1-1)); //*(A+(i-1)*n+(1-1))

等价于

A(i,1)

c=1;S[1]=1; //

当前已得的元素值最小的元素下标与个数

for(j=2;j<=n;j++)

if(*(A+(i-1)*n+(j-1))

等价于

A(i,j)

{ //A(i,j)

min=*(A+(i-1)*n+(j-1)); //A(i,j)

为新的最小值

c=1;S[1]=j; //

当前已得的元素值最小的元素下标与个数

}

else if(*(A+(i-1)*n+(j-1))==min) //*(A+(i-1)*n+(j-1))

等价于

A(i,j)

{ //A(i,j)==min

c++; //

元素值最小的元素值自加

1

S[c]=j;

}

for(j=1;j<=c;j++)

{ //

对第

i

行的

c

个元素值最小的元素判断是否是马鞍点

k=1;

//

判断是否第

S[j]

列有大于

A(i,S[j])

的元素

while(k<=m&&*(A+(i-1)*n+(S[j]-1))>=*(A+(k-1)*n+(S[j]-1)))

/* *(A+(i-1)*n+(S[j]-1))

等价于

A(i,S[j])

*(A+(k-1)*n+(S[j]-1))

等价于

A(k,S[j])

*(A+(i-1)*n+(S[j]-1))>=*(A+(k-1)*n+(S[j]-1))

等价于

A(i,S[j])>=A(k,S[j])

*/

k++;

if(k>m)

{ //

表示

A[i][S[j]]

是第

S[j]

列的最大元素

,

它是马鞍点

328

数据结构

}

count++; //

马鞍点个数自加

1

cout<

//*(A+(i-1)*n+(S[j]-1))

等价于

A(i,S[j])

cout<<*(A+(i-1)*n+(S[j]-1))<<")";

}

}

}

if(count==0)

cout<

无马鞍点

else

cout<

count

个马鞍点

C++

语言版测试程序见

4_2_3c

,具体算当如下:

void SaddlePoint(ElemType *A,int m,int n)

输出矩阵

A

所有马鞍点

//

{

ElemType *S=new ElemType[n+1]; //

存储某一行的元素值最小元素的下标

int c; //

表示此行的元素值等于最小值的元素的个数

int count=0; //

马鞍点的个数

int i,j,k;

ElemType min; //

某一行的最小元素值

for(i=1;i<=m;i++)

{

min=*(A+(i-1)*n+(1-1)); //*(A+(i-1)*n+(1-1))

等价于

A(i,1)

c=1;S[1]=1; //

当前已得的元素值最小的元素下标与个数

for(j=2;j<=n;j++)

if(*(A+(i-1)*n+(j-1))

等价于

A(i,j)

{ //A(i,j)

min=*(A+(i-1)*n+(j-1)); //A(i,j)

为新的最小值

c=1;S[1]=j; //

当前已得的元素值最小的元素下标与个数

}

else if(*(A+(i-1)*n+(j-1))==min) //*(A+(i-1)*n+(j-1))

等价于

A(i,j)

{ //A(i,j)==min

c++; //

元素值最小的元素值自加

1

S[c]=j;

}

for(j=1;j<=c;j++)

{ //

对第

i

行的

c

个元素值最小的元素判断是否是马鞍点

k=1;

//

判断是否第

S[j]

列有大于

A(i,S[j])

的元素

while(k<=m&&*(A+(i-1)*n+(S[j]-1))>=*(A+(k-1)*n+(S[j]-1)))

/* *(A+(i-1)*n+(S[j]-1))

等价于

A(i,S[j])

*(A+(k-1)*n+(S[j]-1))

等价于

A(k,S[j])

*(A+(i-1)*n+(S[j]-1))>=*(A+(k-1)*n+(S[j]-1))

等价于

A(i,S[j])>=A(k,S[j])

*/

9

文件与动态存储管理

329

}

k++;

if(k>m)

{ //

表示

A[i][S[j]]

是第

S[j]

列的最大元素

,

它是马鞍点

count++; //

马鞍点个数自加

1

cout<

//*(A+(i-1)*n+(S[j]-1))

等价于

A(i,S[j])

cout<<*(A+(i-1)*n+(S[j]-1))<<")";

}

}

}

if(count==0)

cout<

无马鞍点

else

cout<

count

个马鞍点

注意:本例中矩阵

A

的元素

A(i,j)

等价于数组元素的下标为

(i-1)

(j-1)

,所以

可用

*(A+(i-1)*n+(j-1))

表示。


本文标签: 元素 矩阵 数组 名校 个数