西南交通大学计算机专业考研真题答案详解7:2011年算法设计题

更多西南交通大学真题,参考:西南交通大学计算机考研——数据结构真题系列

一、考研真题

3、写一个算法,将单链表中值重读的结点删除,使所得的结果表中个结点值均为不相同(假设单链表中包含一个头结点)。(6分)

4、设有两个证书集合A和B,分别用递增有序链表表示,设计一个算法实现两个集合的交运算,运算结果也用递增有序链表表示。运算后,A、B两个链表保持不变。(8分)

二、真题解析

3、写一个算法,将单链表中值重读的结点删除,使所得的结果表中个结点值均为不相同(假设单链表中包含一个头结点)。(6分)

void Delete(LNode* &L)
{
	LNode *p,*q,*s;
	p = L->next;
	while (p->next&&p->next->next)
	{
		q = p;
		while (q->next)
		{
			if (p->data==q->next->data)
			{
				s = q->next;
				q->next = s->next;
				//free等价于后面两句,课本上为了便于理解写的伪代码,考试写free或者delete s;s=NULL;都可以
				//free(s);
				delete s;
				s = NULL;
			}
			else
			{
				q = q->next;
			}//if
		}//while
		p = p->next;
	}
}

该题与2008年第三题题似,都是删除链表重复元素,但区别在于是否为有序链表;

4、设有两个证书集合A和B,分别用递增有序链表表示,设计一个算法实现两个集合的交运算,运算结果也用递增有序链表表示。运算后,A、B两个链表保持不变。(8分)

LNode* Intersection(LNode* La,LNode* Lb)
{
	if (La==NULL||Lb==NULL)
	{
		return NULL;
	}

	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)
	{
		if (pA->data == pB->data)
		{
			LNode *pNode = new LNode();
			pNode->data = pA->data;
			//插入新建结点
			pNode->next = pCEnd->next;
			pCEnd->next = pNode;
			pCEnd=pNode;
			//相等,同时后移
			pA = pA->next;
			pB = pB->next;
		}
		else if (pA->data > pB->data)
		{
			//最小的相比,B小 B后移
			pB = pB->next;
		}
		else
		{
			//最小的相比,A小 A后移
			pA = pA->next;
		}
	}
	return pCHead;
}

此函数的测试代码参见:数据结构:求两个有序列表的交集

更多西南交通大学真题,参考:西南交通大学计算机考研——数据结构真题系列

你可能感兴趣的:(考研真题)