L.list[j+1]=L.list[j];
else
break;
L.list[j+1]=x;
};
}
问:
此算法的时间复杂性为:
B
A.O(n)B.(n2)C.(n*i)D.(n*j)
6、向一个顺序栈S(栈顶指针为top)中插入元素x时,首先要(B)。
A.S->stack[S->top]=x;B.S->top++;
C.S->top--;D.x=S->stack[S->top];
7、从一个循环队列中删除元素时,首先需要(D)。
A.队尾指针循环减1B.队首指针循环减1
C.队尾指针循环加1D.队首指针循环加1
8.关于栈的插入和删除操作,正确的说法是(C)。
A.插入在栈顶、删除在栈底进行B.插入在栈底,删除在栈顶进行
C.插入和删除都在栈顶进行D.插入和删除都在栈底进行
9.队的插入操作在(C)进行。
A.队首B.队首或队尾C.队尾D.任意位置
10.若要在一个单链表HL中的由指针p所指结点的后面插入一个指针q所指的结点,则应执行(D)。
A.p->next=q->next;q->next=p;
B.q->next=p->next;p=q;
C.p->next=q->next;q->next=HL;
D.q->next=p->next;p->next=q;
三、简答题
1、简述线性表的顺序存储和链接存储实现的异同。
【答案要点】
1)两者的存储结构不同。
顺序用物理相邻实现逻辑相邻,大多用数组实现,链接存储用链接的方式实现逻辑相邻,物理上不一定相邻;
2)存储相同数量的数据,顺序存储占用空间小,链接存储占用空间大;
3)读取操作:
顺序存储为按元素序号随机访问,效率较高;链接存储为按元素序号顺序访问,效率较低;
4)插入和删除操作:
顺序存储要移动约半数元素,效率较低;链接存储不需移动现有元素,效率较高;
2、举例说明顺序存储的栈在元素出栈和进栈时栈顶指针的变化。
【答案要点】
1)由于顺序栈是由数组存储,元素进栈出栈只能在栈顶进行,用top表示栈顶元素的下标,每次进栈top++;出栈top--。
2)用ABCD四个元素按顺序进、出栈,其top值变化如下:
初始状态:
top=-1
ABC进栈后:
CB出栈
D再进栈
3、说明顺序存储的队列,在解决队满与队空的判断条件时,为什么将队首指针指向第一个元素之前?
这样解决后存储容量有什么变化?
【答案要点】
1)如果f指向队首元素,r指向队尾元素,由于队空和队满条件一样(r+1)%MaxSize==f,所以要将队首指针指向第一个元素之前(或其他方法)。
2)这样,队列中始终有一个存储空间不能用于存储元素,于是存储容量变为MaxSize-1。
四、判断题,并简单说明原因:
1、线性表的逻辑顺序和存储顺序总是一致的。
【解答】错。
顺序表的逻辑顺序和存储顺序一致,链表的逻辑顺序和存储顺序
不一定一致。
2、线性表的顺序存储结构优于链接存储结构。
【解答】错。
两种存储结构各有优缺点。
3、顺序表中的元素可以存储于任何位置。
【解答】错。
顺序表中的元素必须按照逻辑顺序存储于对应的数组位置上。
4、线性结构的基本特征是:
每个元素有且仅有一个直接前驱和一个直接后继。
【解答】错。
每个元素最多只有一个直接前驱和一个直接后继,第一个元素没
有前驱,最后一个元素没有后继。
5、在单链表中,要取得某个元素,只要知道该元素所在结点的地址即可,因
此单链表是随机存取结构。
【解答】错。
要找到该结点的地址,必须从头指针开始查找,所以单链表是顺
序存取结构。
五、有一个顺序循环队列,最大存储空间为MAXSIZE=5,队首指针f指向队首元素的前一单元,队尾指针r指向队尾元素,初始时状态如图所示。
现有A,B,C,D,E,F等元素入队,试按下列要求添画图形或回答问题。
(12分,①—③各2分,④6分)
初始状态
①A,B,C三元素依次入队后队列中的状况和队首队尾指针位置;
②接下来两个元素出队后队列中的状况和队首队尾指针位置(出队的元素不要画出)
③接下来剩余尚未入队的所有元素入队后队列中的状况和队首队尾指针位置
④该队列的数据结构定义为:
structQueueSq{
ElemType*queue;
intfront,rear;
intMaxSize;
};
不考虑健壮性条件,写出下列入队算法中缺失的语句:
voidEnQueue(structQueueSq*Q,ElemTypex)
{…
Q->rear=(Q->rear+1)%Q->MaxSize;
Q->queue[Q->rear]=x;
…
}
不考虑健壮性条件,写出下列出队算法中缺失的语句:
ElemTypeOutQueue(structQueueSq*Q)
{…
Q->front=(Q->front+1)%Q->MaxSize;
returnQ->queue[Q->front];
…
}
参考以上两算法和数据结构,写出队满的条件:
(Q->rear+1)%Q->MaxSize==Q->front
和队空的条件:
Q->front==Q->rear
六、用f(n)=2n为例,说明栈与递归算法之间的关系。
要点1:
栈只能在栈顶操作;
要点2:
递归算法是解决一个问题时,是通过解决与它具有相同解法的子问题而得到的;
要点3:
在进行递归调用时,计算机系统自动建立栈,用于存储递归调用参数(下例中的)n和返回地址(下例中的r),进栈;
要点4:
当在一定条件下结束递归调用时,系统按照栈中存储的系数和返回地址逐步返回(出栈)到最初调用处,并得到最终结果。
例:
求f(n)=2nf(n)=1n=0
f(n)=2*f(n-1)n>0
当n=3时进栈退栈
n
f(n)
0
f(0)=1
1
1
2*f(1-1)
2*1=2
2
2*f(2-1)
2*2=4
3
2*f(3-1)
2*4=8
七、
已知线性表A={a1、a2、……an}采用顺序存储结构,其数据域为整型
要求:
1、定义单链表结点(包括对数据域的定义);
2、从顺序表的表尾删除一个结点。
(参考答案)
答1:
typedefintElemType;
structList{
ElemType*list;
intsize;
intMaxSize;
};
答2:
ElemTypeDeleteLastList(structList*L)
{
if(L->size==0){
printf("线性表为空,删除无效\n");
exit
(1);
}
;
L->size--;
returnL->list[L->size];
}
八、
已知线性表A={a1、a2、……an}采用链接存储结构,其数据域为整型
要求:
1、定义单链表结点(包括对数据域的定义);
2、从单链表的表尾删除一个结点。
(参考答案)
答1:
typedefintElemType;
structsNode{
ElemTypedata;
structsLNode*next;
};
答2:
ElemTypeDelete(structsLNode*HL)
{sNode*p=HL;
while(p->next!
=NULL)
p=p->next;
temp=p->data;
deletep;
returntemp;
}