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

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

一、考研真題

3、設計一演算法,實現在資料元素有序的順序儲存結構的線性表中插入一個值為x的操作。如果無儲存空間則插入失敗,函式的返回值為插入成功與否的標誌。(8分)

4、設有兩個整數集合A和B,分別用遞增有序連結串列表示,設計一演算法實現兩個集合的聯合運算,運算結果也有遞增有序連結串列表示。運算後,A、B兩個連結串列保持不變。(8分)

二、真題解析

3、設計一演算法,實現在資料元素有序的順序儲存結構的線性表中插入一個值為x的操作。如果無儲存空間則插入失敗,函式的返回值為插入成功與否的標誌。(8分)

#define QElemType int
#define MaxQSize 100 //佇列最大元素個數
typedef struct
{
	QElemType *base;
	int rear;//指向迴圈佇列中隊尾元素的位置
	int length;//表示佇列中所含資料元素的個數
	
}SqQueue;
SqQueue Q;
int InsertQueue(SqQueue &L,int x)
{
	//佇列以滿,插入失敗
	if (L.length>=MaxQSize) 
		return -1;	
	if(L.length<2)return -1;

	int flag;//佇列增序1,減序-1
	if (L.base[L.length-1]-L.base[0]>=0)
	{
		flag=1;
	} 
	else
	{
		flag=-1;
	}
	int m_index;
	for (int i=L.length-1;i>=0;i--)
	{
		if (flag*(L.base[i]-x)<0)
		{
			m_index=i;
			break;
		}else{
			L.base[i+1]=L.base[i];
		}
	}
	L.base[m_index+1]=x;
	L.length++;
	return 0;
}

4、設有兩個整數集合A和B,分別用遞增有序連結串列表示,設計一演算法實現兩個集合的聯合運算,運算結果也有遞增有序連結串列表示。運算後,A、B兩個連結串列保持不變。(8分)

LNode* Union(LNode* La,LNode* Lb)
{
	if (La==NULL&&Lb==NULL)	
		return NULL;
	if(La==NULL&&Lb!=NULL)
		return Lb;
	if(La!=NULL&&Lb==NULL)
		return La;

	LNode *pCHead = NULL; //A與B交集頭
	LNode *pCEnd = NULL;  //A與B交集尾
	//建立頭結點
	pCHead = new LNode();	
	pCHead->next = NULL;
	pCEnd = pCHead;

	LNode *pA = La->next; //指向有序列表A第一個結點
	LNode *pB = Lb->next; //指向有序列表B第一個結點
	while (pA != NULL && pB != NULL)
	{
		int data;
		if (pA->data == pB->data)
		{
			data = pA->data;
			//相等,同時後移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			data= pB->data;
			//最小的相比,B小 B後移
			pB = pB->next;
		}
		else
		{
			data = pA->data;
			//最小的相比,A小 A後移
			pA = pA->next;
		}

		LNode *pNode = new LNode();
		pNode->data = data;
		//插入新建結點
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;
	}

	if (pB!=NULL)
	{
		pA=pB;
	}

	while (pA!=NULL)
	{
		LNode *pNode = new LNode();
		pNode->data = pA->data;
		//插入新建結點
		pNode->next = pCEnd->next;
		pCEnd->next = pNode;
		pCEnd=pNode;

		pA=pA->next;
	}
	return pCHead;
}