数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4-1 另类堆栈(10分)
在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满?
函数接口定义:
裁判测试程序样例:
bool Push( Stack S, ElementType X )
{
if(S->Top==S->MaxSize)
{
printf("Stack Full\n");
return false;
}
else
{
S->Data[S->Top]=X;
S->Top++;
}
return true;
}
ElementType Pop( Stack S )
{
if(S->Top==0)
{
printf("Stack Empty\n");
return ERROR;
}
else
{
S->Top--;
}
return S->Data[S->Top ];
}
4-2 二叉搜索树的操作集(20分)
本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:
∙
∙
∙
指针;
∙
∙
裁判测试程序样例:
BinTree Insert( BinTree BST, ElementType X ){
if(!BST) {
BST = (BinTree)malloc(sizeof(struct TNode));
BST ->Data = X;
BST ->Left = BST ->Right = NULL;
}else {
if(X < BST ->Data )
{
BST ->Left = Insert(BST ->Left, X);
}
else if(X > BST ->Data ) {
BST ->Right = Insert(BST ->Right, X);
}
}
return BST;
}
BinTree Delete( BinTree BST, ElementType X ){
Position Tmp;
if(!BST) printf("Not Found\n");
else {
if( X < BST->Data)
BST ->Left = Delete(BST->Left, X); else if(X > BST->Data )
BST ->Right = Delete(BST->Right , X); else { if(BST->Left && BST->Right) { Tmp=FindMin(BST->Right); BST->Data = Tmp ->Data;
BST->Right=Delete(BST->Right,BST->Data); }else { Tmp = BST;
if(!BST->Left) BST = BST->Right; else if(!BST->Right) BST = BST->Left; free(Tmp); }
}
}
return BST;
}
Position Find( BinTree BST, ElementType X ){
if(!BST) return NULL;
if(BST->Data==X) return BST;
if(X>BST->Data) return Find(BST->Right,X);
if(X
}
Position FindMin( BinTree BST ){
if(BST){
while(BST->Left){
BST=BST->Left;
}
}
return BST;
}
Position FindMax( BinTree BST ){
if(BST){
while(BST->Right){
BST=BST->Right;
}
}
return BST;
}
4-4 求二叉树高度(20分) 本题要求给定二叉树的高度。
函数接口定义:
要求函数返回给定二叉树BT的高度值。裁判测试程序样例:
输出样例(对于图中给出的树):
int GetHeight( BinTree BT )
{
int LD,RD;
if(BT == NULL){
return 0;
}
else{
LD = GetHeight(BT->Left);
RD = GetHeight(BT->Right);
return (LD>RD?LD:RD)+1;
}
}
4-5 链表拼接(20分)
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:
函数接口定义:
指针。
裁判测试程序样例:
tNode *list2)
{
struct ListNode *p1,*p2,*p3,*t;
p3=list2;
do
{
t=p3;
p3=p3->next;
p2=p1=list1;
while(p1!=NULL)
{
if(p1->data>=t->data)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1==NULL)
{
p2->next=t;
t->next=NULL;