I wrote code for the overloaded = operator for a linked list, but for some reason it does nothing, and I cannot understand why.
the class containing the linked list is called String, and the struct ListNode is the nodes themselves.
ListNode:
struct ListNode
{
char info;
ListNode * next;
ListNode(char newInfo, ListNode * newNext)
: info( newInfo ), next( newNext )
{
}
};
String
class String {
private:
ListNode* head;
public:
String( const char * s = "");
String( const String & s );
String operator = ( const String & s );
~String();
}
ostream & operator << ( ostream & out, String& str );
istream & operator >> ( istream & in, String & str );
String.cpp:
String::String( const char * s) {
if (s == "") {
head = NULL;
return;
}
ListNode* newNode = new ListNode(s[0], NULL);
head = newNode;
ListNode* current = head;
for (int i = 1; s[i] != 0; current = current->next) {
current->next = new ListNode(s[i], NULL);
++i;
}
}
String::String(const String& s ) {
ListNode* current = new ListNode((s.head)->info, NULL);
head = current;
for(ListNode* sstart = s.head->next; sstart != NULL; sstart = sstart->next) {
current->next = new ListNode(sstart->info, NULL);
current = current->next;
}
}
String& String::operator = ( const String & s ) {
ListNode* start = head;
ListNode* tmp;
while(start != NULL) {
tmp = start->next;
delete start;
start = tmp;
}
head = NULL;
if (s.head == NULL)
return *this;
ListNode* current = new ListNode((s.head)->info, NULL);
head = current;
for(ListNode* sstart = s.head->next; sstart != NULL; sstart = sstart->next) {
current->next = new ListNode(sstart->info, NULL);
current = current->next;
}
return *this;
}
String::~String() {
ListNode* nextNode = head;
ListNode* tmp;
while(nextNode) {
tmp = nextNode->next;
delete nextNode;
nextNode = tmp;
}
}
ostream & operator << ( ostream & out, String& str) {
for (int i = 0; i < str.length(); ++i) {
out << str[i];
}
return out;
}
istream & operator >> ( istream & in, String & str ) {
int len = in.gcount();
char* buf = new char[len];
char inChar;
for(int i = 0; in >> inChar; ++i) {
buf[i] = inChar;
}
String tmp(buf);
str = tmp;
}
In the first loop, I delete the linked list that the head points to. After that, I set my head to NULL for the case when s does not contain anything. If this is not the case, I set the current as a copy of the first ListNode to s and save the current in the head (if I cross with the head, I lose the pointer to the beginning of the list). Finally, my second loop will βattachβ the rest of s to the current.
, . , , , , , - . ?
EDIT: , .