习题2参考答案及数组广义表习题

习题2参考答案及数组广义表习题
习题2参考答案及数组广义表习题

习题2参考答案

一、单项选择题

1.A 2.A 3.D 4.C 5.D 6.A 7.B 8.B 9.C 10.A 11.D 12.B 13.C 14.B 15.C 16.C 17.B 18.D 19.C 20.A

二、填空题

1.线性

2.n-i+1

3.相邻

4.前移,前,后

5.物理存储位置,链域的指针值

6.前趋,后继

7.顺序,链接

8.一定,不一定

9.线性,任何,栈顶,队尾,队头

10.单链表,双链表,非循环链表,循环链表

11.使空表和非空表统一;算法处理一致

12.O(1),O(n)

13.栈满,栈空,m,栈底,两个栈的栈顶在栈空间的某一位置相遇

14.2、3

15.O(1)

三、简答题

1.头指针是指向链表中第一个结点(即表头结点)的指针;在表头结点之前附设的结点称为头结点;表头结点为链表中存储线性表中第一个数据元素的结点。若链表中附设头结点,则不管线性表是否为空表,头指针均不为空,否则表示空表的链表的头指针为空。

2.线性表具有两种存储结构即顺序存储结构和链接存储结构。线性表的顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率:而在链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。

3.应选用链接存储结构,因为链式存储结构是用一组任意的存储单元依次存储线性表中的各元素,这里存储单元可以是连续的,也可以是不连续的:这种存储结构对于元素的删除或插入运算是不需要移动元素的,只需修改指针即可,所以很容易实现表的容量的扩充。

4.应选用顺序存储结构,因为每个数据元素的存储位置和线性表的起始位置相差一个

和数据元素在线性表中的序号成正比的常数。因此,只要确定了其起始位置,线性表中的任一个数据元素都可随机存取,因此,线性表的顺序存储结构是一种随机存取的存储结构,而链表则是一种顺序存取的存储结构。

5.设尾指针比设头指针好。尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找时间都是O(1)。若用头指针来表示该链表,则查找终端结点的时间为O(n)。

6.共有14种可能的出栈序列,即为:

ABCD, ABDC,ACBD, ACDB,BACD,ADCB,BADC,BCAD, BCDA,BDCA,CBAD, CBDA,CDBA, DCBA

7.在队列的顺序存储结构中,设队头指针为front,队尾指针为rear,队列的容量(即存储的空间大小)为maxnum。当有元素要加入队列(即入队)时,若rear=maxnum,则会发生队列的上溢现象,此时就不能将该元素加入队列。对于队列,还有一种“假溢出”现象,队列中尚余有足够的空间,但元素却不能入队,一般是由于队列的存储结构或操作方式的选择不当所致,可以用循环队列解决。

一般地,要解决队列的上溢现象可有以下几种方法:

(1)可建立一个足够大的存储空间以避免溢出,但这样做往往会造成空间使用率低,浪费存储空间。

(2)要避免出现“假溢出”现象可用以下方法解决:

第一种:采用移动元素的方法。每当有一个新元素入队,就将队列中已有的元素向队头移动一个位置,假定空余空间足够。

第二种:每当删去一个队头元素,则可依次移动队列中的元素总是使front指针指向队列中的第一个位置。

第三种:采用循环队列方式。将队头、队尾看作是一个首尾相接的循环队列,即用循环数组实现,此时队首仍在队尾之前,作插入和删除运算时仍遵循“先进先出”的原则。

8.该算法的功能是:将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。

四、算法设计题

1.算法思想为:

(1)应判断删除位置的合法性,当i<0或i>n-1时,不允许进行删除操作;

(2)当i=0时,删除第一个结点:

(3)当0

delete(LinkList *q,int i)

