算法设计练习题.docx
- 文档编号:5355104
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:13
- 大小:19.18KB
算法设计练习题.docx
《算法设计练习题.docx》由会员分享,可在线阅读,更多相关《算法设计练习题.docx(13页珍藏版)》请在冰豆网上搜索。
算法设计练习题
算法设计练习题
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;i
{k=i;
for(j=i+1;j
if(L->r[j].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->data
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->data else p->next=C;C=p; } if(A==NULL)A=B; while(A! =NULL) {p=A;A=A->next; p->next=C;C=p;} return(C); } 11、解: 采用后根遍历递归访问的方法,交换每一个结点的左右子树。 Voidexchg_tree(BTreeBT) {if(BT! =null)/*非空*/ {exchg_tree(BT->lchild);/*交换左子树所有结点指针*/ exchg_tree(BT->rchild);/*交换右子树所有结点指针*/ p=BT->lchild;/*交换根结点左右指针*/ BT->lchild=BT->rchild;->rchild=p; } } 12、解: 分析: 首先从表头开始查找待插入位置的直接前趋,找到后,插入待插结点。 /*设L表带头结点*/ voidCR_lklist(LinkListL,intx) {LNode*p,q,s; q=L;p=q->next; s=(LNode*)malloc(sizeof(LNode));s->data=x;/*生成待插结点,用s指向*/ while((p! =NULL)&&(p->data /*查找插入位置的直接前驱,用q指向*/ s->next=p;q->next=s;/*插入*/ } 13、解: 本算法的基本思想是: 先求左子树的叶子数,再求右子树的叶子数,两者相加就是对应二叉树的叶子数。 intleafcount(BTreeT)/*求二叉树T的叶子数*/ {intleaf; if(T==NULL)leaf=0;/*当二叉树为空时,叶子数等于0*/ elseif(T->lchild==NULL)&&(T->rchild==NULL)leaf=1; /*当二叉树仅含一个根结点时,叶子数为1*/ else{L=leafcount(T->lchild);/*求左子树的叶子数*/ R=leafcount(T->lchild);/*求右子树的叶子数*/ leaf=L+R;/*左、右子树叶子数之和等于二叉树的叶子数*/ } return(leaf); } 14.解: 分析: 设置两个指针,分别指向*S及其后继,然后按循环链表特性,顺序往下查找*s的直接前趋,找到后删除。 voidDELETE_Xlklist(LinkLists) {LNode*p,*q; p=s;q=p->next; while(q->nest! =s) {p=q;q=q->next;} p->next=s;free(q); } 15、解: intBTreeCount(BTreebt) {if(bt==NULL)return0; elsereturnBTreeCount(bt->lchild)+BTreeCount(bt->rchild)+1; } 16、解: #defineMAXSIZE100 typedefstruct{ intdata[MAXSIZE]; inttop; }SqStack;/*栈的顺序存储表示*/ intexample(chara[]) {SqStacks;intn,i; InitStack(&s);n=strlen(a); for(i=0;i i=n/2; while(i if(i>=n)return1; elsereturn0; } 17、解: voidinsersion(SeqList*L) {inti,j,t; for(i=0,j=L->last;i t=L->data[i];L->data[i]=L->data[j];L->data[j]=t; } 18、解: inthighttree(BTreet) {inth,hl,hr; if(t==NULL)h=0; else {highttree(t->lchild,h1); highttree(t->rchild,hr); if(h1>=hr)h=h1+1; } return(h); } 19、解: #definempn20 typedefintDataType; voidinverse(DataTypeA[],intst,inted); voidexchange(DataTypeA[],intm,intn) { inverse(A,0,m+n-1); inverse(A,0,n-1); inverse(A,n,m+n-1); } voidinverse(DataTypeA[],intst,inted) { intmd=(st+ed)/2; for(inti=0;i {DataTypetemp=A[st+i];A[st+i]=A[ed-i];A[ed-i]=temp;} } 20、解: intcount(LNode*head) {LNode*p;intn=0; p=head; while(p! =NULL) {if(p->data==x)n++; p=p->next; } return(n); } 21、解: voidfenjie(intA[],intB[],intC[],intn) {inti,j,k; i=j=-1; for(k=0;k if(A[k]>0)B[++i]=A[k]; elseC[++j]=A[k]; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 练习题