チェーンテーブルシリーズ記事(一)
37709 ワード
リファレンスhttp://www.cnblogs.com/skywang12345/p/3561803.htmlここでお礼を申し上げます.
C++を採用し、単一チェーンテーブルと双方向循環チェーンテーブルを実現した.
1.単一チェーンテーブル
View Code
2.双方向循環チェーンテーブル
View Code
私のレベルが限られているため、文章の中でどうしても不当と间违いがあって、みんなの批判と指摘を歓迎して、共に进歩することを望みます!!!
C++を採用し、単一チェーンテーブルと双方向循環チェーンテーブルを実現した.
1.単一チェーンテーブル
1 #ifndef SINGLE_LIST_H
2 #define SINGLE_LIST_H
3
4 #ifndef INT_MAX
5 #define INT_MAX 2147483647
6 #define INT_MIN (-INT_MAX - 1)
7 #endif
8 #define ERROR INT_MIN
9 #define OK 0
10 #ifndef NULL
11 #define NULL 0
12 #endif
13 template<class T>
14 struct ListNode {
15 T var;
16 ListNode<T> *next;
17 ListNode() : next(NULL) { }
18 ListNode(T v, ListNode<T> *p = NULL) {
19 var = v;
20 next = p;
21 }
22 };
23
24 template<class T>
25 class Mylist {
26 public:
27 Mylist();
28 ~Mylist();
29
30 int size();
31 bool empty();
32
33 int insert(int i, T t);
34 int append(T t);
35 int insert_first(T t);
36
37 T get(int i);
38
39 int erase(int i);
40
41 private:
42 ListNode<T> *head;
43 int len;
44 };
45 template<class T>
46 Mylist<T>::Mylist() {
47 len = 0;
48 head = new ListNode<T>();
49 }
50 template<class T>
51 Mylist<T>::~Mylist() {
52 if(head) {
53 int i = 0;
54 ListNode<T> *p = NULL;
55 while(i++ < len) {
56 p = head->next;
57 head->next = p->next;
58 delete p;
59 }
60 }
61 delete head;
62 }
63 template<class T>
64 int Mylist<T>::size() {
65 return len;
66 }
67 template<class T>
68 bool Mylist<T>::empty() {
69 return 0 == len;
70 }
71 template<class T>
72 int Mylist<T>::insert(int i, T t) {
73 if(i < 1 || i > len && len) return ERROR;
74
75 ListNode<T> *p = head;
76 int j = 1;
77 while(p && j++ < i) { p = p->next; }
78
79 ListNode<T> *s = p->next;
80 p->next = new ListNode<T>(t);
81 p->next->next = s;
82
83 len++;
84 return OK;
85 }
86 template<class T>
87 int Mylist<T>::append(T t) {
88 ListNode<T> *p = head;
89 int j = 0;
90 while(p && j++ < len) { p = p->next; }
91 p->next = new ListNode<T>(t);
92 len++;
93 return OK;
94 }
95 template<class T>
96 int Mylist<T>::insert_first(T t) {
97 return insert(1, t);
98 }
99 template<class T>
100 T Mylist<T>::get(int i) {
101 if(i < 1 || i > len) return ERROR;
102 ListNode<T> *p = head->next;
103 int j = 1;
104 while(p && j < i) { p = p->next; j++; }
105 return p->var;
106 }
107 template<class T>
108 int Mylist<T>::erase(int i) {
109 if(i < 1 || i > len) return ERROR;
110 ListNode<T> *p = head;
111 int j = 1;
112 while(p && j < i) { p = p->next; j++; }
113
114 ListNode<T> *s = p->next;
115 p->next = s->next;
116 delete s;
117
118 len--;
119 return OK;
120 }
121
122 #endif
View Code
2.双方向循環チェーンテーブル
1 #ifndef BI_LINK_H
2 #define BI_LINK_H
3
4 #ifndef INT_MAX
5 #define INT_MAX 0x8fffffff
6 #define INT_MIN (-INT_MAX - 1)
7 #endif
8 #define ERROR INT_MIN
9 #define OK 0
10 #ifndef NULL
11 #define NULL 0
12 #endif
13
14 template<class T>
15 struct BLinkNode {
16 T var;
17 BLinkNode<T> *prev;
18 BLinkNode<T> *next;
19 BLinkNode() : prev(NULL), next(NULL) { }
20 BLinkNode(T v, BLinkNode<T> *p = NULL, BLinkNode<T> *n = NULL) : var(v), prev(p), next(n) { }
21 };
22
23 template<class T>
24 class Bilink {
25 public:
26 Bilink();
27 ~Bilink();
28
29 int size();
30 bool empty();
31
32 T get(int index);
33 T get_first();
34 T get_last();
35
36 int insert(int index, T t);
37 int insert_first(T t);
38 int append_last(T t);
39
40 int erase(int index);
41 int erase_first();
42 int erase_last();
43 private:
44 int len;
45 BLinkNode<T> *head;
46 };
47
48 template<class T>
49 Bilink<T>::Bilink():len(0) {
50 head = new BLinkNode<T>();
51 head->prev = head->next = head;
52 }
53 template<class T>
54 Bilink<T>::~Bilink() {
55 BLinkNode<T> *p = NULL;
56 int i = 0;
57 while(i++ < len) {
58 p = head->next;
59 head->next = p->next;
60 delete p;
61 }
62 delete head;
63 }
64 template<class T>
65 int Bilink<T>::size() {
66 return len;
67 }
68 template<class T>
69 bool Bilink<T>::empty() {
70 return 0 == len;
71 }
72 template<class T>
73 T Bilink<T>::get(int index) {
74 if(index < 1 || index > len) return head->var;
75 int i = 0;
76 BLinkNode<T> *p = head;
77 while(i++ < index) {
78 p = p->next;
79 }
80 return p->var;
81 }
82 template<class T>
83 T Bilink<T>::get_first() {
84 if(len) {
85 return head->next->var;
86 }
87 return head->var;
88 }
89 template<class T>
90 T Bilink<T>::get_last() {
91 if(len) {
92 return head->prev->var;
93 }
94 return head->var;
95 }
96 template<class T>
97 int Bilink<T>::insert(int index, T t) {
98 if(index < 1 || index > len && len) return ERROR;
99 if(index == 1) return insert_first(t);
100 int mid = (len + 1) >> 1;
101 BLinkNode<T> *p = head;
102 BLinkNode<T> *s = new BLinkNode<T>(t);
103 int i = 1;
104 if(index <= mid) {
105 while(i++ < index) { p = p->next; }
106 s->prev = p;
107 s->next = p->next;
108 p->next->prev = s;
109 p->next = s;
110 }
111 else {
112 while(i++ <= index) { p = p->prev; }
113 s->next = p;
114 s->prev = p->prev;
115 p->prev->next = s;
116 p->prev = s;
117 }
118 len++;
119 return OK;
120 }
121 template<class T>
122 int Bilink<T>::insert_first(T t) {
123 BLinkNode<T> *s = new BLinkNode<T>(t);
124 BLinkNode<T> *p = head;
125 s->prev = p;
126 s->next = p->next;
127 p->next->prev = s;
128 p->next = s;
129 len++;
130 return OK;
131 }
132 template<class T>
133 int Bilink<T>::append_last(T t) {
134 BLinkNode<T> *s = new BLinkNode<T>(t);
135 BLinkNode<T> *p = head;
136 s->prev = p->prev;
137 s->next = p;
138 p->prev->next = s;
139 p->prev = s;
140 len++;
141 return OK;
142 }
143 template<class T>
144 int Bilink<T>::erase(int index) {
145 if(index < 1 || index > len) { return ERROR; }
146 BLinkNode<T> *p = head;
147 int mid = len >> 1;
148 int i = 1;
149 if(index <= len) {
150 while(i++ < index) { p = p->next; }
151 BLinkNode<T> *s = p->next;
152 s->next->prev = p;
153 p->next = s->next;
154 delete s;
155 }
156 else {
157 while(i++ < index) { p = p->prev; }
158 BLinkNode<T> *s = p->prev;
159 s->prev->next = p;
160 p->prev = s->prev;
161 delete s;
162 }
163 len--;
164 return OK;
165 }
166 template<class T>
167 int Bilink<T>::erase_first() {
168 if(!len) return ERROR;
169 BLinkNode<T> *p = head;
170 BLinkNode<T> *s = p->next;
171 s->next->prev = p;
172 p->next = s->next;
173 len--;
174 return OK;
175 }
176 template<class T>
177 int Bilink<T>::erase_last() {
178 if(!len) return ERROR;
179 BLinkNode<T> *p = head;
180 BLinkNode<T> *s = p->prev;
181 s->prev->next = p;
182 p->prev = s->prev;
183 len--;
184 return OK;
185 }
186
187 #endif
View Code
私のレベルが限られているため、文章の中でどうしても不当と间违いがあって、みんなの批判と指摘を歓迎して、共に进歩することを望みます!!!