{ //在无头结点的单链表中删除第i个结点

LinkList *p,*s;

int j;

if(i<0)

-2-

printf("Can't delete");

else if(i= =0)

{ s=q;

q=q->next;

free(s);

}

else

{ j=0; s=q;

while((j

{ p=s;

s=s->next;

j++;

}

if (s= =NULL)

printf("Cant't delete");

else

{p->next=s->next;

free(s);

}

}

}

2.由于在单链表中只给出一个头指针,所以只能用遍历的方法来数单链表中的结点个数了。算法描述如下:

int ListLength ( LinkList *L )

{ //求带头结点的单链表的表长

int len=0;

ListList *p;

p=L;

while ( p->next!=NULL )

{ p=p->next;

len++;

}

return (len);

}

3.设单循环链表的头指针为head,类型为LinkList。逆置时需将每一个结点的指针域作以修改,使其原前趋结点成为后继。如要更改q结点的指针域时,设s指向其原前趋结点,p指向其原后继结点,则只需进行q->next=s;操作即可,算法描述如下:

void invert(LinkList *head)

-3-

{ //逆置head指针所指向的单循环链表

linklist *p, *q, *s;

q=head;

p=head->next;

while (p!=head) //当表不为空时,逐个结点逆置

{ s=q;

q=p;

p=p->next;

q->next=s;

}

p->next=q;

}

4.定义类型LinkList如下:

typedef struct node

{ int data;

struct node *next,*prior;

}LinkList;

此题可采用插入排序的方法,设p指向待插入的结点,用q搜索已由prior域链接的有序表找到合适位置将p结点链入。算法描述如下:

insert (LinkList *head)

{ LinkList *p,*s,*q;

p=head->next; //p指向待插入的结点,初始时指向第一个结点

while(p!=NULL)

{ s=head; // s指向q结点的前趋结点

q=head->prior; //q指向由prior域构成的链表中待比较的结点

while((q!=NULL) && (p->data>q->data)) //查找插入结点p的合适的插入位置

{ s=q;

q=q->prior;

}

s->prior=p;

p->prior=q; //结点p插入到结点s和结点q之间

p=p->next;

}

}

5.算法描述如下:

delete(LinkList *head, int max, int min)

{ linklist *p, *q;

if (head!=NULL)

-4-

{ q=head;

p=head->next;

while((p!=NULL) && (p->data<=min))

{ q=p;

p=p->next;

}

while((p!=NULL) && (p->data

p=p->next;

q->next=p;

}

}

6.算法描述如下:

delete(LinkList *head, int max, int min)

{ LinkList *p,*q;

q=head;

p=head->next;

while (p!=NULL)

if((p->data<=min) || (p->data>=max))

{ q=p;

p=p->next;

}

else

{ q->next=p->next;

free(p);

p=q->next;

}

}

7.本题是对一个循环链队列做插入和删除运算,假设不需要保留被删结点的值和不需要回收结点,算法描述如下:

(1)插入(即入队)算法:

insert(LinkList *rear, elemtype x)

{ //设循环链队列的队尾指针为rear,x为待插入的元素

LinkList *p;

p=(LinkList *)malloc(sizeof(LinkList));

if(rear= =NULL) //如为空队,建立循环链队列的第一个结点

{ rear=p;

rear->next=p; //链接成循环链表

}

-5-

else //否则在队尾插入p结点

{ p->next=rear->next;

rear->next=p;

rear=p;

}

}

(2)删除(即出队)算法:

delete(LinkList *rear)

{ //设循环链队列的队尾指针为rear

if (rear= =NULL) //空队

printf("underflow\n");

if(rear->next= =rear) //队中只有一个结点

rear=NULL;

else

rear->next=rear->next->next; //rear->next指向的结点为循环链队列的队头结点}

8.只要从终端结点开始往前找到第一个比x大(或相等)的结点数据,在这个位置插入就可以了。算法描述如下:

int InsertDecreaseList( SqList *L, elemtype x )

{ int i;

if ( (*L).len>= maxlen)

{ printf(“overflow");

return(0);

}

for ( i=(*L).len ; i>0 && (*L).elem[ i-1 ] < x ; i--)

(*L).elem[ i ]=(*L).elem[ i-1 ] ; // 比较并移动元素

(*L).elem[ i ] =x;

(*L).len++;

return(1);

}

-6-

第3章串

讲课提要

【主要内容】

1.串的有关概念及基本操作

2.串的存储结构

3.串操作应用举例

【教学目标】

1.掌握串的有关概念及基本运算

2.熟悉串的存储结构

3.熟悉串操作应用举例

【所需课时】

一次课。

1.串的有关概念及基本运算

2.串的存储结构

3.串操作应用举例

学习指导

1.概念和术语

?串(String)(或字符串):是由零个或多个字符组成的有限序列。一般记为

s= “a

1a

2

…a

n

”(n≥0)

其中,s是串的名,用双引号括起来的字符序列是串的值。

?串的长度:串中字符的个数n。

?子串和主串:串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应地称为主串。

?空串:不包含任何字符的串,表示为“Ф”。

?空格串:由一个或多个空格字符组成的串。例如:“”。

2.串的基本操作

(1)用串变量赋值assign(s,t)和用串常量赋值create(s,ss)

(2)判等函数equal(s, t)

(3)求长函数length(s)

-7-

(4)连接函数concat(s,t)

(5)求子串函数substring(s, pos , len)

(6)定位函数index(s,t)

(7)置换函数replace(s,t,v)

(8)插入子串insert(s,pos,t)

(9)删除子串delete(s,pos,k)

(10)串的复制copy(s,t)

【例3-1】已知字符串:a=“an apple”,b=“other hero”,c=“her”,求:

(1)concat(substr(a,1,2),b)。

(2)replace(a,substr(a,5,1),c)。

(3)index(a,c)和index(b,c)。

解:

(1)返回值为“another hero”,其中substr(a,1,2)的返回值为“an”。

(2)返回值为“an aherherle”,其中sub(a,5,1)的返回值为“p”。

(3)返回值分别为0和3。

3.串的顺序存储结构(顺序串)

串的顺序存储方式类似于线性表的顺序存储方式,其存储结构用C语言描述为:typedef struct strnode {

char data[maxlen];

int len;

}SeqString; //定义顺序串类型

【例3-2】设定串采用顺序存储结构,写出对串s1和串s2比较大小的算法。串值大小按字典排序(升序)方式,返回值等于-1,0和1分别表示s1s2。

解:算法思想:

(1)比较s1和s2共同长度范围内的对应字符:

若s1的字符>s2的字符,返回;

若s1的字符

若s1的字符=s2的字符,按上述规则继续比较;

(2)当(1)中对应字符均相同时,比较和的长度:

两者相等时,返回0;

前者>后者时,返回1;

前者<后者时,返回-1;

算法描述如下:

#define MAXLEN 256

struct strnode{

char data[MAXLEN];

int len;

}SeqString; //定义顺序串类型

-8-

int strcmp(SeqString s1, SeqString s2)//比较串s1和串s2的大小

{ int comlen;

if (s1.len

else comlen=s2.len;

for(i=0;i

if(s1.ch[i]

else

if(s1.ch[i]>s2.ch[i]) return (1); //s1>s2

if(s1.ch[i]= =s2.ch[i]) return (0); //s1=s2

else

if(s1.ch[i]

else return (1); //s1>s2

}

4.串的链式存储结构(即链串或块链结构)

使用链式存储结构的字符串,只要存储空间足够大,其长度没有任何限制,但逻辑上的连续性不体现为物理上的邻接性。每个字符和一个指针域形成一个结点,结点间的关系由链指针实现,即字符逻辑上的连续性由链指针描述。

其存储结构用C语言描述为:

typedef struct strnode{ //定义字符串的结点类型

char data;

struct strnode *next;

}LinkString;

习题3

一、单项选择题

1.空串与空格字符组成的串的区别在于()。

A.没有区别

B.两串的长度不相等

C.两串的长度相等

D.两串包含的字符不相同

2.一个子串在包含它的主串中的位置是指()。

A.子串的最后那个字符在主串中的位置

B.子串的最后那个字符在主串中首次出现的位置

C.子串的第一个字符在主串中的位置

D.子串的第一个字符在主串中首次出现的位置

3.下面的说法中,只有()是正确的。

A.字符串的长度是指串中包含的字母的个数

B.字符串的长度是指串中包含的不同字符的个数

-9-

C.若T包含在S中,则T一定是S的一个子串

D.一个字符串不能说是其自身的一个子串

4.两个字符串相等的条件是()。

A.两串的长度相等

B.两串包含的字符相同

C.两串的长度相等,并且两串包含的字符相同

D.两串的长度相等,并且对应位置上的字符相同

5. 若SUBSTR(S,i,k)表示求S中从第i个字符开始的连续k个字符组成的子串的操作,则对于S=“Beijing&Nanjing”,SUBSTR(S,4,5)=()。

A.“ijing”

B.“jing&”

C.“ingNa”

D.“ing&N”

6. 若INDEX(S,T)表示求T在S中的位置的操作,则对于S=“Beijing&Nanjing”,T=“jing”,INDEX(S,T)=()。

A.2

B.3

C.4

D.5

7. 若REPLACE(S,S1,S2)表示用字符串S2替换字符串S中的子串S1的操作,则对于S=“Beijing&Nanjing”,S1=“Beijing”,S2=“Shanghai”,REPLACE(S,S1,S2)=()。

A.“Nanjing&Shanghai”

B.“Nanjing&Nanjing”

C.“ShanghaiNanjing”

D.“Shanghai&Nanjing”

8. 在长度为n的字符串S的第i个位置插入另外一个字符串,i的合法值应该是()。

A.i>0

B. i≤n

C.1≤i≤n

D.1≤i≤n+1

9.字符串采用结点大小为1的链表作为其存储结构,是指()。

A.链表的长度为1

B.链表中只存放1个字符

C.链表的每个链结点的数据域中不仅只存放了一个字符

D.链表的每个链结点的数据域中只存放了一个字符

二、填空题

1. 计算机软件系统中,有两种处理字符串长度的方法:一种是___________,第二种是___________________。

2. 两个字符串相等的充要条件是_____________________和___________________。

3. 设字符串S1= “ABCDEF”,S2= “PQRS”,则运算S=CONCA T(SUB(S1,2,LEN (S2)),SUB(S1,LEN(S2),2))后的串值为___________________。

4. 串是指___________________。

5. 空串是指___________________,空格串是指___________________。

三、算法设计题

1.设有一个长度为s的字符串,其字符顺序存放在一个一维数组的第1至第s个单元-10-

中(每个单元存放一个字符)。现要求从此串的第m个字符以后删除长度为t的子串,m

2.设s和t是表示成单链表的两个串,试编写一个找出s中第1个不在t中出现的字符(假定每个结点只存放1个字符)的算法。

习题3参考答案

一、单项选择题

1.B 2.D 3.C 4.D 5.B 6.C 7.D 8.C 9.D

二、填空题

1. 固定长度,设置长度指针

2. 两个串的长度相等,对应位置的字符相等

3. “BCDEDE”

4. 含n个字符的有限序列(n≥0)

5. 不含任何字符的串,仅含空格字符的字符串

三、算法设计题

1.算法描述为:

int delete(r,s,t,m) //从串的第m个字符以后删除长度为t的子串

char r[ ];

int s,t,m;

{ int i,j;

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

r[s+i]=r[i];

for(j=m+t-i;j<=s;j++)

r[s-t+j]=r[j];

return (1);

} //delete

2.算法思想为:

(1)链表s中取出一个字符;将该字符与单链表t中的字符依次比较;

(2)当t中有与从s中取出的这个字符相等的字符,则从t中取下一个字符重复以上比较;(3)当t中没有与从s中取出的这个字符相等的字符,则算法结束。

设单链表类型为LinkList;注意,此时类型LinkList中的data成分为字符类型。

LinkString find(s,t)

LinkString *s, *t;

{ LinkString *ps, *pt;

ps=s;

-11-

while(ps!=NULL)

{ pt=t;

while((pt!=NULL)&&(ps->data!=pt->data))

pt=pt->next;

if(pt= =NULL)

ps=NULL;

else

{ ps=ps->next;

s=ps;

}

}

return s;

} //find

-12-

第4章数组和广义表

讲课提要

【主要内容】

1.多维数组的顺序存储结构

2.特殊矩阵的压缩存储

3.广义表的定义及其与线性表的关系

4.广义表的存储结构

5.广义表运算实现中递归的应用

【教学目标】

1.掌握多维数组的顺序存储结构

2.掌握特殊矩阵的压缩存储方法

3.掌握广义表的定义及其与线性表的关系

4.掌握广义表的存储结构

5.了解广义表运算实现中递归的应用

【所需课时】

二次课。

[第一次课]

1.多维数组的顺序存储结构

2.特殊矩阵的压缩存储方法

3.广义表的定义及其与线性表的关系

[第二次课]

4.广义表的存储结构

5.广义表运算实现中递归的应用

学习指导

1.多维数组的顺序存储结构

对于多维数组,有两种存储方式:

一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。

-13-

以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。以列为主序分配的规律是:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。

不论按何种方式存储,只要确定了数组的首地址以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。设有m×n二维数组A mn,以“以行为主序”的分配为例,按照元素的下标确定其地址的计算方法如下。

设数组的基址为LOC(a11),每个数组元素占据L个地址单元,计算a ij 的物理地址的函数为:

LOC(a ij) = LOC(a11) + ( (i-1)*n + j-1 ) * L

同理,对于三维数组A mnp,即m×n×p数组,对于数组元素a ijk其物理地址为:LOC(a ijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1) )*L

注意:在C语言中,数组中每一维的下界定义为0,则:

LOC(a ij) = LOC(a00) + ( i*n + j ) * L

【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。设每个字符占一个字节。

A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]

解:二维数A是一个9行10列的矩阵,即A[9][10]。按行存储时,A[8][5]是第85个元素存储的元素。而按列存储时,第85个存储的元素是A[3][10]。即正确答案为B。

2.特殊矩阵压缩存储的意义

在很多科学计算与工程应用中,经常要使用矩阵的概念。矩阵具有与数组相似的性质,如元素数目固定、元素按下标关系有序地排列,所以在编程时可以利用二维数组来存储矩阵,也可以利用程序设计语言中的各种矩阵运算。

在某些情况下,特别是在数值分析中,经常会出现一些阶数很高的矩阵,其中含有许多值相同的元素或零元素,如三角矩阵、对称矩阵、稀疏矩阵等,从节约存储空间的角度考虑,此时若用二维数组存储会造成空间的极大浪费。为了节省存储空间,可以对这类矩阵进行压缩存储。即为对多个相同值的元素只分配一个存储空间,而对零元素可以不分配空间。

3.对称矩阵压缩存储的方法

对称矩阵的特点是:在一个n阶方阵中,有a ij=a ji,其中1≤i , j≤n。

对称矩阵关于主对角线对称,因此只需存储上三角或下三角部分即可。

对于对称矩阵中的任意元素a ij,若令I=max(i,j),J=min(i,j),则将上面两个式子综合起来得到:k=I*(I-1)/2+J-1。给出对称矩阵A中任意元素a ij,依据它的下标i和j就可由上述对应关系式确定其在数组M中的位置K,因此a ij的地址可由下式计算。

Loc(a ij)=Loc(M[K])=Loc(M[0])+K*L=Loc(M[0])+[I*(I+1)/2+J]*L

其中:L为每个数据元素所占的存储单元长度。

I=max(i,j)。

-14-

-15-

J=min(i,j)。

K=I*(I+1)/2+J 。

【例4-2】若对n 阶对称矩阵A 以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n (n+1)/2]中,则在B 中确定的位置k 的关系为( )。

A .j i i +-2)1(*

B .i j j +-2)1(*

C .j i i ++2)1(*

D .i j j ++2

)1(* 解: 如果a ij 按行存储,那么它的前面有i-1行,其有元素个数为:

1+2+3+…+(i-1)=i (i-1)/2。同时它又是所在行的第j 列,因此它排列的顺序还得加上j ,一维数组B[n (n+1)/2]中的位置k 与其下标的关系是:j i i +-2

)1(*。 因此答案为A 。

4.三角矩阵压缩存储的方法

形如图的矩阵称为三角矩阵,其中c 为某个常数。其中下面图(a)为下三角矩阵:主对角线以上均为同一个常数;(b)为上三角矩阵,主对角线以下均为同一个常数;下面讨论它们的压缩存储方法。

压缩存储到向量sa[0..n(n+1)/2]中,c 存放在向量的最后一个分量中,排列时以行序为主。a ij 和sa[k]的对应关系是:

下三角矩阵: 上三角矩阵:

【例4-3】已知n 阶下三角矩阵A ,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组

B 中。请写出从第一列开始以列序为主序

-16-

分配方式时在B 中确定元素a ij 的存放位置的公式。

解: 如果a ij 按列存储,那么它的前面有j-1列,共有元素:

n+(n-1)+(n-2)+ …+[n-(j-2)] =(j-1)*n-2

)1)(2(--j j 而它又是所在列的第i 行,因此在它前的元素个数还得加上i 。因此它在一维数组B 中的存储顺序为: (j-1)*n-2

)1)(2(--j j +i 5.稀疏矩阵及其压缩存储的特点

设m*n 矩阵中有t 个非零元素且t<

6.稀疏矩阵压缩存储的顺序存储方式

以顺序方式组织存储时常用的方法是三元组顺序表,方法是:将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,采用顺序存储方法存储该表。

7.稀疏矩阵压缩存储的链式存储方式

稀疏矩阵压缩存储的链式存储方式,即十字链表。当矩阵中非零元素的个数和位置在使用中经常发生变化时,不宜采用顺序存储结构,可采用十字链表进行存储。其结点结构如图所示。

8.广义表(列表)的定义、术语及它与线性表的关系

? 广义表(Generalized Lists )是n (n ≥0)个数据元素a 1, a 2, … a i , … , a n 的有序序列,一般记作:Ls =(a 1, a 2, … a i , … , a n )。

其中:Ls 是广义表的名称,n 是它的长度,每个a i (1≤i ≤n )是Ls 的成员,它可以是单个元素,也可以是一个广义表,分别称为广义表Ls 的单元素和子表。当广义表Ls 非空时,称第一个元素a 1为Ls 的表头(head ),称其余元素组成的表(a 2,…,a i ,…,a n )为Ls 的表尾(tail )。

? 表的深度:表中元素的最深嵌套层数。

? 广义表与线性表的关系:当广义表Ls 中的元素全部是原子时,广义表即为线性表。因此,可认为线性表是广义表的特例,广义表是线性表的推广。

9.广义表的三个重要性质

(1)广义表是一种多层次的数据结构。广义表的元素可以是单元素,也可以是子表,

图4-2 十字链表的结点结构

而子表的元素还可以是子表,…。

(2)广义表可以是递归的表。广义表的定义并没有限制元素的递归,即广义表也可以是其自身的子表。例如表E就是一个递归的表。

(3)广义表可以为其他表所共享。例如,表A、表B、表C是表D的共享子表。在D 中可以不必列出子表的值,而用子表的名称来引用。

10.广义表的存储结构

按结点形式的不同,广义表的链式存储结构可分为两种不同的存储方式。一种称为头尾表示法,另一种称为孩子兄弟表示法。

11.广义表的基本运算

广义表有两个重要的基本操作,即取头操作(Head)和取尾操作(Tail)。

此外,在广义表上可以定义与线性表类似的一些操作,如建立、插入、删除、拆开、连接、复制、遍历等。

【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。

A.head(tail(tail(L)))

B.tail(head(head(tail(L))))

C.head(tail(tail(head(L))))

D.head(tail(tail(tail(L))))

解:选项A的结果是字符串“u”;选项B的结果是空表,无字符;选项C的结果是字符“z”;选项D的结果是字符“t”。从所有选项的结果可以看出,ASCII码最大的是字符“z”。因此正确答案是C。

习题4

一、单项选择题

1.设二维数组A[0…m-1][0…n-1]按行优先顺序存储在内存中,第一个元素的地址为p,每个元素占k个字节,则元素a ij的地址为()。

A.p +[i*n+j-1]*k

B.p+[(i-1)*n+j-1]*k

C.p+[(j-1)*n+i-1]*k

D.p+[j*n+i-1]*k

2.已知二维数组A10×10中,元素a20的地址为560,每个元素占4个字节,则元素a10的地址为()。

A.520

B.522

C.524

D.518

3.若数组A[0…m][0…n]按列优先顺序存储,则a ij地址为()。

A.LOC(a00)+[j*m+i]

B. LOC(a00)+[j*n+i]

C.LOC(a00)+[(j-1)*n+i-1]

D. LOC(a00)+[(j-1)*m+i-1]

4. 若下三角矩阵A n×n,按列顺序压缩存储在数组Sa[0…(n+1)n/2]中,则非零元素a ij 的地址为()。(设每个元素占d个字节)

-17-

A. [(j-1)*n-

2)1

)(

2

(-

-j

j

+i-1]*d

B. [(j-1)*n-

2)1

)(

2

(-

-j

j

+i]*d

C.[(j-1)*n-

2)1

)(

2

(-

-j

j

+i+1]*d

D.[(j-1)*n-

2)1

)(

2

(-

-j

j

+i-2]*d

5.设有广义表D=(a,b,D),其长度为(),深度为()。

A.无穷大

B.3

C.2

D.5

6. 广义表A=(a),则表尾为()。

A.a

B.(( ))

C.空表

D.(a)

7. 广义表A=((x,(a,B)),(x,(a,B),y)),则运算head(head(tail(A)))的结果为()。

A.x

B.(a,B)

C.(x,(a,B))

D.A

8.下列广义表用图来表示时,分支结点最多的是()。

A.L=((x,(a,B)),(x,(a,B),y))

B.A=(s,(a,B))

C.B=((x,(a,B),y))

D.D=((a,B),(c,(a,B),D)

9.通常对数组进行的两种基本操作是()。

A.建立与删除

B.索引和修改

C.查找和修改

D.查找与索引

10.假定在数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数为()。

A.80

B.100

C.240

D.270

11. 数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为()。

A.SA+141

B.SA+144

C.SA+222

D.SA+225

12.稀疏矩阵一般的压缩存储方法有两种,即()。

A.二维数组和三维数组

B.三元组和散列

C.三元组和十字链表

D.散列和十字链表

13.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点()。

A.正确

B.不正确

14.一个广义表的表头总是一个()。

A.广义表

B.元素

C.空表

D.元素或广义表

15.一个广义表的表尾总是一个()。

A.广义表

B.元素

C.空表

D.元素或广义表

16.数组就是矩阵,矩阵就是数组,这种说法()。

-18-

-19-

A.正确

B.错误

C.前句对,后句错

D.后句对

二、填空题 1. 一维数组的逻辑结构是______________,存储结构是______________;对于二维或多维数组,分为______________和______________两种不同的存储方式。

2. 对于一个二维数组A[m][n],若按行序为主序存储,则任一元素A[i][j]相对于A[0][0]的地址为______________。

3. 一个广义表为(a,(a,b),d,e,((i,j),k)),则该广义表的长度为_____,深度为_____。

4. 一个稀疏矩阵为 ,则对应的三元组线性表为_____________。

5. 一个n ×n 的对称矩阵,如果以行为主序或以列为主序存入内存,则其容量为______________。

6. 已知广义表A=((a,b,c ),(d,e,f )),则运算head(tail(tail(A)))=____________。

7. 设有一个10阶的对称矩阵A ,采用压缩存储方式以行序为主序存储,a 00为第一个元素,其存储地址为0,每个元素占有1个存储地址空间,则a 85的地址为______________。

8. 已知广义表Ls=(a,(b,c,d),e),运用head 和tail 函数取出Ls 中的原子b 的运算是______________。

9. 三维数组R[c 1…d 1,c 2…d 2,c 3…d 3]共含有______________个元素。(其中:c 1≤d 1,c 2≤d 2,c 3≤d 3)

10. 数组A[1…10,-2…6,2…8]以行优先的顺序存储,设第一个元素的首地址是100,每个元素占3个存储长度的存储空间,则元素A[5,0,7]的存储地址为______________。

三、判断题

1. 数组可看作基本线性表的一种推广,因此与线性表一样,可以对它进行插入、删除等操作。( )

2. 多维数组可以看作数据元素也是基本线性表的基本线性表。( )

3. 以行为主序或以列为主序对于多维数组的存储没有影响。( )

4. 对于不同的特殊矩阵应该采用不同的存储方式。( )

5. 采用压缩存储之后,下三角矩阵的存储空间可以节约一半。( )

6. 在一般情况下,采用压缩存储之后,对称矩阵是所有特殊矩阵中存储空间节约最多的。( )

7. 矩阵不仅是表示多维数组,而且是表示图的重要工具。( )

8. 距阵中的数据元素可以是不同的数据类型。( )

9. 矩阵中的行列数往往是不相等的。( )

10. 广义表的表头可以是广义表,也可以是单个元素。( ) ?????

???????-0000510000030200

11. 广义表的表尾一定是一个广义表。()

12. 广义表的元素可以是子表,也可以是单元素。()

13. 广义表不能递归定义。()

14. 广义表实际上是基本线性表的推广。()

15. 广义表的组成元素可以是不同形式的元素。()-20-

数组练习题及答案

第五章数组练习题及答案 一、选择题 1、判断字符串a和b是否相等,应当使用() A、if(a==b) B、if(a=b) C、if(strcpy(a,b)) D、if(strcmp(a,b)) 2、以下正确的定义语句是() A、int a[1][4]={1,2,3,4,5}; B、float x[3][]={{1},{2},{3}}; C、long b[2][3]={{1},{1,2},{1,2,3}}; D、double y[][3]={0}; 3、以下各组选项中,均能正确定义二维实型数组a的选项是() A、float a[3][4]; float a[ ][4]; float a[3][ ]={{1},{0}}; B、float a(3,4); float a[3][4]; float a[ ][ ]={{0},{0}}; C、float a[3][4]; static float a[ ][4]={{0},{0}}; auto float a[ ][4]={{0},{0},{0}}; D、float a[3][4]; float a[3][ ]; float a[ ][4]; 4、下面程序的运行结果是() 1—5 DDCBA 6—10 BDABB 11—15 CCCBC 16—20 DDCBB 21—25 BBAAA 26—30 DBDDB #include "stdio.h" main() { char str[]="SSSWLIA",c; int k; for(k=2;(c=str[k]!='\0');k++) { switch(c) {case 'I':++k;break; case 'L':continue; default:putchar(c);continue; } putchar('*'); } } A、SSW* B、SW* C、SW*A D、SW 5、下面程序段是输出两个字符串中对应相等的字符。横线处应填入() char x[]="programming"; char y[]="Fortran"; int i=0;

第五章 数组和广义表

第五章数组和广义表 一.选择题 1.在二维数组A 中引用A[i,j]的时间_________。 A.与i、j的大小有关 B.与i、j的大小无关 C.与i的大小有关,与j的大小无关 D.与i的大小无关,与j的大小有关 2.在稀疏矩阵的带行指针向量的链接存储中,每一行单链表中的结点都具有相同的________。 A.行号 B.列号 C.元素值 D.地址 3.二维数组A 按行顺序存储,其中每个元素占1个存储单元。若 A[1][1]的存储地址为420, A[3][3]的存储地址为446,则A[5][5]的存储地址为_______。A.470 B.471 C.472 D. 473 4.在稀疏矩阵的十字链接存储中,每个列单链表中的结点都具有相同的_____。A.行号 B.列号 C.元素值 D.地址 5.下面的说法中,不正确的是________。 A.对称矩阵中只须存放包括主对角线元素在内的下(或上)三角部分的元素即可B.对角矩阵中只须存放的非零元素即可 C.稀疏矩阵中值为零的元素较多,因此可以采用三元组表方法存储 D.稀疏矩阵中大量值为零的元素分布有规律,因此可以采用三元组表方法存储6.对一些特殊矩阵采用压缩存储的目的主要是为了________。 A.表达变得简单 B.对矩阵元素的存取变得简单 C.去掉矩阵中的多余元素 D.减少不必要的存储空间的开销 7.若将n 阶对称矩阵 A 按照行序为主序方式将包括主对角线元素在内的下三角形的所有元素依次存放在一个一维数组 B 中,则该对称矩阵在 B 中占用了________个数组元素。 A.n2 B.n*(n-1) C.n*(n+1)/2 D.n*(n-1) 8. 稀疏矩阵的三元组顺序表表示的一个三元组中不包括________。 A. 行号 B.列号 C.元素值 D.元素总数 9.稀疏矩阵一般的压缩存储方法有两种,即________。 A.二维数组和三维数组 B.三元组和散列 C. 三元组和十字链表 D.散列和十字链表 10.有一个 10 阶对称矩阵 A,采用压缩存储方式(以行序为主存储,且A[0 Ⅱ0]=1),则A[8][5]的地址是________。 A.52 B.48 C.54 D.53 11.数组通常具有的两种基本操作是________。 A.建立与删除 B.索引和修改 C.查找和修改 D.查找与索引12.二维数组M 的成员是 6 个字符(每个字符占一个存储单元)组成的串,行下标 i 的范围从0 到 8,列下标j 的范围从1到10,则存放M 至少需要________个字节。 A.90 B.180 C.240 D.540 13.二维数组M 的元素是4 个字符(每个字符占一个存储单元)组成的串,行下标 i 的范围从0 到 4 ,列下标j 的范围从0 到 5,M 按行存储时元素M[3 Ⅱ5]的起始地址与M 按列存储时元素________的起始地址相同。

vb控件数组的习题及答案

vb控件数组的习题及答案

电子教室学生注册时姓名文本框部分请输入:如:1411111111李四学号+姓名,中间不加空格) 实验准备: 请同学们删除d:\ex21 文件夹里面的内容 如果没有ex21文件夹,请在d:\ 下新建 ex21 文件夹 1、打开D:\下的工程文件PROJECTA4.vbp和窗体文件FORMA4.frm,按以 下要求完成程序:在窗体上创建2个列表框、2个标签、2个命令按钮。 List1用于显示可选课程、List2用于显示已选课程。单击“选课”按钮, 将List1中选定的课程名称加入到List2中显示,单击“清空”按钮,将 删除List2中的所有课程。程序运行的参考输出格式如图A-4所示,可选 课程至少包含图A-4所示的6门。最后将工程文件、窗体文件按原文件 名保存在D:\EX21文件夹下。 图A-4

2、打开D:\下的工程文件PROJECTB4.vbp和窗体文件FORMB4.frm,按以下要求完成程序:在窗体上创建1个列表框、1个图片框、2个标签、2个命令按钮。List1用于显示可选课程、Picture1用于显示已选课程。单击“选课”按钮,将List1中选定的课程名称加入到Picture1中显示,单击“清空”按钮,将删除Picture1中的所有课程。程序运行的参考输出格式如图B-4所示,可选课程至少包含图B-4所示的6门。最后将工程文件、窗体文件按原文件名保存在D:\EX21文件夹下。 图B-4

3、打开D:\下的工程文件PROJECTA41.vbp和窗体文件FORMA41.frm,按以下要求完成程序:单击窗体,能产生10个两位的随机整数并存放在一维数组中,并能在窗体中输出该10个随机整数、最大数及其在10个数中的位置,要求使用语句强制显式声明模块中的所有变量,程序运行的参考输出格式如图A-41所示。最后将工程文件、窗体文件按原文件名保存在D:\EX21文件夹下。 图A-41

(完整word版)数据结构第五章数组和广义表习题及答案

习题五数组和广义表 一、单项选择题 1.常对数组进行的两种基本操作是() A.建立与删除 B. 索引与修改 C. 查找与修改 D. 查找与索引2.对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定. A.Loc[i,j]=A[m,n]+[(n+1)*i+j]*k B.Loc[i,j]=loc[0,0]+[(m+n)*i+j]*k C.Loc[i,j]=loc[0,0]+[(n+1)*i+j]*k D.Loc[i,j]=[(n+1)*i+j]*k 3.稀疏矩阵的压缩存储方法是只存储 ( ) A.非零元素 B. 三元祖(i,j, aij) C. aij D. i,j 4. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。 A. 1175 B. 1180 C. 1205 D. 1210 5. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。 A. i(i-1)/2+j B. j(j-1)/2+i C. i(j-i)/2+1 D. j(i-1)/2+1 6. 用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j 沿链移动的操作为( )。 A. j=r[j].next B. j=j+1 C. j=j->next D. j=r[j]-> next 7. 对稀疏矩阵进行压缩存储目的是()。 A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D.降低运算的时间复杂度 8. 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。 A. head(tail(LS)) B. tail(head(LS)) C. head(tail(head(tail(LS))) D. head(tail(tail(head(LS)))) 9. 广义表((a,b,c,d))的表头是(),表尾是()。 A. a B.() C.(a,b,c,d) D.(b,c,d) 10. 设广义表L=((a,b,c)),则L的长度和深度分别为()。 A. 1和1 B. 1和3 C. 1和2 D. 2和3 11. 下面说法不正确的是( )。 A. 广义表的表头总是一个广义表 B. 广义表的表尾总是一个广义表 C. 广义表难以用顺序存储结构 D. 广义表可以是一个多层次的结构 二、填空题 1.通常采用___________存储结构来存放数组。对二维数组可有两种存储方法:一种是以___________为主序的存储方式,另一种是以___________为主序的存储方式。 2. 用一维数组B与列优先存放带状矩阵A中的非零元素A[i,j] (1≤i≤n,i-2≤j≤i+2),B 中的第8个元素是A 中的第_ _行,第_ _列的元素。

C语言练习3(数组)=参考答案

C语言(数组) 一、选择题 1. 设有程序: main() { int i,a[11]; printf("给数组赋值:\n"); for (i=0;i<=10;i++) scanf("%d",( )); ... ... printf("输出数组:\n"); for(i=0;i<=10;i++) printf("%d,",( )); } 则在程序中的两个园括号中分别应填入:C A) &a[i]和&a[i] B) a[i]和&a[i] C) &a[i]和a[i] D) a[i]和a[i] 2. 设已定义:int a[15]; 则数组a占用的内存单元数是( C ). A) 15 B) 16 C) 30 D) 32 3. 阅读程序: main() { int a[2]={0},i,j,k=2; for(i=0;i

return r; } main() { int x,a[]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n",x); } 以上程序的输出结果是( D ). A) 720 B) 6 C)24 D) 120 5. 以下定义语句中,错误的是( B ). A) int a[ ] = {6,7,8}; B) int n=5, a[n]; C) char a[ ]= "string"; D) char a[5 ]={'0','1','2','3','4'}; 6. 以下描述中正确的是( D ). A) 数组名后面的常量表达式用一对圆括弧括起来 B) 数组下标从1开始 C) 数组下标的数据类型可以是整型或实型 D) 数组名的规定与变量名相同 7. 若定义数组并初始化char a[10]={'0','1 ','2','3','4','5','6','7','8','9'};指出以下错误语句( AB ). A) scanf("%c",a[0]); B) scanf("%s",&a); C) printf("%c",a[3]); D) printf("%s",a); 8.若定义数组int a[10] ,其最后一个数组元素为( C ). A) a[0] B) a[1] C) a[9] D) a[10] 9. 若定义数组并初始化int a[10]={ 1,2,3,4},以下语句哪一个不成立( B )? A) a[8] 的值为0 B) a[1] 的值为1 C) a[3] 的值为4 D) a[9] 的值为0 10. 指出以下错误语句( A ).

数据结构第五章数组和广义表

第五章数组和广义表:习题 习题 一、选择题 1.假设以行序为主序存储二维数组A[1..100,1..100],设每个数据元素占两个存储单元,基地址为10,则LOC(A[5,5])=( )。 A. 808 B. 818 C. 1010 D. 1020 2.同一数组中的元素( )。 A. 长度可以不同B.不限C.类型相同 D. 长度不限 3.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。从供选择的答案中选出应填入下列关于数组存储叙述中( )内的正确答案。 (1)存放A至少需要( )个字节。 (2)A的第8列和第5行共占( )个字节。 (3)若A按行存放,元素A[8]【5]的起始地址与A按列存放时的元素( )的起始地址 一致。 供选择的答案: (1)A. 90 B. 180 C. 240 D. 270 E.540 (2) A. 108 B. 114 C. 54 D. 60 E.150 (3)A.A[8][5] B. A[3][10] c.A[5][8] D.A[O][9] 4.数组与一般线性表的区别主要是( )。 A.存储方面 B.元素类型方面 C.逻辑结构方面 D.不能进行插入和删除运算 5.设二维数组A[1..m,1..n]按行存储在数组B[1..m×n]中,则二维数组元素A [i,j]在一维数组B中的下标为( )。 A. (i-l)×n+j B. (i-l)×n+j-l C.i×(j-l) D. j×m+i-l 6.所谓稀疏矩阵指的是( )。 A.零元素个数较多的矩阵 B.零元素个数占矩阵元素中总个数一半的矩阵 C.零元素个数远远多于非零元素个数且分布没有规律的矩阵 D.包含有零元素的矩阵 7.对稀疏矩阵进行压缩存储的目的是( )。 A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D. 降低运算的时间复杂度 8.稀疏矩阵一般的压缩存储方法有两种,即( )。 A.二维数组和三维数组 B.三元组和散列 C.三元组和十字链表 D.散列和十字链表

数组习题及参考答案

第七章数组 一、单项选择题 1.若有说明“int a[3][4]={0};”,则下面正确的是_____。 A.只有元素a[0][0]可得到初值0 B. 此说明语句不正确 C. 数组a各元素都可得到初值,但其值不一定是0 D. 数组a中每个元素均可得到初值0 2.以下不能正确定义二维数组的选项是_____。 A. int a[2][2]={{1},{2}} B. int a[2][2]={{1},2,3} C. int a[2][]={{1,2},{3,4}} D. int a[][2]={1,2,3,4} 3.在下列对字符数组进行初始化中正确的是_____。 A.char s1[]=”abcd” B.char s2[3]=”xyz” C.char s3[][]={…a?,?x?,?y?} D.char s4[2][3]={“xyz”,”mnp”} 二、写出下列程序的运行结果 有以下程序: 1. #include int main () {

int a[]={4,0,2,3,1},i,j,t; for(i=1;i<5;i++) { t=a[i];j=i-1; while(j>=0&&t>a[j]) { a[j+1]=a[j]; a[j]=t; j--; } } for(i=0;i<5;i++) { cout<

习题2参考答案及数组广义表习题

习题2参考答案 一、单项选择题 1.A 2.A 3.D 4.C 5.D 6.A 7.B 8.B 9.C 10.A 11.D 12.B 13.C 14.B 15.C 16.C 17.B 18.D 19.C 20.A 二、填空题 1.线性 2.n-i+1 3.相邻 4.前移,前,后 5.物理存储位置,链域的指针值 6.前趋,后继 7.顺序,链接 8.一定,不一定 9.线性,任何,栈顶,队尾,队头 10.单链表,双链表,非循环链表,循环链表 11.使空表和非空表统一;算法处理一致 12.O(1),O(n) 13.栈满,栈空,m,栈底,两个栈的栈顶在栈空间的某一位置相遇 14.2、3 15.O(1) 三、简答题 1.头指针是指向链表中第一个结点(即表头结点)的指针;在表头结点之前附设的结点称为头结点;表头结点为链表中存储线性表中第一个数据元素的结点。若链表中附设头结点,则不管线性表是否为空表,头指针均不为空,否则表示空表的链表的头指针为空。 2.线性表具有两种存储结构即顺序存储结构和链接存储结构。线性表的顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率:而在链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。 3.应选用链接存储结构,因为链式存储结构是用一组任意的存储单元依次存储线性表中的各元素,这里存储单元可以是连续的,也可以是不连续的:这种存储结构对于元素的删除或插入运算是不需要移动元素的,只需修改指针即可,所以很容易实现表的容量的扩充。 4.应选用顺序存储结构,因为每个数据元素的存储位置和线性表的起始位置相差一个

数组典型例题及参考答案

第7章数组 7-1输入一个正整数n(1≤n≤10),再输入n个整数 (1)输出最大数和最小数,并输出平均值。 (2)将最小数与第一个数交换,最大数与最后一个数交换,然后输出交换后的结果。 (3)输出所有比平均值大的数。 (4)找到最接近平均值的数。(提示:考虑差的绝对值)

/* 将最小数与第一个数交换,最大数与最后一个数交换*/ t=a[0]; a[0]=a[q]; a[q]=t; t=a[N-1]; a[N-1]=a[p]; a[p]=t; printf("After exchange: "); for(i=0; iave) printf("%d ", a[i]); /* 找到最接近平均值的数*/ printf("\nThe number closest to the average is: "); sub = a[0]>ave? a[0]-ave: ave-a[0]; p=0; for(i=1; iave? a[i]-ave: ave-a[i]) < sub ) { sub = a[i]>ave? a[i]-ave: ave-a[i]; p=i; } } printf("%d.", a[p]); } Output Please input 10 integers: 17 34 -11 2 5 10 7 -9 0 25 /* input */ The maximum is: 34, the minimum is: -11, the average is 8.00 After exchange: -11 25 17 2 5 10 7 -9 0 34 Larger than the average: 25 17 10 34 The number closest to the average is: 7 7-2输入一个日期(按照year-month-day格式),计算该日期为当年的第几天。 (提示:注意闰年)

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组 一、名词解释: 1.栈、栈顶、栈底、栈顶元素、空栈 2.顺序栈 3.链栈 4.递归 5.队列、队尾、队头 6.顺序队 7.循环队 8.队满 9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵 二、填空题: 1.栈修改的原则是_________或称________,因此,栈又称为________线性表。在栈顶 进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________ 或________。 2.栈的基本运算至少应包括________、________、________、________、________五 种。 3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。 4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。 5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。 6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1 表示________,此时作进栈运算,则产生“________”。 7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。 int InitStack(SqStackTp *sq) { ________; return(1);} 8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。 Int Push(SqStackTp *sq,DataType x) { if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);} else{________________: ________________=x; return(1);} } 9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。 Int Pop(SqStackTp *sq,DataType *x) {if(sp->top==0){error(“下溢”);return(0);} else{*x=________________; ________________; return(1);} } 10. 以下运算实现在顺序栈上判栈空,请在________________处用适当句子予以填充。 Int EmptyStack(SqStackTp *sq) {if(________________) return(1); else return(0); } 11.以下运算实现在顺序栈上取栈顶元素,请在________________处用适当句子予以填充。 Int GetTop(SqStackTp *sq,DataType *x) {if(________________) return(0);

第 5 章 数组和广义表答案

第 5 章数组和广义表 一、选择 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存 储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则 a85的地址为( B )。 A. 13 B. 33 C. 18 D. 40 2. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到 8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以 列为主存放时,元素A[5,8]的存储首地址为(B )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 3. 假设以行序为主序存储二维数组A=array[1..100,1..100],设 每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。 A. 808 B. 818 C. 1010 D. 1020 4. 二维数组A的元素都是6个字符组成的串,行下标i的范围从0 到8,列下标j的范围从0到9。从供选择的答案中选出应填入下列 关于数组存储叙述中()内的正确答案。 (1)存放A至少需要( E )个字节; (2)A的第8列和第5行共占( A )个字节; (3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元 素( B )的起始地址一致。 供选择的答案: (1)A. 90 B. 180 C. 240 D. 270 E. 540

(2)A. 108 B. 114 C. 54 D. 60 E. 150 (3)A. A[8,5] B. A[4,9] C. A[5,8] D. A[0,9] 5. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括 主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中, 则在B中确定aij(i

《C++数组》习题参考答案

《C++数组》习题 学号姓名 一、选择题 1、下列对字符数组进行初始化的语句正确的是 A A.char a[]= "Hello"; B.char a[][]= {'H','e','l','l','o'}; C.char a[5]="Hello"; D.char a[2][5]= {"Hello","World"}; 2、以下一维数组a的正确定义是 D A.int a(10) ; B.int n=10,a[n]; C.int n; D.#define size 10 cin>>n; int a[size]; int a[n]; 3、以下对二维数组a进行不正确初始化的是 C A.int a[2][3]={0}; B.int a[][3]={{1,2},{0}}; C.int a[2][3]={{1,2},{3,4},{5,6}}; D.int a[][3]={1,2,3,4,5,6); 4、执行以下程序后,s的值为 A int a[]={5,3,7,2,1,5,4,lO); int s=0,k; for(k=0;k<8;k+=2) s+=*(a+k); A.17 B.27 C.13 D.无定值 5、为了判断两个字符串sl和s2是否相等,应当使用 D A.if (s1==s2)

B.if (s1=s2) C.if(strcpy(S1,s2)) D.if(strcmp(s1,s2)==O) 6、有定义int a[2][5];,若a[0][1]的地址为x,则a[0][O]、a[1][3]地址分别为(假设一个整型数据占用两个字节的内存空间): A A.x-2,x+14 B.x-1,x+7 C.x+1,x+7 D.x-1,x+14 7、若有定义float a[m][n];,且a[1][1]的地址为x,每个float元素占用4个字节,则a[il[j]的地址为 A A.x+4*(i-1)*n+4*(j-1) B.x+(i-1)*n+(j-1) C.x+4*(i-1)*j+(j-1) D.x+4*i*j+4*j 二、填空题 1、char st[20] = "SEU\0\t\\"; cout<

数据结构(C语言版)第5章 数组和广义表

第 5 章数组和广义表 一、选择题 为第一元素,其 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a 11 的地址为()。【燕山大学 2001 一、2 存储地址为1,每个元素占一个地址空间,则a 85 (2分)】 A. 13 B. 33 C. 18 D. 40 2. 有一个二维数组A[1:6,0:7] 每个数组元素用相邻的6个字节存储,存储器按字节编址, 那么这个数组的体积是(①)个字节。假设存储数组元素A[1,0]的第一个字节的地址是0, 则存储数组A的最后一个元素的第一个字节的地址是(②)。若按行存储,则A[2,4]的第 一个字节的地址是(③)。若按列存储,则A[5,7]的第一个字节的地址是(④)。就一般情 况而言,当(⑤)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。供选择的 答案:【上海海运学院 1998 二、2 (5分)】 ①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120 G. 156 H. 234 I. 276 J. 282 K. 283 L. 288 ⑤: A.行与列的上界相同 B. 行与列的下界相同 C. 行与列的上、下界都相同 D. 行的元素个数与列的元素个数相同 3. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10, 数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 【南京理工大学 1997 一、8 (2分)】 4. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存 储单元,基地址为10,则LOC[5,5]=()。【福州大学 1998 一、10 (2分)】 A. 808 B. 818 C. 1010 D. 1020 5. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000 的内存单元中,则元素A[5,5]的地址是( )。【南京理工大学 2001 一、13 (1.5分)】 A. 1175 B. 1180 C. 1205 D. 1210 6. 有一个二维数组A[0:8,1:5],每个数组元素用相邻的4个字节存储,存储器按字节编址, 假设存储数组元素A[0,1]的第一个字节的地址是0,存储数组A的最后一个元素的第一个字 节的地址是(①)。若按行存储,则A[3,5]和 A[5,3]的第一个字节的地址是(②) 和(③)。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址是(④)和(⑤)。【上海海运学院 1996 二、1 (5分)】 ①-⑤:A.28 B.44 C.76 D.92 E.108 F.116 G.132 H.176 I.184 J.188 7. 将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元 (即该元素下标i=66,j=65),在B数组中的位置K为()。供选择的答案: 素A 6665 A. 198 B. 195 C. 197 【北京邮电大学 1998 二、5 (2分)】 8. 二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈 从1到10。从供选择的答案中选出应填入下列关于数组存储叙述中()内的正确答案。(1)存放A至少需要()个字节; (2)A的第8列和第5行共占()个字节; (3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元素()的起始地

第5章 数组和广义表 自测题含答案

第5章 数组和广义表 自测题含答案 一、单选题 1. 假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288 B ;末尾元素A 57的第一个字节地址为 1282 ;若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。 2. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。 答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1, c 2)+[(j-c 2)*( d 1-c 1+1)+i-c 1)]*L 得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950 3. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。 4. 求下列广义表操作的结果: (1) GetHead 【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号 (2) GetHead 【GetTail 【((a,b),(c,d))】】=== (c,d) ; (3) GetHead 【GetTail 【GetHead 【((a,b),(c,d))】】】=== b ; (4) GetTail 【GetHead 【GetTail 【((a,b),(c,d))】】】=== (d ) ; 二、单选题( A )1. 〖01年计算机系考研题〗假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。(无第0行第0列元素) A.16902 B.16904 C.14454 D.答案A, B, C 均不对 答:此题与填空题第8小题相似。(57列×60行+31行)×2字节+10000=16902 ( B )2. 设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是: A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1 D.i(i+1)/2+j ??????????????=n n n n a a a a a a A ,2 ,1,2 ,21,21 ,1

C语言数组练习及答案

C语言数组练习及答案集团文件版本号:(M928-T898-M248-WU2669-I2896-

第四部分数组 4.1 选择题 1. 以下关于数组的描述正确的是(c )。 A. 数组的大小是固定的,但可以有不同的类型的数组元素 B. 数组的大小是可变的,但所有数组元素的类型必须相同 C. 数组的大小是固定的,所有数组元素的类型必须相同 D. 数组的大小是可变的,可以有不同的类型的数组元素 2. 以下对一维整型数组a的正确说明是(d )。 A.int a(10); B. int n=10,a[n]; C.int n; D. #define SIZE 10 scanf("%d",&n); int a[SIZE]; int a[n]; 3. 在C语言中,引用数组元素时,其数组下标的数据类型允许是(c )。 A. 整型常量 B. 整型表达式 C. 整型常量或整型表达式 D. 任何类型的表达式 4. 以下对一维数组m进行正确初始化的是(c )。 A. int m[10]=(0,0,0,0) ; B. int m[10]={ }; C. int m[ ]={0}; D. int m[10]={10*2}; 5. 若有定义:int bb[ 8];。则以下表达式中不能代表数组元bb[1]的地址的是(c )。 A. &bb[0]+1 B. &bb[1] C. &bb[0]++ D. bb+1 6. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是(d )。 A. 3 B. 6 C. 10 D. 20 7. 若有以下说明: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g;

数组和广义表习题

习题五数组 5.1 单项选择题(其中A[i..j]表示下标从i到j) 1. 常对数组进行的两种基本操作是__C__。 A. 建立与删除 B. 索引和修改 C. 查找和修改 D. 查找与索引 2. 二维数组M的成员是6个字符(每个字符占一个存储单元,即一个字节)组成的串,行下标i的范围从0到8,列下标j的范围从1到10,则存放M 至少需要__①D__个字节;M 的第8列和第5行共占__②B__个字节。 ①A. 90 B. 180 C. 240 D. 540 ②A. 108 B. 114 C. 54 D. 60 4. 数组A中,每个元素A的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数是__C__。 A. 80 B. 100 C.240 D. 270 5. 数组A中,每个元素A的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为_C___。 A. SA+141 B. SA+144 C. SA+222 D. SA+225 (7*10+4)*3=222 6. 数组A中,每个元素A的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A[5][8]的起始地址为_B___。 A. SA+141 B. SA+180 C. SA+222 D. SA+225 (7*8+4)*3=180 5.2 填空题(将正确的答案填在相应的空中,其中A[i,j]表示下标从i到j) 1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是_ LOC(A[0][0]) +(i*n+j)*k___。 2. 二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200,则A[6][12]的地址是_326___。200+(12*10+6)*1=326 3. 二维数组A[10..20][5..10]采用行序为主方式存储,每个元素占4个存储单元,并且A[10][5]的存储地址是1000,则A[18][9]的地址是__1000+(8*6+4)*4=1208__。 5.3算法设计题: 1. 假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放结果矩阵。 2. 假设系数矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加

Java数组练习题(带答案)

一填空题 1)数组的元素通过下标来访问,数组Array的长度为Array.length 。 2)数组复制时,"="将一个数组的引用传递给另一个数组。 3)JVM将数组存储在栈(堆或栈)中。 4)数组的二分查找法运用的前提条件是数组已经排序。 5)Java中数组的下标的数据类型是整型。 6)数组最小的下标是0 。 7)arraycopy()的最后一个参数指明复制元素的个数。 8)向方法传递数组参数时,传递的是数组的引用。 9)数组初始化包括数组的申明,创建和初始化。 10)数组下标访问超出索引范围时抛出数组越界异常 11)浮点型数组的默认值是0.0f 。 12)数组创建后其大小不能改变。 二选择题 1.下面错误的初始化语句是_ABD__ A. char str[]="hello"; B. char str[100]="hello"; C. char str[]={'h','e','l','l','o'}; D. char str[]={'hello'}; 2.定义了一维int型数组a[10]后,下面错误的引用是_B__ A. a[0]=1; B. a[10]=2; C. a[0]=5*2; D. a[1]=a[2]*a[0]; 3.下面的二维数组初始化语句中,正确的是____ A. float b[2][2]={0.1,0.2,0.3,0.4}; B. int a[][]={{1,2},{3,4}}; C. int a[2][]= {{1,2},{3,4}}; D. float a[2][2]={0}; 4.引用数组元素时,数组下标可以是_D___ A. 整型常量 B. 整型变量 C. 整型表达式 D. 以上均可 5.定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数为____ A. 24 B. 25 C. 18 D. 17 6.下列初始化字符数组的语句中,正确的是__B__ A. char str[5]="hello"; B. char str[]={'h','e','l','l','o','\0'}; C. char str[5]={"hi"}; D. char str[100]=""; 7.数组在Java中储存在 C 中 A. 栈 B. 队列 C. 堆 D. 链表 8.下面程序的运行结果是____ main() { int a[][]={{1,2,3},{4,5,6}}; System.out.printf("%d", a[1][1]); } A. 3 B. 4 C. 5 D. 6 9.下面程序的运行结果是_C___ main() {

相关文档
最新文档