A.i(i-1)/2+jB.i(i+1)/2+jC.j(j-1)/2+iD.j(j+1)/2+i
24.设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放
在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1≤i,j≤n,且i≤j)在B中的位
置为
A.i(i-l)/2+j-1B.i(i-l)/2+jC.j(j-l)/2+i-1D.j(j-l)/2+i
25.设有一5阶上三角矩阵A[5][5],现将其上三角中的元素按列优先顺序存放在一维
数组B[15]中。
已知A[1][1]存放在B[1]中,其地址为100,每个元素占用2个存储
单元,则A[3][4]的地址为
A.116B.118C.120D.122
26.将一个三对角矩阵A[100][100],按行优先存入一维数组B[298]中,A[1][1]存放
在B[1]中。
A中元素A[66][65],在B数组中的位置K为
A.194B.195C.197D.198
27.有一个100*90的稀疏矩阵,非0元素有10个(均为整数)。
设每个整型数占2
个字节,则用三元组表示该矩阵时,所需的字节数是
A.20B.60C.66D.18000
28.下面关于广义表的说法中,不正确的是
A.广义表的表头总是一个广义表B.广义表的表尾总是一个广义表
C.广义表难以用顺序结构存储D.广义表可以是一个多层次的结构
29.已知广义表的表头为a,表尾为(b,c),则此广义表为
A.(a,b,c)B.(a,(b,c))C.((a),b,c)D.((a,b,c))
30.广义表(a,(b,c),d,e)的表头为
A.aB.(a)C.a,(b,c)D.(a,(b,c))
31.设广义表L=((a,b,c)),则L的长度和深度分别为
A.1和1B.1和2C.1和3D.2和3
32.设广义表L=(a,(b,c)),进行GetTail(L)操作后的结果为
A.cB.b,cC.(b,c)D.((b,c))
33.对于广义表A,若GetHead(A)等于GetTail(A),则表A为
A.()B.(())C.((),())D.((),(),())
34.对广义表L=((a,b),(c,d),(e,f))执行操作GetTail(GetTail(L))的结果是
A.()B.(f)C.(e,f)D.((e,f))
35.对广义表L=((a,b),c,d)执行操作GetTail(GetHead(L))的结果是
A.bB.(b)C.(d)D.(c,d)
36.已知广义表A=(a,b),B=(A,A),C=(a,(b,A),B),执行操作GetTail(GetHead(GetTail(C)))
后的结果为
A.bB.(b)C.AD.(A)
37.从广义表LS=((p,q),r,s)中分解出原子q的运算是
A.GetTail(GetHead(LS))B.GetHead(GetTail(GetHead(LS)))
C.GetHead(GetTail(LS))D.GetTail(GetTail(GetHead(LS)))
38.已知广义表LS=((a,b,c),(d,e,f)),从LS中分离出原子e的运算是
A.GetHead(GetTail(LS))
B.GetTail(GetHead(LS))
C.GetHead(GetTail(GetHead(GetTail(LS)))
D.GetHead(GetTail(GetTail(GetHead(LS))))
二、填空题
1.空格串是指_____________,其长度等于_____________。
2.组成串的数据元素只能是________。
3.串是一种特殊的线性表,其特殊性表现在_____________;串的两种最基本的存储方式是__________________________;两个串相等的充分必要条件是_____________。
4.若串S1="ABCDEFG",S2="9876",S3="###",S4="012345",执行
Concat(Replace(S1,SubString(S1,StrLength(S2),StrLength(S3)),S3),SubString(S4,Index(S2,"8"),StrLength(S2)))
5.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为___________,
又称P为_______________。
6.Index("DATASTRUCTURE","STR")=________。
7.设正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为________。
8.模式串P="abaabcac"的next函数值序列为________。
9.字符串"ababaaab"的nextval函数值序列为________。
10.已知串U="xyxyxyxxyxy",t="xxy";依次执行
StrAssign(S,U);
StrAssign(V,SubString(S,Index(S,t),StrLength(t)+1));
StrAssign(m,"ww");
Replace(S,V,m);
后,S=_________________,V=___________。
11.设串S="abcdefgh",T="xyzw"。
依次执行
SubString(X,S,3,StrLength(T));
SubString(Y,S,StrLength(T),2);
Concat(Z,X,Y);
后,串Z的值为_______________。
12.实现字符串拷贝的函数strcpy可写为:
voidstrcpy(char*s,char*t)//copyttos
{
while(__________________________________);
}
13.有一个二维数组A[8][5],每个数组元素用相邻的4个字节存储,存储器按字节编址,假设存储数组第1个元素A[0][0]的第一个字节的地址是0,存储数组A的最后一个元素的第一个字节的地址是______________。
若按行序优先存储,则A[3][4]和A[5][3]的第一个字节的地址是___________和___________。
若按列序优先存储,则A[2][4]和A[7][1]的第一个字节的地址是___________和___________。
14.一个10阶对称矩阵A,采用行优先顺序压缩存储上三角元素,设第1个元素a[1][1]的存储地址为0,每个元素占有1个字节的存储空间,则a[4][5]的地址为____________。
15.设一个6阶的下三角矩阵B按行优先顺序压缩存储在一维数组A中,其中A[0]存储矩阵的第一个元素B[1][1],则A[14]存储的元素是________。
若将B按列序优先顺序压缩存储在一维数组A中,则A[14]存储的元素是________。
16.稀疏矩阵一般有两种压缩存储方法,即____________和______________。
17.一个广义表的长度是指__________________,而表的深度是指______________。
广义表G=(a,b,(c,d,(e,f)),G)的长度为___________。
广义表L=(a,(b,()))的深度为________。
18.设广义表L=((),()),则GetHead(L)是_________,GetTail(L)是_________,L的长度是________;深度是_______。
广义表((a,b),c,d)的表头是__________,表尾是____________。
19.用广义表的取表头GetHead和取表尾GetTail的运算,从广义表LS=(b,c,(f),((d)))中分解出原子c的操作为_________。
20.设广义表A=(a,b,(c,d),(e,(f,g))),用广义表的取表头GetHead和取表尾GetTail运算,从A中分解出原子d的操作为_______________________。
三、解答题
1.设有对称矩阵A[n][n](行和列下标均从1开始),将其上三角元素逐行存于数组B[n*(n+1)/2]中,使得B[k]=a[i][j](1<=i,j<=n,0<=k<=n*(n+1)/2-1)。
试推导出由i、j和n计算k的一般公式。
2.在n×n矩阵A中,所有下标值满足关系式i+j<n+l的元素aij(1<=i,j<=n)的值均为0,现将A中其它元素按行优先顺序依次存储到长度为n(n+1)/2的一维数组sa中,其中元素a1,n存储在sa[0]中。
(1)设n=10,元素a[4][9]存储在sa[p]中,写出下标p的值。
(2)设元素a[i][j](1<=i,j<=n,且i+j<n+l)存储在sa[k]中,写出由i、j和n计算k的一般公式。
3.设有n阶三对角矩阵,将其三条对角线上的元素逐行地存于数组B[1..3n-2]中,使得B[k]=a[i][j]。
(1)设n=100,将一个A[100][100]的三对角矩阵,按行优先存入一维数组B[1..m]中,试确定m的值,并求A中元素A[77][78]在B数组中的位置K。
(2)求用i、j表示k的下标变换公式。
(3)求用k表示i、j的下标变换公式。
4.设A和B均为n阶下三角矩阵,在下三角区域中各有n(n+1)/2个元素。
另设有一个二维数组C,它有n行n+1列。
试设计一个方案,将两个矩阵A和B中的下三角区域元素存放于同一个C中,写出所给出方案的代码段。
并给出计算A的矩阵元素a[i][j]和B的矩阵元素b[i][j]在C中的存放位置下标的公式。
设A、B、C三个矩阵的行、列下标均从1开始。
5.设有稀疏矩阵A如下(矩阵元素的行列下标均从1开始):
(1)若矩阵A采用三元组顺序表存储,试给出其三元组表。
(2)若矩阵采用十字链表存储,试画出该矩阵的十字链表。
6.利用广义表的GetHead和GetTail操作写出函数表达式,把以下各小题中的单元素banana从广义表中分离出来:
(1)L1=(apple,pear,banana,orange)
(2)L2=((apple,pear),(banana,orange))
(3)L3=((((apple))),((pear)),(banana),orange)
(4)L4=(apple,(pear,(banana),orange))
7.画出广义表((((a),b)),(((),d),(e,f)))的两种存储结构图示。
8.已知广义表如下:
A=(B,y)
B=(x,L)
L=(a,b)
(1)写出下列操作的结果
GetTail(A)=_______________。
GetHead(B)=______________。
(2)画出广义表A所对应的图形(树形结构)。
四、分析题
1.阅读下列函数,并回答问题。
voidfun441(intA[],intn)
{
inti,j,m;
for(i=1;ifor(j=0;j
{
m=A[i*n+j];
A[i*n+j]=A[j*n+i];
A[j*n+i]=m;
}
}
(1)已知矩阵B=
,将其按行优先存于一维数组A中,写出执行函数调用
Fun441(A,3)后,矩阵B的值。
(2)简述函数voidfun441(intA[],intn)的功能。
2.阅读下列函数,并回答问题。
voidfun442(charstr[81])
{
chartemp,*begin,*end,*p1,*p2;
if(str==NULL)
return;
begin=str;
end=str+strlen(str)-1;
while(begin{
temp=*begin;*begin=*end;*end=temp;
begin++;end--;
}
begin=end=str;
while(*begin!
='\0')
{
if(*begin=='')
{
begin++;end++;
continue;
}
elseif(*end==''||*end=='\0')
{
for(p1=begin,p2=end-1;p1{
temp=*p1;*p1=*p2;*p2=temp;
}
if(*end!
='\0')begin=++end;
elsebegin=end;
}
else
end++;
}
}
(1)设有charstr[81]=”Iamagoodworker!
”,执行函数fun442(str)后,字符串str的内容是什么?
(2)简述函数voidfun442(charstr[81])的功能。
3.下面函数的功能是判断字符串s是否对称,若对称则返回true,否则返回false。
例如,fun443("abba")返回true,f("abab")返回false。
请在划线处填上适当的一个表达式,将程序补充完整。
boolfun443(chars[])
{
inti=0,j=0;
while(s[j])_____________;//
(1)
for(j--;i(2)
return_____________;//(3)
}
4.设S和T是用结点大小为1的单链表存储的两个串。
下面函数的功能是找出串S中第一个不在串T中出现的字符。
请在划线处填上适当的内容,将程序补充完整。
structLNode
{
chardata;
structLNode*next;
};
typedefLNode*LinkStr;
charSearchNo(LinkStrS,LinkStrT)//查找不在T中出现的字符
{
LinkStrp,q;
p=S;
q=T;
while(__________________)//
(1)
{while(__________________)//
(2)
q=q->next;
if(__________________)//(3)
returnp->data;
q=T;//指针恢复串T的开始结点
__________________;//(4)
}
returnNULL;
}
5.下面程序的功能是生成从外到内是连续的自然数排列的回旋方阵。
例如,当n=3和n=4时的回旋方阵如下图1所示。
图1由外向内回旋方阵
请在划线处填上适当的内容,将程序补充完整。
#include
#include
usingnamespacestd;
#defineN10
intmain()
{
inta[N][N]={0};
intn,row,col,num=0;
cout<<"请输入方阵的行数n(n<=10):
";cin>>n;
num=a[row=0][col=0]=1;//第0行第0列输入起始1
while(num{
while(________________________)//
(1)
a[++row][col]=++num;//向下填充
while(________________________)//
(2)
a[row][++col]=++num;//向右填充
while(________________________)//(3)
a[--row][col]=++num;//向上填充
while(________________________)//(4)
a[row][--col]=++num;//向左填充
}
for(row=0;row{
for(col=0;colcout<cout<}
return0;
}
五、设计题
1.利用C的库函数strlen、strcpy和strcat编写一个函数voidStrInsert(char*S,intpos,char*T),将串T插入到串S的第pos个字符之前。
若pos大于S的长度,则插入不执行。
利用函数strlen和strcpy编写一个函数voidStrDelete(char*S,intpos,intlen)删去串S中从位置pos开始的连续len个字符。
若pos≥strlen(S),则没有字符被删除;若i+m≥strlen(S),则将S中从位置pos开始直至末尾的字符均删去。
2.编写一个程序,将一个文本串用事先给定的字母映射表进行加密和解密。
设字母映射表为:
abcdefghijklmnopqrstuvwxyz
qwertyuIopasdfghjklzxcvbnm
3.编写一个程序,将一个含有数字和非数字字符的字符串中连续的数字作为一个整体,依次存放到一维整型数组a中(设字符串中的数均不超过最大机器整数)。
例如,有字符串“ak123xyz45678.90?
+!
302gen4563”,将123存入a[0],456存入a[1],78存入a[2],90存入a[3]…。
(说明:
为简单起见,不考虑78.90是一