数据结构算法设计题复习题0001Word文档格式.docx
- 文档编号:21000166
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:53.32KB
数据结构算法设计题复习题0001Word文档格式.docx
《数据结构算法设计题复习题0001Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构算法设计题复习题0001Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
returnq—p;
returnp—q;
}}
3.假设线性表以带表头结点的循环单链表表示。
试设计一个算法,在线性表的第k个元素前插入新元素y。
假
如表长小于k,则插在表尾。
voidalgo1(LNode*h,intk,ElemTypey){
q=h;
P=h->
next;
j=1;
while(p!
=h&
j<
k){
q=p;
p=p->
j++;
s=(LNode*)malloc(sizeof(Lnode));
s->
data=y;
q->
next=s;
next=q;
4.二叉排序树的类型定义如下:
typedefstructBSTNode{//二叉排序树的结点结构
intdata;
//数据域
structBSTNode*lchild,*rchild;
//左、右孩子指针
}BSTNode,*BSTree;
设计递归算法,统计一棵二叉排序树T中值小于a的结点个数。
intf34(BSTreeroot)
{
intcount;
BSTNode*p;
p=root;
if(p&
p->
data<
a)count++;
f34(p->
returncount;
5.设二叉树T采用二叉链表结构存储,试设计算法求出二叉树中离根最近的第一个叶子结点。
(注:
结点按从
上往下,自左
至右次序编号)
BTNode*Firstleaf(BTNode*bt)
{InitQueue(Q);
//初始化队列Q
if(bt){
EnQueue(Q,bt);
;
while(!
EmptyQueue(Q)){
DeQueue(Q,p);
if(!
p->
lchild&
!
rchild)returnp;
if(p->
lchild)EnQueue(Q,p->
rchild)EnQueue(Q,p->
6.已知一棵具有n个结点的完全二叉树被顺序存储在一维数组中,结点为字符类型,编写算法打印出编号为k的
结点的双亲和孩子结点。
intalgo2(charbt[],intn,intk){
if(k<
1||k>
n)return0;
if(k==1)printf(
“%cisaroot
n”,bt[1]);
elseprintf(“%c'
sparentis%c
n”,bt[k],bt[k/2]);
if(2*k<
=n)printf(
“%c'
slchildis%c
n”,bt[k],bt[2*k]);
elseprintf(“%cis
notlchild
n”,bt[k]));
if(2*k+1<
srchildis%c
n”,bt[k],bt[2*k+1]);
notrchild
return1;
7.编写算法,将非空单链表hb插入到单链表ha的第i(0<
iw表长)个结点前。
intalgo1(LNode*ha,LNode*hb,inti){
for(p=hb;
next;
next);
for(j=1,q=ha;
j<
i;
j++)q=q_>
p_>
next=q_>
next=hb->
next;
设二叉树T已按完全二叉树的形式存储在顺序表T中,
顺序表T定义如下:
structtree{
{BTNode*p[MAX];
t=NULL;
for(i=0;
i<
N;
i++){
s=(BTNode*)malloc(sizeof(BTNode));
data=T[i].data;
s->
lchild=s->
rchild=NULL;
m=T[i].no;
p[m]=s;
if(m==1)t=s;
else{j=m/2;
if(m%2==0)p[j]->
lchild=s;
elsep[j]->
rchild=s;
}//slse
}//for
returnt;
}//creat_tree
9.编写算法判断带表头结点的单链表L是否是递增的。
若递增返回1否则返回0。
intalgo1(LNode*L)
L->
next)return1;
p=L->
while(p->
next){
if(p->
data<
next->
data)p=p->
elsereturn0;
10.假设一线性表由Fibonacci数列的前n(n》3)项构成,试以带表头结点的单链表作该线性表的存储结构,
设计算法建立该单链表,且将项数n存储在表头结点中。
Fibonacci数列根据下式求得:
1(n=1)
f(n)=1(n=2)
f(n-2)+f(n-1)(n>
3)
LNode*Creatlist(LNode*h,intn){
h=(LNode*)malloc(sizeof(Lnode));
h->
data=n;
next=p=(LNode*)malloc(sizeof(Lnode));
next=q=(LNode*)malloc(sizeof(Lnode));
data=q->
data=1;
for(i=3;
=n;
next=s=(LNode*)malloc(sizeof(Lnode));
data=p->
data+q->
data;
next=NULL;
p=q;
q=s;
returnh;
11.设二叉树T采用二叉链表结构存储,数据元素为字符类型。
设计算法将二叉链表中所有data域为小写字母
的结点改为大写
字母。
if(bt->
data>
='
a'
&
bt->
z'
)
bt->
data-=32;
algo2(bt->
12.假设线性表以带表头结点的循环单链表表示。
voidlnsertlist(LNode*h,intk,ElemTypey)
q_>
s_>
13.有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法在该链表中插入一个元素x,
使得插入后的单链表仍有序。
voidalgo1(LNode*H,ElemTpx)
s=(LNode*)malloc(sizeof(LNode));
data=x;
q=H;
p=H->
while(p&
=x)
next=p;
q->
14.二叉排序树的类型定义如下:
15.有一带表头结点的单链表,其结点的data域的类型为字符型,编写一个算法删除该链表中的数字字符。
voidDel_digit(LNode*h){
for(p=h;
){
q=p_>
if(q->
O'
q->
='
9'
{p->
next=q->
free(q);
}
elsep=q;
16.利用栈的基本运算,编写一个算法,实现将整数转换成二进制数输出。
voidreturnDtoO(intnum)
initStack(s);
while(n)
{k=n%2;
n=n/2;
push(s,k);
while(EmptyStack(s))
{pop(s,k);
printf(“%d,k);
17.设二叉树T采用二叉链表结构存储,数据元素为int型,试设计一个算法,若结点左孩子的data域的值大于
右孩子的data域的值,则交换其左、右子树。
voidalgo2(bitreptrbt){
bitreptrx;
if((bt->
bt->
rchild)&
(bt->
lchild->
rchild->
data)){
x=bt->
lchild;
lchild=bt->
rchild;
rchild=x;
18.设二叉树T采用二叉链表结构存储,试设计算法求出二叉树的深度。
intDeep(BTNode*bt){
if(bt==NULL)return0;
left=Deep(bt->
right=Deep(bt->
return(left>
right?
left:
right)+1;
19.设给定的哈希表存储空间为H(0〜M-1),哈希函数的构造方法为除留余数法”,处理冲突的方法为线性
探测法”,设计算法将元素e填入到哈希表中。
voidhash-insert(hashTableh[],intm,ElemTypee){
j=e%p;
if(h[j]!
=NULL)h[j]=e;
else{
do
{j=(j+1)%m;
}while(h[j]!
=NULL);
h[j]=e;
20.对于给定的十进制正整数,打印出对应的八进制正整数。
(利用栈)
voidDecToOct(intnum)
//初始化栈
{k=n%8;
n=n/8;
while(EmptyStack(s))//判断栈是否为空
printf(“%d,k);
21.一个正读和反读都相同的字符序列称为回文”。
例如“Jbcba”和1221”是回文,而abcde”不是回文。
试写
一个算法,要求利用栈的基本运算识别一个以@为结束符的字符序列是否是回文。
intPair(char*str){
InitStack(s);
p=str
for(;
*p!
@;
p++)
Push(s,*p);
while(StackEmpty(s)){
Pop(s,y);
if(y!
=*str++)return0;
22.有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法删除该链表中多余的元素值相同的结点(值相同的结点只保留一个)。
voidDelsame(LNode*h){
if(h->
next){
for(p=h->
if(p_>
data==q_>
data){
free(q);
23.编写一个算法,判断带表头结点的单链表是否递增有序。
intfun(LNode*h)
{p=h->
next)
{q=p->
if(q->
data)return0;
24.假设有两个带表头结点的单链表HA和HB设计算法将单链表HBf入到单链表HA勺第i(0<
iw表长)个结点
刖。
voidfun(LNode*ha,LNode*hb,inti)
{for(p=hb;
j++)
q=q_>
next=hb->
next;
free(hb);
25.假设以带头结点的单链表表示有序表,单链表的类型定义如下:
typedefstructnode{
DataTypedata;
structnode*next
}LinkNode,*LinkList;
编写算法,从有序表A中删除所有和有序表B中元素相同的结点。
(空)
26.设二叉树T采用二叉链表结构存储,数据元素为字符类型。
设计算法分别求出二叉链表中和数字字符的
结点个数。
intletter=0,digit=0;
/*全局变量*/
A'
>
itata<
Z'
->
ddta>
S>
bltata<
letter++;
0'
bata<
d)git++;
27.假设以单链表表示线性表,单链表的类型定义如下:
typedefstructnode{
structnode*next;
}LinkNode,*LinkList;
编写算法,将一个头指针为head且不带头结点的单链表改造为一个含头结点且头指针仍为表,并分析算法的时间复杂度。
LinkListf34(LinkListhead)
LinkListp,s;
p=head;
while(p->
next)p=p->
s=(LinkList)malloc(sizeof(LinkNode));
data域为英文字母
head的单向循环链
next=head;
next=s;
head=s;
returnhead;
时间复杂度为:
0(n)
28.假设有向图以邻接表方式存储,编写一个算法判别顶点Vi到顶点vj是否存在弧。
intlsArcs(ALgraphG,inti,intj){
/*判断有向图G中顶点i到顶点j是否有弧,是则返回1,否则返回0*/
p=G[i].firstarc;
while(p!
=NULL){
adjvex==j)
p=p->
nextarc;
return0;
29.设二叉树T采用二叉链表结构存储,数据元素为字符类型。
设计算法求出二叉链表中结点个数。
intcount=0;
/*count为全局变量*/
A&
Z)
count++;
30.假设带表头结点的双向循环链表定义如下:
typedefstructdunode{
chardata;
structdunode*prior,*next;
}DuNode;
现用该链表存放字符串,编写一个算法,判断该字符串是否中心对称关系。
例如字符串都是中心对称的。
intfun(DuNode*h)
q=h->
prior;
while(p!
=q&
prior!
=q)
data==p->
data)
{p=p->
q=q->
data域为大写字母的
“»
壬ft“
xyzzyx和xyzyx
31.假设以带头结点的单链表表示线性表,单链表的类型定义如下:
typedefintDataType;
structnode*next;
}LinkNode,*LinkList;
编写算法,删除线性表中最大元素(假设最大值唯一存在)。
函数原型为:
voidf34(LinkListhead);
voidf34(LinkListhead)
inte;
LinkListp,q,s,spre;
//s指向最大值的那个结点
spre=head;
s=head->
p=s->
while(p)
if(s->
{s=p;
spre=q;
e=s->
spre->
next=s->
free(s);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 设计 复习题 0001