数据结构、算法与应用第六章14-20答案

因为之前的数组线性表的代码丢失,我也懒得去找了,所以11-13无法去做

14:

template<class T>
void chain<T>::leftShift(int i) {
	chainNode<T>* temporaryNode = firstNode;
	for (int j = 0; j != i; j++) {
		temporaryNode = firstNode->next;
		delete firstNode;
		firstNode = temporaryNode;
	}
	listSize = listSize - i;
}

15:

void chain<T>::reverse() {
	chainNode<T>* temporaryNode = firstNode;
	firstNode = firstNode->next;
	temporaryNode->next = NULL;
	chainNode<T>* cNode = firstNode->next;
	for (int i = 0; i != listSize - 3; i++) {
		firstNode->next = temporaryNode;	
		temporaryNode = firstNode;
		firstNode = cNode;
		cNode = firstNode->next;
	}
	firstNode -> next = temporaryNode;
	cNode->next = firstNode;
	firstNode = cNode;
}

16:

	void friend reverse1(chain<T>& theChain) {
		for (int i = 0; i !=theChain.listSize / 2; i++) {
			T& j = theChain.get(i);
			T& k = theChain.get((theChain.listSize) - i-1);
			cout << k << endl;
			theChain.set(i, k);
			theChain.set(theChain.listSize - i-1, i);
		}
	}

17:

	friend void meld(extendedChain<T>& a, extendedChain<T>& b,extendedChain<T>& c) {
		c.clear();
		chainNode<T>* cNode = a.chain<T>::firstNode;
		chainNode<T>* aNode = a.chain<T>::firstNode;
		chainNode<T>* bNode = b.chain<T>::firstNode;
		if (a.chain<T>::listSize >= b.chain<T>::listSize) {
			for (int j = 0; j != b.chain<T>::listSize; j++) {
				c.push_back(aNode->element);
				aNode = aNode->next;
				c.push_back(bNode->element);
				bNode = bNode->next;
			}
			int i = a.chain<T>::listSize - b.chain<T>::listSize;
			for (int j = 0; j != i; j++) {
				c.push_back(aNode->element);
				aNode = aNode->next;
			}
		}
		else {
			for (int j = 0; j != a.chain<T>::listSize; j++) {
				c.push_back(aNode->element);
				aNode = aNode->next;
				c.push_back(bNode->element);
				bNode = bNode->next;
			}
			int i = b.chain<T>::listSize - a.chain<T>::listSize;
			for (int j = 0; j != i; j++) {
				c.push_back(bNode->element);
				bNode = bNode->next;
			}
		}

	}

确实具有线性复杂度,显然复杂度为2*(Na+Nb)。

18:

template<class T>
void chain<T>::meld(chain<T>& a, chain<T>& b)
{
	firstNode = a.firstNode;
	chainNode<T>* cNode = firstNode;
	chainNode<T>* aNode = a.firstNode;
	chainNode<T>* bNode = b.firstNode;
	aNode = aNode->next;
	cNode->next = bNode;
	chainNode<T>* dNode = bNode->next;

	bNode = bNode->next;
	cNode = cNode->next;


	if (a.listSize >= b.listSize) {
		
		for (int j = 0; j != b.listSize-2; j++) {
			cNode->next = aNode;
			aNode = aNode->next;
			cNode = cNode->next;
			cNode->next = bNode;
			bNode = bNode->next;
			cNode = cNode->next;

		}
		cNode->next = aNode;
		cNode = cNode->next;
		aNode = aNode->next;
		cNode->next = bNode;
		cNode = cNode->next;
		int i = a.listSize - b.listSize;
		for (int j = 0; j != i; j++) {
			cNode->next = aNode;
			aNode = aNode->next;
			cNode = cNode->next;
		}
	}
	else {
		for (int j = 0; j != a.listSize-2; j++) {
			cNode->next = aNode;
			aNode = aNode->next;
			cNode = cNode->next;
			cNode->next = bNode;
			bNode = bNode->next;
			cNode = cNode->next;
		}
		cNode->next = aNode;
		cNode = cNode->next;
		cNode->next = bNode;
		bNode = bNode->next;
		cNode = cNode->next;
		int i = b.listSize - a.listSize;
		for (int j = 0; j != i; j++) {
			cNode->next = bNode;
			bNode = bNode->next;
			cNode = cNode->next;
		}
	}
	listSize = a.listSize + b.listSize;
}

19:

	friend void merge(extendedChain<T>& a, extendedChain<T>& b, extendedChain<T>& c) {
		int i = a.chain<T>::listSize;
		int j = b.chain<T>::listSize;
		c.clear();
		chainNode<T>* aNode = a.chain<T>::firstNode;
		chainNode<T>* bNode = b.chain<T>::firstNode;
		if (aNode->element >= bNode->element) {
			c.push_back(bNode->element);
			/*chainNode<T>* cNode = b.chain<T>::firstNode;*/
			bNode = bNode->next;
			j--;
		}
		else {
			c.push_back(aNode->element);
			/*chainNode<T>* cNode = a.chain<T>::firstNode;*/
			aNode = aNode->next;
			i--;
		}
		while (i != 0&&j != 0) {
			if (aNode->element >= bNode->element) {
				c.push_back(bNode->element);
				j--;
				if (j != 0) {
					bNode = bNode->next;;
				}
			}
			else {
				c.push_back(aNode->element);
				i--;
				if (i!= 0) {
					aNode = aNode->next;;
				}
			}
		}
		if (i == 0) {
			for (int k = 0; k != j; k++) {
				c.push_back(bNode->element);
				if (k != j-1) {
					bNode = bNode->next;;
				}
			}
		}
		else {
			for (int k = 0; k != i; k++) {
				c.push_back(aNode->element);
				if (k!= i-1) {
					aNode = aNode->next;;
				}
			}
		}
	
	}

20:

void chain<T>::merge(chain<T>& a, chain<T>& b)
{
	int i = a.listSize;
	int j = b.listSize;
	for (int i = 0; i != listSize; i++) {
		chainNode<T>* cNode = firstNode;
		delete firstNode;
		firstNode = firstNode->next;
	}
	listSize = 0;
	chainNode<T>* aNode = a.firstNode;
	chainNode<T>* bNode = b.firstNode;
	if (aNode->element >= bNode->element) {
		firstNode = b.chain<T>::firstNode;
		bNode = bNode->next;
		j--;
		listSize++;
	}
	
	else {
		firstNode = a.chain<T>::firstNode;
		aNode = aNode->next;
		i--;
		listSize++;
	}
	chainNode<T>* cNode = firstNode;
	while (i != 0 && j != 0) {
		if (aNode->element >= bNode->element) {
			cNode->next = bNode;
			cNode = cNode->next;
			j--;
			listSize++;
			if (j != 0) {
				bNode = bNode->next;;
			}
		}
		else {
			cNode->next = aNode;
			cNode = cNode->next;
			i--;
			listSize++;
			if (i != 0) {
				aNode = aNode->next;;
			}
		}
	}
	if (i == 0) {
		for (int k = 0; k != j; k++) {
			cNode->next = bNode;
			cNode = cNode->next;
			listSize++;
			if (k != j - 1) {
				bNode = bNode->next;;
			}
		}
	}
	else {
		for (int k = 0; k != i; k++) {
			cNode->next = aNode;
			cNode = cNode->next;
			listSize++;
			if (k != i - 1) {
				aNode = aNode->next;;
			}
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值