数据结构与算法习题及答案 下载本文

精心整理

ElemTypeMax(LinkListL){

if(L->next==NULL)returnNULL;

pmax=L->next;//假定第一个结点中数据具有最大值 p=L->next->next;

while(p!=NULL){//如果下一个结点存在 if(p->data>pmax->data)pmax=p; p=p->next; }

returnpmax->data;

(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。 voidinverse(LinkList&L){ //逆置带头结点的单链表L p=L->next;L->next=NULL; while(p){ q=p->next;//q指向*p的后继 p->next=L->next; L->next=p;//*p插入在头结点之后 p=q; } } (8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)。 voiddelete(LinkList&L,intmink,intmaxk){ p=L->next;//首元结点 while(p&&p->data<=mink) {pre=p;p=p->next;}//查找第一个值>mink的结点 if(p){ while(p&&p->datanext; //查找第一个值≥maxk的结点 q=pre->next;pre->next=p;//修改指针 while(q!=p) {s=q->next;deleteq;q=s;}//释放结点空间 }//if } (9)已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。 知道双向循环链表中的一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。

voidExchange(LinkedListp)

∥p是双向循环链表中的一个结点,本算法将p所指结点与其前驱结点交换。 {q=p->llink;

q->llink->rlink=p;∥p的前驱的前驱之后继为p p->llink=q->llink;∥p的前驱指向其前驱的前驱。 q->rlink=p->rlink;∥p的前驱的后继为p的后继。 q->llink=p;∥p与其前驱交换

p->rlink->llink=q;∥p的后继的前驱指向原p的前驱 精心整理

精心整理

p->rlink=q;∥p的后继指向其原来的前驱 }∥算法exchange结束。 (10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。

[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

voidDelete(ElemTypeA[],intn)

∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。 {i=1;j=n;∥设置数组低、高端指针(下标)。 while(i

A.iB.n-iC.n-i+1D.不确定 (3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。 A.r-fB.(n+f-r)%nC.n+r-fD.(n+r-f)%n (4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。

A.x=top->data;top=top->link; B.top=top->link;x=top->link; C.x=top;top=top->link; D.x=top->link; (5)设有一个递归算法如下 ??????intfact(intn){?//n大于等于0 ???????????if(n<=0)return1;

???????????elsereturnn*fact(n-1);??????}

则计算fact(n)需要调用该函数的次数为()。? A.?n+1?????B.?n-1?????C.n?????D.n+2 (6)栈在?()中有所应用。

A.递归调用B.函数调用C.表达式求值D.前三个选项都有 精心整理

精心整理

(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是()。

A.队列B.栈C.线性表D.有序表

(8)设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是( )。

A.2B.3 C.4D.6

(9)在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为( )。

A.top不变B.top=0 C.top--D.top++

(10)设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。 A.线性表的顺序存储结构B.队列 C.线性表的链式存储结构D.栈 (11)用链接方式存储的队列,在进行删除运算时( )。 A.仅修改头指针B.仅修改尾指针 C.头、尾指针都要修改D.头、尾指针可能都要修改 (12)循环队列存储在数组A[0..m]中,则入队时的操作为( )。 A.rear=rear+1B.rear=(rear+1)%(m-1) C.rear=(rear+1)%mD.rear=(rear+1)%(m+1) (13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )。 A.(rear+1)%n==frontB.rear==front C.rear+1==frontD.(rear-l)%n==front (14)栈和队列的共同点是( )。 A.都是先进先出B.都是先进后出 C.只允许在端点处插入和删除元素D.没有共同点 (15)一个递归算法必须包括( )。 A.递归部分B.终止条件和递归部分 C.迭代部分D.终止条件和迭代部分 (2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)? 根据提示,算法可设计为: //以下为顺序栈的存储结构定义 #defineStackSize100//假定预分配的栈空间最多为100个元素 typedefcharDataType;//假定栈元素的数据类型为字符

typedefstruct{

DataTypedata[StackSize];

inttop;

精心整理

精心整理

}SeqStack;?

intIsHuiwen(char*t)

{//判断t字符向量是否为回文,若是,返回1,否则返回0

SeqStacks;

inti,len; chartemp; InitStack(&s); len=strlen(t);//求向量长度 for(i=0;i

}?

return1;//比较完毕均相等则返回1

}

精心整理