//Linked_List.h enum Error_code {underflow,overflow,range_out,success}; template<class Node_entry> struct Node { Node_entry entry; Node *next; Node(); Node(Node_entry item, Node<Node_entry> *add_on = NULL); }; template<class List_entry> class List { public: //methods of the List ADT List(); int size()const; bool full()const; bool empty()const; void clear(); void traverse(void(*visit)(List_entry &item)); Error_code retrieve(int position, List_entry &x)const; Error_code replace(int position, const List_entry &x); Error_code remove(int position, List_entry &x); Error_code insert(int position, const List_entry &x); //safety features for the List List(const List<List_entry> ©); void operator=(const List<List_entry> ©); ~List(); protected: int count; Node<List_entry> *head; Node<List_entry> *set_position(int position)const; }; template<class Node_entry> inline Node<Node_entry>::Node() { next = nullptr; } template<class Node_entry> inline Node<Node_entry>::Node(Node_entry item, Node<Node_entry>* add_on) { entry = item; next = add_on; }<pre name="code" class="cpp">//Linked_List.cpp #include"Linked_List.h" #include<iostream> using namespace std; template<class List_entry> List<List_entry>::List() { head = NULL; count = 0; } template<class List_entry> int List<List_entry>::size() const { return count; } template<class List_entry> bool List<List_entry>::full() const { Node<List_entry> *p = new Node<List_entry>; if (p == NULL)return true; else return false; } template<class List_entry> bool List<List_entry>::empty() const { return (count==0); } template<class List_entry> void List<List_entry>::clear() { List_entry x; while (count != 0)remove(0, x); } template<class List_entry> void List<List_entry>::traverse(void(*visit)(List_entry &item)) { Node<List_entry> *p = head; for (int i = 0; i < count; i++){ (*visit)(p->entry); p = p->next; } } template<class List_entry> Error_code List<List_entry>::retrieve(int position, List_entry & x) const { if (position<0||position>=count)return range_out; Node<List_entry> *p = set_position(position); x = p->entry; return success; } template<class List_entry> Error_code List<List_entry>::replace(int position, const List_entry & x) { if (position<0 || position >= count)return range_out; Node<List_entry> *p = set_position(position); p->entry = x; return success; } template<class List_entry> Error_code List<List_entry>::remove(int position, List_entry & x) { if (position<0 || position >= count)return range_out; if (position == 0) { x = head->entry;0 Node<List_entry> *p=head; head = head->next; delete p; count--; return success; } Node<List_entry> *pre, *cur; pre = set_position(position-1); cur = pre->next; pre->next = cur->next; x = cur->entry; delete cur; count--; return success; } template<class List_entry> Error_code List<List_entry>::insert(int position, const List_entry & x) { if (position<0 || position > count)return range_out; if (full())return overflow; if (position == 0) { head = new Node<List_entry>(x, head); count++; return success; } Node<List_entry> *pre = set_position(position - 1); Node<List_entry> *cur = pre->next; pre->next = new Node<List_entry>(x,cur); count++; return success; } template<class List_entry> List<List_entry>::List(const List<List_entry>& copy) { //version 1: for (int i = 0; i < copy.size(); i++) { List_entry item; copy.retrieve(i, item); insert(i, item); } //version 2: /*void make(List_entry item) { insert(count, item); } copy.tranverse(make());*/ } template<class List_entry> void List<List_entry>::operator=(const List<List_entry>& copy) { clear(); List(copy); } template<class List_entry> List<List_entry>::~List() { clear(); } template<class List_entry> Node<List_entry>* List<List_entry>::set_position(int position) const { /*precondition: position is vaild*/ Node<List_entry> *p = head; for (int i = 0; i < position; i++)p = p->next; return p; }
//main.cpp #include"Linked_List.cpp" #include<iostream> using namespace std; void UI() { cout << "**********************************Linked_List**********************************" << endl; cout << "Please according to the prompt to input." << endl; cout << "MENU:" << endl; cout << "[1].insert." << endl; cout << "[2].remove." << endl; cout << "[3].replace." << endl; cout << "[4].retrieve." << endl; cout << "[5].size." << endl; cout << "[6].is_full." << endl; cout << "[7].is_empty." << endl; cout << "[8].clear." << endl; cout << "[0].exit." << endl; } void flash() { system("pause"); system("cls"); UI(); } int get_command() { cout << "please enter the command." << endl; int command; cin >> command; while (command < 0 || command>8) { cout << "Illegal input.Please enter again." << endl; cin >> command; } return command; } void print(int &item) { cout << item << ' '; } void main() { List<int> test; UI(); while (1) { switch (get_command()) { case 0: cout << "You'll exit the programm later." << endl; return; case 1: { cout << "Please enter the characters to be inserted." << endl; int x; cin >> x; cout << "Please enter the position to be inserted." << endl; int pos; cin >> pos; if (test.insert(pos, x) == success)cout << "Insert success." << endl; else cout << "Insert fail.Please check you position." << endl; flash(); break; } case 2: { cout << "Please enter the position to be inserted." << endl; int pos; cin >> pos; int x; if (test.remove(pos, x) == success)cout << x <<" Remove success." << endl; else cout << "Remove fail.Please check you position." << endl; flash(); break; } case 3: { cout << "Please enter the characters to replace." << endl; int x; cin >> x; cout << "Please enter the position to be inserted." << endl; int pos; cin >> pos; if (test.replace(pos, x) == success)cout << "Replace success." << endl; else cout << "Replace fail.Please check you position." << endl; flash(); break; } case 4: test.traverse(print); cout << endl; flash(); break; case 5: cout << "Current size of this List is : " << test.size() << endl; flash(); break; case 6: if (test.full())cout << "FULL" << endl; else cout << "Not full" << endl; flash(); break; case 7: if (test.empty())cout << "EMPTY" << endl; else cout << "Not empty" << endl; flash(); break; case 8: test.clear(); cout << "Clear success." << endl; flash(); break; } } }