1. 程式人生 > >西南交通大學計算機專業考研真題答案詳解6:2012年演算法設計題

西南交通大學計算機專業考研真題答案詳解6:2012年演算法設計題

一、考研真題

1、下面是求兩個集合A和B的並集(AUB)的演算法,集合A和集合B分別用單鏈表La和Lb的帶頭結點的單鏈表表示(連結串列中的資料按升序排序),其並集用單鏈表Lc表示(帶頭結點,其資料也按升序排列),請填空完善演算法。(每空2分)。

2、對給定的帶頭結點的單鏈表L,結點值得型別為整型,編寫一個刪除L中值為x的演算法(L中可能有多個值為x的結點,且值得分佈具有隨機性)。(6分)

3、假設將迴圈佇列定義為:

typedef struct
{
	QElemType *base;
	int rear;//指向迴圈佇列中隊尾元素的位置
	int length;//表示佇列中所含資料元素的個數
}SqQueue;
SqQueue Q;

試給出次迴圈佇列的隊滿條件,並寫出相應的入佇列和出佇列演算法(在出佇列的演算法中要返回隊頭元素)。(8分)

4、編寫一個遞迴演算法,計算以二叉樹表示的二叉樹T的高度h。(6分)

二、真題解析

2、對給定的帶頭結點的單鏈表L,結點值得型別為整型,編寫一個刪除L中值為x的演算法(L中可能有多個值為x的結點,且值得分佈具有隨機性)。(6分)

typedef struct LNode
{
	int data;
	struct LNode* next;

}LNode,*LinkList;

void DeleteLNode(LNode* &L,int x)
{
	if (L==NULL)
	{
		return;
	}

	LNode *p,*q;
	p=L;
	while(p->next!=NULL)
	{
		if (p->next->data==x)
		{
			q=p->next;
			p->next=q->next;
			free(q);			

		}else{
			p=p->next;
		}
	}
	
}

3、試給出次迴圈佇列的隊滿條件,並寫出相應的入佇列和出佇列演算法(在出佇列的演算法中要返回隊頭元素)。(8分)

//入隊
int EnCQueue(SqQueue &Q, QElemType x)
{
	if(Q.length == MAXQSIZE){
		return -1;//迴圈佇列滿
	}
	Q.base[Q.rear] = x;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	++Q.length;//當前元素個數+1
	return 0;
}
//出隊
int DeCQueue(SqQueue &Q, QElemType &x)
{    
	if(Q.length==0){
		return -1;//迴圈佇列空
	}
	int font=(Q.rear+MAXQSIZE-Q.length)%MAXQSIZE;
	x = Q.base[font];
	--Q.length;//當前元素個數-1
	return 0;
}    

4、編寫一個遞迴演算法,計算以二叉樹表示的二叉樹T的高度h。(6分)

int Heigh(BTNode* btree)
{
	if (btree == NULL)
	{
		return 0;
	}
	int lheight, rheight;
	lheight = Heigh(btree->lchild);
	rheight = Heigh(btree->rchild);
	if (lheight>rheight)
	{
		return lheight + 1;
	}
	else {
		return rheight + 1;
	}
}