Где-то так:
Код | #include <iostream> #include <string> #include <assert.h>
using namespace std;
/** * Узел списка List. */ struct Node { /** значение */ string val; /** указатель на следующий элемент */ Node *next;
/** создает новый узел для переданного значения */ Node(const string &v) : val(v), next(0) {} };
/** * Примитивный связный список */ struct List { /** голова списка */ Node *head; /** хвост списка */ Node *tail;
/** создает пустой список */ List() { head = tail = 0; }
/** удаляет все добавленные элементы и уничтожает список */ ~List() { clear(); }
/** добавляет в список копию переданного элемента */ void add(const string &v) { Node *n = new Node(v);
if (!head) head = tail = n; else tail = tail->next = n; }
/** удаляет из списка элемент с заданым значением данного */ void remove(const string &s) { Node *ptr = head; Node *prevPtr = 0; while (ptr != 0 && ptr->val != s) { prevPtr = ptr; ptr = ptr->next; }
if (ptr == 0) return; // "s not found"
if (ptr == head) head = ptr->next; else prevPtr->next = ptr->next;
if (ptr == tail) { tail = prevPtr; delete ptr; } }
/** удаление всего списка */ void clear() { for (Node *ptr = head, *next; ptr; ptr = next) { next = ptr->next; delete ptr; } head = tail = 0; }
string toString() { string str;
for (Node *ptr = head; ptr; ptr = ptr->next) str.append(ptr->val);
return str; } };
int main() { List slist; slist.add("1"); slist.add("2"); slist.add("3");
cout << slist.toString() << endl;
slist.remove("2"); cout << slist.toString() << endl;
slist.clear();
assert(slist.toString().empty()); return 0; }
|
|