#include <iostream>
struct Snode
{
char data;
int count;
Snode *next = nullptr;
Snode(char a, int c = 1) : data(a), count(c) {}
};
class set
{
private:
Snode *head = nullptr;
Snode *tail = nullptr;
void append(char value, int count)
{
Snode *temp = new Snode(value, count);
if (!head)
head = temp;
if (tail)
tail->next = temp;
tail = temp;
}
void remove(Snode *node, Snode *previous)
{
if (previous)
previous->next = node->next;
if (head == node)
head = node->next;
if (tail == node)
tail = previous;
delete node;
}
void swap(set &other)
{
Snode *ptr = head;
head = other.head;
other.head = ptr;
ptr = tail;
tail = other.tail;
other.tail = ptr;
}
public:
set() = default;
set(const set &src)
{
Snode *temp = src.head;
while (temp)
{
append(temp->data, temp->count);
temp = temp->next;
}
}
set(set &&src)
{
src.swap(*this);
}
~set()
{
Snode *temp = head;
while (temp)
{
Snode *next = temp->next;
delete temp;
temp = next;
}
}
set& operator=(const set &rhs)
{
if (&rhs != this)
{
set temp(rhs);
temp.swap(*this);
}
return *this;
}
set& operator=(set &&rhs)
{
rhs.swap(*this);
return *this;
}
bool isAvailable(char value)
{
return (find(value) != nullptr);
}
Snode* find(char value, Snode **previous = nullptr)
{
if (previous)
*previous = nullptr;
Snode *temp = head;
Snode *prev = nullptr;
while (temp)
{
if (temp->data == value)
{
if (previous)
*previous = prev;
return temp;
}
temp = temp->next;
}
return nullptr;
}
bool isFirst(char value)
{
return ((head) && (head->data == value));
}
bool isLast(char value)
{
return ((tail) && (tail->data == value));
}
void display()
{
Snode *temp = head;
while (temp)
{
std::cout << temp->data << " " << temp->count << std::endl;
temp = temp->next;
}
}
void insert(char value)
{
Snode *temp = find(value);
if (temp)
temp->count += 1;
else
append(value, 1);
}
int count(char value)
{
Snode *temp = find(value);
return (temp) ? temp->count : 0;
}
void deleteFirst()
{
if (head)
remove(head, nullptr);
}
void deleteLast()
{
if (head)
{
Snode *last = head;
Snode *previous = nullptr;
while (last->next)
{
previous = last;
last = last->next;
}
remove(last, previous);
}
}
void remove(char value)
{
Snode *previous;
Snode *temp = find(value, &previous);
if (temp)
{
if (temp->count > 1)
temp->count -= 1;
else
remove(temp, previous);
}
}
};
int main()
{
//defining a mySet as a "set" type
set mySet;
//adding values to create nodes
mySet.insert('c');
mySet.insert('a');
mySet.insert('a');
mySet.insert('c');
mySet.insert('c');
set myCopiedSet = mySet; // make a copy of the list
//adding more values to create nodes
myCopiedSet.insert('a');
myCopiedSet.insert('b');
myCopiedSet.insert('b');
myCopiedSet.insert('c');
// another test
set myTestSet;
myTestSet.insert('c');
myTestSet.insert('c');
myTestSet.insert('j');
myTestSet.insert('j');
myTestSet.insert('j');
myTestSet.insert('r');
//displaying nodes through "value count" format
std::cout << "original:" << std::endl;
mySet.display();
std::cout << "copy:" << std::endl;
myCopiedSet.display();
std::cout << "test:" << std::endl;
myTestSet.display();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFNub2RlCnsKICAgIGNoYXIgZGF0YTsKICAgIGludCBjb3VudDsKICAgIFNub2RlICpuZXh0ID0gbnVsbHB0cjsKICAgIFNub2RlKGNoYXIgYSwgaW50IGMgPSAxKSA6IGRhdGEoYSksIGNvdW50KGMpIHt9Cn07CgpjbGFzcyBzZXQKewpwcml2YXRlOgogICAgU25vZGUgKmhlYWQgPSBudWxscHRyOwogICAgU25vZGUgKnRhaWwgPSBudWxscHRyOwoKICAgIHZvaWQgYXBwZW5kKGNoYXIgdmFsdWUsIGludCBjb3VudCkKICAgIHsKICAgICAgICBTbm9kZSAqdGVtcCA9IG5ldyBTbm9kZSh2YWx1ZSwgY291bnQpOwoKICAgICAgICBpZiAoIWhlYWQpCiAgICAgICAgICAgIGhlYWQgPSB0ZW1wOwoKICAgICAgICBpZiAodGFpbCkKICAgICAgICAgICAgdGFpbC0+bmV4dCA9IHRlbXA7CiAgICAgICAgdGFpbCA9IHRlbXA7CiAgICB9ICAgIAoKICAgIHZvaWQgcmVtb3ZlKFNub2RlICpub2RlLCBTbm9kZSAqcHJldmlvdXMpCiAgICB7CiAgICAgICAgaWYgKHByZXZpb3VzKQogICAgICAgICAgICBwcmV2aW91cy0+bmV4dCA9IG5vZGUtPm5leHQ7CgogICAgICAgIGlmIChoZWFkID09IG5vZGUpCiAgICAgICAgICAgIGhlYWQgPSBub2RlLT5uZXh0OwoKICAgICAgICBpZiAodGFpbCA9PSBub2RlKQogICAgICAgICAgICB0YWlsID0gcHJldmlvdXM7CgogICAgICAgIGRlbGV0ZSBub2RlOwogICAgfQoKICAgIHZvaWQgc3dhcChzZXQgJm90aGVyKQogICAgewogICAgICAgIFNub2RlICpwdHIgPSBoZWFkOwogICAgICAgIGhlYWQgPSBvdGhlci5oZWFkOwogICAgICAgIG90aGVyLmhlYWQgPSBwdHI7CgogICAgICAgIHB0ciA9IHRhaWw7CiAgICAgICAgdGFpbCA9IG90aGVyLnRhaWw7CiAgICAgICAgb3RoZXIudGFpbCA9IHB0cjsKICAgIH0KCnB1YmxpYzoKICAgIHNldCgpID0gZGVmYXVsdDsKCiAgICBzZXQoY29uc3Qgc2V0ICZzcmMpCiAgICB7CiAgICAgICAgU25vZGUgKnRlbXAgPSBzcmMuaGVhZDsgICAgCiAgICAgICAgd2hpbGUgKHRlbXApCiAgICAgICAgewogICAgICAgICAgICBhcHBlbmQodGVtcC0+ZGF0YSwgdGVtcC0+Y291bnQpOwogICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICB9CiAgICB9CgogICAgc2V0KHNldCAmJnNyYykKICAgIHsKICAgICAgICBzcmMuc3dhcCgqdGhpcyk7CiAgICB9CgogICAgfnNldCgpCiAgICB7CiAgICAgICAgU25vZGUgKnRlbXAgPSBoZWFkOwogICAgICAgIHdoaWxlICh0ZW1wKQogICAgICAgIHsKICAgICAgICAgICAgU25vZGUgKm5leHQgPSB0ZW1wLT5uZXh0OwogICAgICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICAgICAgdGVtcCA9IG5leHQ7CiAgICAgICAgfQogICAgfQoKICAgIHNldCYgb3BlcmF0b3I9KGNvbnN0IHNldCAmcmhzKQogICAgewogICAgICAgIGlmICgmcmhzICE9IHRoaXMpCiAgICAgICAgewogICAgICAgICAgICBzZXQgdGVtcChyaHMpOwogICAgICAgICAgICB0ZW1wLnN3YXAoKnRoaXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgc2V0JiBvcGVyYXRvcj0oc2V0ICYmcmhzKQogICAgewogICAgICAgIHJocy5zd2FwKCp0aGlzKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgYm9vbCBpc0F2YWlsYWJsZShjaGFyIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAoZmluZCh2YWx1ZSkgIT0gbnVsbHB0cik7CiAgICB9CgogICAgU25vZGUqIGZpbmQoY2hhciB2YWx1ZSwgU25vZGUgKipwcmV2aW91cyA9IG51bGxwdHIpCiAgICB7CiAgICAgICAgaWYgKHByZXZpb3VzKQogICAgICAgICAgICAqcHJldmlvdXMgPSBudWxscHRyOwoKICAgICAgICBTbm9kZSAqdGVtcCA9IGhlYWQ7CiAgICAgICAgU25vZGUgKnByZXYgPSBudWxscHRyOwoKICAgICAgICB3aGlsZSAodGVtcCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0ZW1wLT5kYXRhID09IHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpCiAgICAgICAgICAgICAgICAgICAgKnByZXZpb3VzID0gcHJldjsKICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxscHRyOwogICAgfQoKICAgIGJvb2wgaXNGaXJzdChjaGFyIHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAoKGhlYWQpICYmIChoZWFkLT5kYXRhID09IHZhbHVlKSk7CiAgICB9CgogICAgYm9vbCBpc0xhc3QoY2hhciB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gKCh0YWlsKSAmJiAodGFpbC0+ZGF0YSA9PSB2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgZGlzcGxheSgpCiAgICB7CiAgICAgICAgU25vZGUgKnRlbXAgPSBoZWFkOwogICAgICAgIHdoaWxlICh0ZW1wKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHRlbXAtPmRhdGEgPDwgIiAiIDw8IHRlbXAtPmNvdW50IDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgaW5zZXJ0KGNoYXIgdmFsdWUpCiAgICB7CiAgICAgICAgU25vZGUgKnRlbXAgPSBmaW5kKHZhbHVlKTsKICAgICAgICBpZiAodGVtcCkKICAgICAgICAgICAgdGVtcC0+Y291bnQgKz0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGFwcGVuZCh2YWx1ZSwgMSk7CiAgICB9CgogICAgaW50IGNvdW50KGNoYXIgdmFsdWUpCiAgICB7CiAgICAgICAgU25vZGUgKnRlbXAgPSBmaW5kKHZhbHVlKTsKICAgICAgICByZXR1cm4gKHRlbXApID8gdGVtcC0+Y291bnQgOiAwOwogICAgfQoKICAgIHZvaWQgZGVsZXRlRmlyc3QoKQogICAgewogICAgICAgIGlmIChoZWFkKQogICAgICAgICAgICByZW1vdmUoaGVhZCwgbnVsbHB0cik7CiAgICB9CgogICAgdm9pZCBkZWxldGVMYXN0KCkKICAgIHsKICAgICAgICBpZiAoaGVhZCkKICAgICAgICB7CiAgICAgICAgICAgIFNub2RlICpsYXN0ID0gaGVhZDsKICAgICAgICAgICAgU25vZGUgKnByZXZpb3VzID0gbnVsbHB0cjsKCiAgICAgICAgICAgIHdoaWxlIChsYXN0LT5uZXh0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGxhc3Q7CiAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC0+bmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVtb3ZlKGxhc3QsIHByZXZpb3VzKTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCByZW1vdmUoY2hhciB2YWx1ZSkKICAgIHsKICAgICAgICBTbm9kZSAqcHJldmlvdXM7CiAgICAgICAgU25vZGUgKnRlbXAgPSBmaW5kKHZhbHVlLCAmcHJldmlvdXMpOyAgICAKICAgICAgICBpZiAodGVtcCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0ZW1wLT5jb3VudCA+IDEpCiAgICAgICAgICAgICAgICB0ZW1wLT5jb3VudCAtPSAxOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZW1vdmUodGVtcCwgcHJldmlvdXMpOwogICAgICAgIH0KICAgIH0gICAKfTsKCmludCBtYWluKCkKewogICAgLy9kZWZpbmluZyBhIG15U2V0IGFzIGEgInNldCIgdHlwZQogICAgc2V0IG15U2V0OwoKICAgIC8vYWRkaW5nIHZhbHVlcyB0byBjcmVhdGUgbm9kZXMKICAgIG15U2V0Lmluc2VydCgnYycpOwogICAgbXlTZXQuaW5zZXJ0KCdhJyk7CiAgICBteVNldC5pbnNlcnQoJ2EnKTsKICAgIG15U2V0Lmluc2VydCgnYycpOwogICAgbXlTZXQuaW5zZXJ0KCdjJyk7CgogICAgc2V0IG15Q29waWVkU2V0ID0gbXlTZXQ7IC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0CgogICAgLy9hZGRpbmcgbW9yZSB2YWx1ZXMgdG8gY3JlYXRlIG5vZGVzCiAgICBteUNvcGllZFNldC5pbnNlcnQoJ2EnKTsKICAgIG15Q29waWVkU2V0Lmluc2VydCgnYicpOwogICAgbXlDb3BpZWRTZXQuaW5zZXJ0KCdiJyk7CiAgICBteUNvcGllZFNldC5pbnNlcnQoJ2MnKTsKCiAgICAvLyBhbm90aGVyIHRlc3QKICAgIHNldCBteVRlc3RTZXQ7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdjJyk7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdjJyk7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdqJyk7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdqJyk7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdqJyk7CiAgICBteVRlc3RTZXQuaW5zZXJ0KCdyJyk7CgogICAgLy9kaXNwbGF5aW5nIG5vZGVzIHRocm91Z2ggInZhbHVlIGNvdW50IiBmb3JtYXQKICAgIHN0ZDo6Y291dCA8PCAib3JpZ2luYWw6IiA8PCBzdGQ6OmVuZGw7CiAgICBteVNldC5kaXNwbGF5KCk7ICAgIAogICAgc3RkOjpjb3V0IDw8ICJjb3B5OiIgPDwgc3RkOjplbmRsOwogICAgbXlDb3BpZWRTZXQuZGlzcGxheSgpOwogICAgc3RkOjpjb3V0IDw8ICJ0ZXN0OiIgPDwgc3RkOjplbmRsOwogICAgbXlUZXN0U2V0LmRpc3BsYXkoKTsKCiAgICByZXR1cm4gMDsKfQo=