因为之前的数组线性表的代码丢失,我也懒得去找了,所以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;;
}
}
}
}