LinkQueue class
11985 ワード
1 #include <cstddef>
2
3 struct Node{
4 Node * next;
5
6 Node() { next = NULL;}
7 Node(const Node & node) {
8 next = node.next;
9 }
10 };
11
12 enum Error_code {
13 succeed,
14 overflow,
15 underflow
16 };
17
18 class LinkQueue {
19 public:
20 LinkQueue();
21 LinkQueue(const LinkQueue & rhs);
22 ~LinkQueue();
23
24 LinkQueue & operator=(const LinkQueue & rhs);
25
26 bool empty() const;
27 Error_code append(const Node & item);
28 Error_code serve();
29 Error_code retrieve(Node & item) const;
30 int size() const;
31
32 protected:
33 Node * front, * rear;
34 };
35
36 LinkQueue::LinkQueue() {
37 front = rear = NULL;
38 }
39
40 LinkQueue::~LinkQueue() {
41 while (!empty())
42 serve();
43 }
44
45 LinkQueue::LinkQueue(const LinkQueue & rhs) {
46 Node * new_front=NULL, * new_rear=NULL;
47 Node * new_copy, * old_node=rhs.front;
48 if (old_node != NULL) {
49 new_front=new_copy=new Node(*old_node);
50 while (old_node->next != NULL) {
51 old_node = old_node->next;
52 new_copy->next = new Node(*old_node);
53 new_copy = new_copy->next;
54 }
55 new_rear = new_copy;
56 }
57
58 front = new_front;
59 rear = new_rear;
60 }
61
62 int LinkQueue::size() const {
63 Node * window = front;
64 int count = 0;
65
66 while(window != NULL) {
67 window = window->next;
68 count++;
69 }
70
71 return count;
72 }
73
74 Error_code LinkQueue::serve() {
75 if (front == NULL)
76 return underflow;
77
78 Node * old_front = front;
79 front = front->next;
80 if (front == NULL)
81 rear = NULL;
82
83 delete old_front;
84
85 return succeed;
86 }
87
88 bool LinkQueue::empty() const{
89 if (front == NULL)
90 return true;
91 return false;
92 }
93
94 Error_code LinkQueue::append(const Node & item) {
95 Node * new_rear = new Node(item);
96 if (new_rear == NULL)
97 return overflow;
98 if (rear == NULL)
99 front = rear = new_rear;
100 else {
101 rear->next = new_rear;
102 rear = new_rear;
103 }
104 return succeed;
105 }
106
107 Error_code LinkQueue::retrieve(Node & item) const{
108 if (front == NULL)
109 return underflow;
110 item = *front;
111 return succeed;
112 }