Mar.23
題目
Write a program that concatenates two linked list objects of characters. The program should include function concatenate, which takes references to both list objects as arguments and concatenates the second list to the first list.
Sample Run
The list is: a b c d e
The list is: f g h i j
Concatenate the 2 lists means appending second list to first list
start the concatenation.
Create a copy of second list
...remove value from copied list: f
...insert at end of first list: f
...remove value from copied list: g
...insert at end of first list: g
...remove value from copied list: h
...insert at end of first list: h
...remove value from copied list: i
...insert at end of first list: i
...remove value from copied list: j
...insert at end of first list: j
Display the copied list.
The list is empty
end the concatenation.
Start the destructor
The list is empty ...
End the destructor.
The first list after concatenation is:
The list is: a b c d e f g h i j
Start the destructor
Destroying nodes ...
f
g
h
i
j
All nodes destroyed
End the destructor.
Start the destructor
Destroying nodes ...
a
b
c
d
e
f
g
h
i
j
All nodes destroyed
End the destructor.
寫(xiě)代碼
/*******************************************************************
* CIS22B Exercise 17.1
* Author :?
* Description: This program concatenates two list objects of characters.
*? ? ? ? ? ? ? linklistc concatenate (linklistc, linklistc)
* Date : Mar.19, 2018
*******************************************************************/
#include<iostream>
#include<string>
using namespace std;
// Specification file for the CharList class
#ifndef CHARLIST_H
#define CHARLIST_H
class CharList{
private:
// Declare a structure for the list
? ? struct ListNode
? ? {
char value;? // The value in this node
? ? ? ? struct ListNode *next;? // To point to the next node
? ? };
? ? ListNode *head;
public:
// Constructor
? ? CharList()
{
head =nullptr;
? ? }
//Destructor
? ? ~CharList();
? ? //Linked list operations
? ? void appendNode(char);
? ? void concatenate(CharList &);
? ? void showList();
? ? bool isEmpty();
};
#endif
void CharList::appendNode(char c) {
ListNode *newNode; // To point to a new node, must be a pointer
? ? ListNode *nodePtr; // To move through the list
// Allocate a new node and store char there
? ? newNode =new ListNode;
? ? newNode ->value = c;
? ? newNode ->next =nullptr;
? ? //If there are no nodes in the list
//make newNode the first node.
? ? if(!head)
head = newNode;
? ? else // Otherwise, insert new node at end.
? ? {
// Initialize nodeptr to head of list.
? ? ? ? nodePtr =head;
? ? ? ? //Find the last node in the list.
? ? ? ? while (nodePtr->next)
nodePtr = nodePtr->next;
? ? ? ? // Insert newNode as the last node.
? ? ? ? nodePtr ->next = newNode;
? ? }
}
void CharList::showList(){
ListNode *nodeptr;
? ? if(!head)
return;
? ? else{
nodeptr =head;
? ? ? ? while(nodeptr){
cout<< nodeptr->value << " ";
? ? ? ? ? ? nodeptr = nodeptr ->next;
? ? ? ? }
}
}
bool CharList::isEmpty() {
if(!head)
return true;
? ? else
? ? ? ? return false;
}
void CharList::concatenate(CharList &l2){
ListNode *firstNode2;? // For tranverse L2
? ? ListNode *lastNode1; // For tranverse list
// ListNode *tempNode; // For get the oringin list l2;
//tempNode = l2.head;
// Find the end of list l1(this list)
? ? if(head)
{
lastNode1 =head;
? ? ? ? while(lastNode1->next)
{
lastNode1 = lastNode1->next;
? ? ? ? }
}
else
? ? {
lastNode1 =head;
? ? }
// Find the first node of l2
? ? while(l2.head !=nullptr)
{
//Remove the first
? ? ? ? firstNode2 = l2.head;
? ? ? ? //firstNode2->next = nullptr;
? ? ? ? cout<< "...remove value from copied list: " << firstNode2->value <
? ? ? ? lastNode1->next = firstNode2;
? ? ? ? lastNode1 = firstNode2;
? ? ? ? cout<<"...insert at end of first list: " << firstNode2->value << endl;
? ? ? ? l2.head = l2.head->next;
? ? }
//cout << "\ntemp:" << tempNode->value<
}
// Destructor
// This function deletes every node in the list.
CharList:: ~CharList() {
ListNode * nodePtr; // To traverse the list
? ? ListNode * nextNode; // To point to the next node
// Position nodePtr at the head of the list.
? ? nodePtr =head;
? ? // While nodePtr is not at the end of the list...
? ? while (nodePtr !=nullptr)
{
//Save a pointer to the next node.
? ? ? ? nextNode = nodePtr->next;
? ? ? ? // Delete the current node.
? ? ? ? delete nodePtr;
? ? ? ? // Position nodePtr at the next node.
? ? ? ? nodePtr = nextNode;
? ? }
}
int main(){
// Create Char
? ? CharList l1, l2;
? ? l1.appendNode('a');
? ? l1.appendNode('b');
? ? l1.appendNode('c');
? ? l1.appendNode('d');
? ? l1.appendNode('e');
? ? cout<< "The list is: " ;
? ? l1.showList();
? ? l2.appendNode('f');
? ? l2.appendNode('g');
? ? l2.appendNode('h');
? ? l2.appendNode('i');
? ? l2.appendNode('j');
? ? cout<< "\nThe list is: ";
? ? l2.showList();
? ? cout<< endl;
? ? l1.concatenate(l2);
? ? cout<< "\nDisplay the copied list.\n";
? ? l2.showList();
? ? if(l2.isEmpty())
{
cout<< "The list is empty." << endl;
? ? ? ? cout<< "\nend the concatenation." <
? ? }
else
? ? ? ? cout<< "The list is not empty, there must be sonthing wrong." <
? ? cout<< "Start the destructor"<
? ? cout<< "Destroying nodes... "<
? ? l1.~CharList();
}