数据结构习题有答案Word文档下载推荐.docx
《数据结构习题有答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构习题有答案Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
k<
=n;
k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j]
}
解:
(1)n-1
(2)
(3)x=0;
y=0;
for(int i=1;
i〈=n;
i++)
for(int j=1;
j〈=i;
j++)
for(intk=1;
k〈=j;
k++)
x=x+y;
(3)
3 指出下列个算法的功能,并求其时间复杂度.
(1) int sum1(intn)
{
int p=1,s=0;
for (inti=1;
i<
=n;
i++)
{ p*=i;
s+=p;
returns;
}
(2) intsum2(intn)
{ints=0;
for ( inti=1;
i<=n;
i++)
{ intp=1;
for (intj=1;
j<
=i;
j++)p*=j;
s+=p;
returns;
(1), T(n)=O(n)
(2), T(n)=O(n2)
4算法设计
有3枚硬币,其中有1枚是假的,伪币与真币重量略有不同。
如何借用一架天平,找出伪币?
以流程图表示算法.
上机练习题
要求:
给出问题分析、算法描述、源程序及运行截图,在线提交。
1.设a,b,c为3个整数,求其中位于中间值的整数。
第2章线性表
设计算法:
在顺序表中删除值为e的元素,删除成功,返回1;
否则,返回0。
intSqlist〈T>
:
:
DeleteElem(T e )
{ for(i=1;
=length;
i++)// 按值顺序查找 *i可从0开始
if(elem[i-1]==e) // 找到,进行删除操作
{ for(j=i;
j<length;
j++)//ai至an依次前移
Elem[j—1]=elem[j];
length--;
//表长减一
return1;
//删除成功,返回1
}
return0;
// 未找到,删除不成功,返回 0
2.分析顺序表中元素定位算法intSqList〈T>
Locate(T e ) 的时间复杂度。
解:
设表长为n,等概率下,每个元素被定位的概率为:
p=1/n
定位成功第i个元素,需比较i次
3.对于有头结点的单链表,分别写出定位成功时,实现下列定位语句序列。
(1)定位到第i个结点ai;
p=head;
j=0;
while (p&
&j<i){ p=p->
next;
j++;
(2) 定位到第i个结点的前驱ai-1;
p=head;
j=0;
while(p &&j<i-1){p=p->
next;
j++;
(3) 定位到尾结点;
p=head;
while (p->
next)p=p—>
next;
(4) 定位到尾结点的前驱。
p=head;
while(p—>
next—>next ) p=p—>next;
4.描述一下三个概念的区别:
头指针,头结点,首元结点。
并给予图示。
头指针:
是一个指针变量,里面存储的是链表中首结点的地址,并以此来标识一个链表。
头结点:
附加在第一个元素结点之前的一个结点,头指针指向头结点。
首元结点:
指链表中的第一个元素结点.
5。
对于无头结点单链表,给出删除第i个结点的算法描述.
template 〈calssT〉
TLinkList<T>
Delete(inti)
template〈calssT〉
TLinkList〈T>
Delete(inti) {// 在单链表上删除第i个数据元素
if (head==NULL)throw“表空!
”;
// 空表,不能删
else if( i==1) { //删除第1个元素
p=Head;
x=p-〉data;
//保存被删元素值
Head= p-〉next;
deletep ;
}
else{// 元素定位到第ai-1
p=Head;
j=1 ;
//定位查找起始位置
while{p->
next&&j<i-1 }{
p=p—>
next;
j++ ;
}
if(!
p->next|| j>
i-1);
//定位失败
throw “删除位置不合理”;
else { // 定位成功,进行结点删除
q=p->
next;
x=p>data;
p->next=q->
next;
delete q;
}
retrun x;
//返回被删除元素值
}//#
6. 用教材定义的顺序表的基本操作实现下列操作:
template<
calss T>
int DeleteElem(SqListL,Te)
#include“SqList。
h“
template<
calssT>
intDeleteElem(SqListL,Te){//
i = L。
LocateElem(e);
//按值查找
if(!
i) //未找到
return0;
else //找到
delete (i) ;
//删除被找到的元素
7.已知L是有表头结点的单链表,且P结点既不是首元结点,也不是尾结点,试写出实现下列功能的语句序列。
(1) 在P结点后插入S结点;
(2)在P结点前插入S结点;
(3)在表首插入S结点;
(4)在表尾插入S结点.
【解】
(1)s->
next=p—>
next;
p—〉next=s;
(2)q=L;
while( q—〉next!
=p)q=q->
next;
s-〉next=p 或q->next;
q—>next=s;
(3)s->next=L->
L->
next=s;
(3)q=L;
while( q—>next!
=NULL) q=q—〉next;
s—〉next= q->
next;
q—>
next=s;
编程实现:
删除单链表中值为e的元素。
第3章栈与队列
1.铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。
试问:
若进站的六辆列车顺序如上所述, 那么是否能够得到325641和154623的出站序列,如果不能, 说明为什么不能;
如果能,说明如何得到(即写出"进栈"
或”出栈"的序列).
325641可以
154623不可以。
2.简述以下算法的功能(栈的元素类型为int )。
(1) statusalgo_1(SqStackS){
int i,n,A[255];
n=0;
while (!
S。
StackEmpty()){n++;
A[n]=S.Pop();
}
for(i=1;
=n;
i++) S.Push(A[i]);
}
(2)statusalgo_2(SqStackS, int e) {
SqStack T;
intd;
while(!
S.tackEmpty()){
d=S。
Pop();
if(d!
=e)T.Push(d);
}
while(!
T.StackEmpty()){
d=T。
Pop();
T。
Push(d);
}
(1) 借助一个数组,将栈中的元素逆置。
(2)借助栈T,将栈S中所有值为e的数据元素删除之.
3.编写一个算法,将一个非负的十进制整数N转换为B进制数,并输出转换后的结果.当N=248D,B分别为8和16时,转换后的结果为多少?
#include“stack。
h”
intNumTrans( intN, int B) {//十进制整数N转换为B进制数
stack<int〉S;
//建立一个栈
while(N!
=0){// N非零
i=N%B;
//从低到高,依次求得各位
N=N/B;
S.push(i);
}//各位入栈
while(!
S.StackEmpty()) {// 栈不空
{i=S.pop();
If (i〉9)i=’A'
+10-i;
cout〈<
S.pop();
}// 依次出栈,得到从高到低的输出结果
}//#
4借且栈,设计算法:
假设一个算术表达式中包含“("
、“)”括号,对一个合法的数学表达式来说,括号“(”和“)"
应是相互匹配的。
若匹配,返回1;
否则,返回0.
以字符串存储表达式,也可以边输入边判断。
顺序扫描表达式,左括号,入栈;
右括号,如果此时栈空,表示多右括号,不匹配;
如果栈不空,出栈一个左括号。
扫描结束,如果栈空,表示括号匹配;
否则,括号不匹配,多左括号。
intblank_match(char *exp){用字符串存表达式
SqStack〈char>
s;
//创建一个栈
char *p=exp;
//工作指针p指向表达式首
while(*p!
=’=’){ //不是表达式结束符
switch(p){
case ’(’:
//左括号,入栈
s.push(ch);
break;
case’)'
//右括号
if (s.StackEmpty())return0;
// 栈空,不匹配,多右括号
else {s.Pop();
break;
}// 左括号出栈
}//switch
p++;
//取表达式下一个字符
}//while
if(!
s.StackEmpty())//表达式结束,栈不空
return0;
//不匹配