整理算法设计练习题.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;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;}