整理算法设计练习题.docx

上传人:b****0 文档编号:253961 上传时间:2022-10-07 格式:DOCX 页数:13 大小:22.67KB
下载 相关 举报
整理算法设计练习题.docx_第1页
第1页 / 共13页
整理算法设计练习题.docx_第2页
第2页 / 共13页
整理算法设计练习题.docx_第3页
第3页 / 共13页
整理算法设计练习题.docx_第4页
第4页 / 共13页
整理算法设计练习题.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

整理算法设计练习题.docx

《整理算法设计练习题.docx》由会员分享,可在线阅读,更多相关《整理算法设计练习题.docx(13页珍藏版)》请在冰豆网上搜索。

整理算法设计练习题.docx

整理算法设计练习题

算法设计练习题

1、设一棵二叉树以二叉链表为存储结构,结点结构为

 lchild|data|rchild。

设计一个算法,求在前根序列中处于第k个位置的结点。

2、设某单链表L的结点结构为data|next,编写算法判断该链表的元素是否是递增的。

3、设有一单链表L,结点结构为data|next,结点个数至少3个,试画出链表L的结构图,并编写算法判断该单链表L中的元素是否成等差关系,即:

设各元素值次为a1,a2,a3,…,an,判断ai+1-ai=ai-ai-1是否成立,其中i满足2<=i<=n-1.

4、设有一棵二叉树以二叉链表作为存储结构,结点结构为lchild|data|rchild,其中data域中存放一个字符,设计一个算法按前根遍历顺序仅打印出data域为数字的字符(即‘0’<=data<=‘9’)

5、写出一个在带头结点的单链表上删除表中第i个结点的算法。

单链表的结点类型及单链表类型定义:

typedefstructnode

{DataTypedata;

structnode*next;

}Node,*LinkList;

6、给出求二叉树的结点数的算法。

二叉树的二叉链表存储表示:

typedefstructBiTNode

{DataTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

7.写出一个删除单链表的表头结点和表尾结点的算法。

单链表的结点类型及单链表类型定义:

typedefstructnode

{DataTypedata;

structnode*next;

}Node,*LinkList;

8、已知一带头结点的单链表,由头指针H指向,其结点的类型如下:

typedefstructnode

{elemtypedata;

structnode*next;

}NODE,*NODEPTR;

现要在链表中删除其关键字为aidkey的结点,其程序如下:

intdeletelm(NODEPTRH,keytypeaidkey)

/*若删除成功,则返回1,否则返回0*/

{NODEPTRpre,p;

pre=H;

p=H->next;

while(p&&p->data.key!

=aidkey)

{pre=p;

①;

}

if(p)

{②;

free(p);

return1;

}

elsereturn0;

}

9、已知待排序的线性表的结构定义如下:

#defineMAXSIZE200

typedefintkeytype;

typedefstruct

{keytypekey;

othertypeother;

}redtype;

typedefstruct

{redtyper[MAXSIZE];

intlength;

}sqlist;

其中L->r[0]用于作临时单元,数据从L->r[1]开始存放。

采用直接选择排序的算法如下:

voidinsertsort(sqlist*L)

{inti,j,k;

for(i=1;ilength;i++)

{k=i;

for(j=i+1;jlength;j++)

if(L->r[j].keyr[k].key)

③;

if(i!

=k)

{L->r[0]=L->r[i];

④;

L->r[k]=L->r[0];

}

}

}

10、编写一个函数:

将两个递增有序的单链表A和B归并生成一个递减有序的单链表C,要求利用原表(即A表和B表)的结点空间存放表C。

假设线性表的单链表存储结构如下:

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

11、试编写一个函数交换二叉树中所有结点的左、右子树。

假设二叉树采用二叉链表存储表示。

二叉树的二叉链表存储表示如下:

typdedefstructBTNode{

intdata;

structBTNode*lchild,*rchild;

}BTNode,*BTree;

12、已知单链表L中的结点是按值非递减有序排列的,试编写一个函数将值为x的结点插入表L中,使得L仍然有序。

线性表的单链表存储结构如下:

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

13、以二叉链表作为存储结构,试编写一个函数求二叉树中叶子数。

二叉树的二叉链表存储表示如下:

typdedefstructBTNode{

intdata;

structBTNode*lchild,*rchild;

}BTNode,*BTree;

14、假设在长度大于1的循环单链表中,既无头结点也无头指针。

s为指向链表中某个结点的指针,试编写一个函数删除结点*s的前趋结点。

线性表的单链表存储结构如下:

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

15、试编写一个函数求一棵二叉树中的结点数。

假设二叉树采用二叉链表存储表示。

二叉树的二叉链表存储表示如下:

typdedefstructBTNode{

intdata;

structBTNode*lchild,*rchild;

}BTNode,*BTree;

16、回文是指正读和反读均相同的字符序列,如“abba”和“abdba”等均是回文。

试编写一个函数判定给定字符串是否为回文。

17、将一个顺序表L中的元素逆置。

如:

L={a1,a2,…,an},则逆置后L={an,…,a2,a1}。

顺序表类型定义如下:

typedefstruct

{DataTypedata[MAXSIZE];

intlast;

}SeqList;

18、编写一个函数求二叉树的高度,假设二叉树采用二叉链表存储表示。

二叉树的二叉链表存储表示如下:

typdedefstructBTNode{

intdata;

structBTNode*lchild,*rchild;

}BTNode,*BTree;

19、已知在一维数组A[s+t]中依次存放着两个顺序表(a0,a1,...as-1,)和(b0,b1,...bt-1,),试编写一个函数,将数组中两个顺序表的位置互换,即将(b0,b1,...bt-1,)放在(a0,a1,...as-1,)的前面。

20、有一个单链表,其头指针为head,编写一个函数计算数据域为x的结点的个数。

线性表的单链表存储结构如下:

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

21、试编写一个函数,将一个有n个非零元素的整型一维数组A[n]拆分为两个一维数组,使得A[]中大于零的元素存放在B[]中,小于零的元素存放在C[]中。

参考答案

1.Bitreptrsearch(bitreptrt,intk)

{if(t!

=null)

{count++;

if(count==k)return(t);

else{search(t->lchild,k);

search(t->rchild,k);

}

}

}

3.Intisviser(lklistL)

{p=L;

while(p->next!

=null)

if(p->datanext->data)p=p->next;

elsereturn(0);

return

(1);

}

单链表的结构图如下图所示。

a1

a2

an

算法:

intisrise(lklistL)

{p=L->next;b=p->data–L->data;

while(p->next!

=NULL)

{q=p->next;

if(q->data–p->data!

=b)return(0)

elsep=q;

}

return

(1);

}

4.VoidNchar(bitreptrt)

{if(t!

=Null)

{if(t->data>=’0’)&&(t->data<=‘9’)printf(“%d”,t->data);

Nchar(t->lchild);

Nchar(t->rchild);

}

}

5.

voidDel_LinkList(LinkListL,inti)

{Node*p,*s;intj;

p=L;j=0;

while(p->next!

=NULL&&j

{p=p->next;j++;}

if(p==NULL)

{printf(“第i-1个结点不存在\n”);return;}

if(p->next==NULL)

{printf(“第i个结点不存在\n”);return;}

s=p->next;

p->next=s->next;

free(s);

}

6.

intnodes(BiTreet)

{intnl,nr;

if(t==NULL)return0;

if(t->lchild==NULL&&t->rchild==NULL)return1;

nl=nodes(t->lchild);

nr=nodes(t->rchild);

return(nl+nr+1);

}

7.

intdelht(Node*head)

{Node*q;

if(*head==NULL)

return0

{q=head->next;

free(*head);

*head=q;}

if(q!

=NULL)

{if(q->next==NULL)

{free(q);*head=NULL}}

else

{while(q->next->next!

=NULL)

q=q->next;

free(q->next);

q->next=NULL;}}return0;}

8.①p=p->next;②pre->next=p->next;

9.③k=j;④L->r[i]=L->r[k];

10、解:

分析:

设A,B,C均为不带头结点的单链表

(1)当有序表A,B均非空时,找出两表中元素最小的一个元素,然后将此结点插入到C表中,重复上述步骤。

(2)当A,B两表有一个为空表时,将另一表中元素顺序地插入到C表中。

(3)由于C按递减排序,因此在C表中插入元素时,应始终插入到C表表头。

LinkListWlink_llist(LinkListA,LinkListB)

{while((A!

=NULL)&&(B!

=NULL))

if(A->datadata){p=A;A=A->next;}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1