C++實現單鏈表類
太簡單了,直接貼題目然後上程式碼。
題目:
實驗2
2.1 實驗目的
熟練掌握線性表的鏈式儲存結構。
熟練掌握單鏈表的有關演算法設計。
根據具體問題的需要,設計出合理的表示資料的鏈式儲存結構,並設計相關演算法。
2.2 實驗要求
本次實驗中的連結串列結構指帶頭結點的單鏈表;
單鏈表結構和運算定義,演算法的實現以庫檔案方式實現,不得在測試主程式中直接實現;
比如儲存、演算法實現放入檔案:linkedList.h
實驗程式有較好可讀性,各運算和變數的命名直觀易懂,符合軟體工程要求;
程式有適當的註釋。
2.3 實驗任務
編寫演算法實現下列問題的求解。
<1>尾插法建立單鏈表,列印建立結果。
<2>頭插法建立單鏈表,列印建立結果。
<3>銷燬單鏈表。
<4>求連結串列長度。
<5>求單鏈表中第i個元素(函式),若不存在,報錯。
實驗測試資料基本要求:
第一組資料:單鏈表長度n≥10,i分別為5,n,0,n+1,n+2
第二組資料:單鏈表長度n=0,i分別為0,2
<6>在第i個結點前插入值為x的結點。
實驗測試資料基本要求:
第一組資料:單鏈表長度n≥10,x=100, i分別為5,n,n+1,0,1,n+2
第二組資料:單鏈表長度n=0,x=100,i=5
<7>連結串列中查詢元素值為x的結點,成功返回結點指標,失敗報錯。
實驗測試資料基本要求:
單鏈表元素為(1,3,6,10,15,16,17,18,19,20)
x=1,17,20,88
<8>刪除單鏈表中第i個元素結點。
實驗測試資料基本要求:
第一組資料:單鏈表長度n≥10,i分別為5,n,1,n+1,0
第二組資料:單鏈表長度n=0, i=5
<9>在一個遞增有序的單鏈表L中插入一個值為x的元素,並保持其遞增有序特性。
實驗測試資料基本要求:
單鏈表元素為(10,20,30,40,50,60,70,80,90,100),
x分別為25,85,110和8
<10>將單鏈表L中的奇數項和偶數項結點分解開(元素值為奇數、偶數),分別放入新的單鏈表中,然後原表和新表元素同時輸出到螢幕上,以便對照求解結果。
實驗測試資料基本要求:
第一組資料:單鏈表元素為(1,2,3,4,5,6,7,8,9,10,20,30,40,50,60)
第二組資料:單鏈表元素為(10,20,30,40,50,60,70,80,90,100)
程式碼:
1 // stdafx.h : include file for standard system include files,
2 // or project specific include files that are used frequently, but
3 // are changed infrequently
4 //
5
6 #if !defined(AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_)
7 #define AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_
8
9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12
13 #include <stdc++.h>
14
15 using namespace std;
16
17 typedef int elementType;
18 typedef struct node
19 {
20 elementType data;
21 node* next;
22 }LList, *PList;
23
24 // TODO: reference additional headers your program requires here
25
26 //{{AFX_INSERT_LOCATION}}
27 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
28
29 #endif // !defined(AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_)
1 // linkedList1.h: interface for the linkedList class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #if !defined(AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_)
6 #define AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_
7
8 #if _MSC_VER > 1000
9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 #include "StdAfx.h"
13
14 using namespace std;
15
16 class linkedList
17 {
18 public:
19 linkedList();//建構函式
20 virtual ~linkedList();//解構函式,銷燬單鏈表
21 bool createLinkedListRail( int length );//尾插法構建單鏈表
22 bool createLinkedListFront( int length );//頭插法構建單鏈表
23 void addLinkedListNodeLast( int value );//警告:必須初始化才能使用!
24 //我嘗試判斷呼叫物件的連結串列是否初始化來作為是否呼叫該函式的依據,結果失敗:無論如何判斷,總是不能在零節點時插入
25 bool initiateLinkedList();//初始化單鏈表
26 bool isEmpty();//判斷單鏈表是否為空
27 bool getElementByPosition( int pos, int& value );//求單鏈表中第pos個元素(函式),若不存在,報錯
28 bool insertListByPosition( int pos, int value );//在第pos個結點前插入值為value的結點
29 bool getElementByValue( int& pos, int value );//連結串列中查詢元素值為x的結點,成功返回結點指標,失敗報錯。
30 bool removeListNodeByPosition( int pos, int& value );//刪除單鏈表中第pos個元素結點
31 bool insertListSort( int value );//在一個遞增有序的單鏈表L中插入一個值為value的元素,並保持其遞增有序特性
32 bool oddEvenSort( linkedList& LA,linkedList& LB );//將呼叫單鏈表中的元素按奇偶性分配給被呼叫的單鏈表LA與LB
33 void printLinkedList();//列印單鏈表
34 int linkedListLength();//返回單鏈表長度
35 private:
36 LList *head;
37 int len;
38 };
39
40 #endif // !defined(AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_)
1 // linkedList1.cpp: implementation of the linkedList class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "linkedList1.h"
7
8
9 //////////////////////////////////////////////////////////////////////
10 // Construction/Destruction
11 //////////////////////////////////////////////////////////////////////
12
13 linkedList::linkedList()
14 {
15 head = NULL;
16 len = 0;
17 }
18
19 linkedList::~linkedList()
20 {
21 LList* tmp = head;
22 //for( int i = 0; i < len; i ++ )
23 while( tmp->next )
24 {
25 LList *q = tmp;
26 tmp = tmp->next;
27 delete q;
28 }
29 }
30
31 bool linkedList::initiateLinkedList()
32 {
33 std::ios::sync_with_stdio(false);
34 head = new LList;
35 if( !head )
36 {
37 cout << "初始化失敗!" << endl;
38 return false;
39 }
40 head->next = NULL;
41 return true;
42 }
43
44 bool linkedList::createLinkedListRail( int length )
45 {
46 std::ios::sync_with_stdio(false);
47 initiateLinkedList();
48 LList* rail = head;
49 for( int i = 1; i <= length; i ++ )
50 {
51 LList* tmp = new LList;
52 int num;
53 cin >> num;
54 //num = i + 1;
55 tmp->data = num;
56 tmp->next = rail->next;
57 rail->next = tmp;
58 rail = tmp;
59 len ++;
60 }
61 return true;
62 }
63
64 bool linkedList::createLinkedListFront( int length )
65 {
66 std::ios::sync_with_stdio(false);
67 initiateLinkedList();
68 for( int i = 0; i < length; i ++ )
69 {
70 int num;
71 cin >> num;
72 //num = i + 1;
73 LList* tmp = new LList;
74 tmp->data = num;
75 tmp->next = head->next;
76 head->next = tmp;
77 len ++;
78 }
79 return true;
80 }
81
82 void linkedList::addLinkedListNodeLast( int value )
83 {
84 //ios::sync_with_stdio(false);
85
86 LList* tmp = head;
87 LList* last = NULL;
88 while(tmp)
89 {
90 last = tmp;
91 tmp = tmp->next;
92 }
93 LList* PNew = new LList;
94 PNew->data = value;
95 PNew->next = NULL;
96 last->next = PNew;
97 len ++;
98 }
99
100 bool linkedList::isEmpty()
101 {
102 return head->next == NULL;
103 }
104
105 void linkedList::printLinkedList()
106 {
107 std::ios::sync_with_stdio(false);
108 if( isEmpty() )
109 {
110 cout << "空連結串列,無法列印!" << endl;
111 return;
112 }
113 LList* tmp = head->next;
114 int column = 0;
115 while(tmp)
116 {
117 cout << setiosflags(ios::left) << setw(3) << tmp->data << " ";
118 column ++;
119 if( column % 10 == 0 )
120 cout << endl;
121 tmp = tmp->next;
122 }
123 cout << endl;
124 }
125
126 int linkedList::linkedListLength()
127 {
128 if( isEmpty() )
129 {
130 cout << "空連結串列!" << endl;
131 return -1;
132 }
133 int l = 0;
134 LList* tmp = head->next;
135 while(tmp)
136 {
137 tmp = tmp->next;
138 l ++;
139 }
140 return l;
141 //return len;
142 }
143
144 bool linkedList::getElementByPosition( int pos, int& value )
145 {
146 ios::sync_with_stdio(false);
147 if( isEmpty() )
148 {
149 cout << "連結串列為空!獲取元素失敗!" << endl;
150 return false;
151 }
152 if( pos > len )
153 {
154 cout << "位置大於表長!獲取元素失敗!" << endl;
155 return false;
156 }
157 if( pos <= 0 )
158 {
159 cout << "位置必須大於0!獲取元素失敗!" << endl;
160 return false;
161 }
162 int index = 0;
163 LList* tmp = head;
164 while(tmp)
165 {
166 if( index == pos )
167 {
168 //cout << tmp->data;
169 value = tmp->data;
170 return true;
171 }
172 tmp = tmp->next;
173 index ++;
174 }
175 return true;
176 }
177
178 bool linkedList::insertListByPosition( int pos, int value )
179 {
180 ios::sync_with_stdio(false);
181 if( isEmpty() )
182 {
183 cout << "連結串列為空!插入元素失敗!" << endl;
184 return false;
185 }
186 else if( pos > len )
187 {
188 cout << "位置大於表長且差值大於1!刪除元素失敗!" << endl;
189 return false;
190 }
191 else if( pos == len )
192 {
193 cout << "將會直接把新節點接在連結串列尾部!" << endl;
194 addLinkedListNodeLast( value );
195 return true;
196 }
197 else if( pos <= 0 )
198 {
199 cout << "位置必須大於0!插入元素失敗!" << endl;
200 return false;
201 }
202 int index = 0;
203 LList* tmp = head;
204 while( index != pos - 1 && tmp )
205 {
206 index ++;
207 tmp = tmp->next;
208 }
209 if( tmp == NULL )
210 {
211 cout << "位置大於表長且不在表長的後一位!插入元素失敗!" << endl;
212 return false;
213 }
214 LList* PNew = new LList;
215 PNew->data = value;
216 PNew->next = tmp->next;
217 tmp->next = PNew;
218 len ++;
219 return true;
220 }
221
222 bool linkedList::getElementByValue( int& pos, int value )
223 {
224 ios::sync_with_stdio(false);
225 if( isEmpty() )
226 {
227 cout << "連結串列為空!獲取元素失敗!" << endl;
228 return false;
229 }
230 int index = 1;
231 LList* tmp = head->next;
232 while(tmp)
233 {
234 if( tmp->data == value )
235 {
236 pos = index;
237 return true;
238 }
239 tmp = tmp->next;
240 index ++;
241 }
242 return false;
243 }
244
245 bool linkedList::removeListNodeByPosition( int pos, int& value )
246 {
247 ios::sync_with_stdio(false);
248 if( isEmpty() )
249 {
250 cout << "連結串列為空!刪除元素失敗!" << endl;
251 return false;
252 }
253 if( pos > len )
254 {
255 cout << "位置大於表長!刪除元素失敗!" << endl;
256 return false;
257 }
258 if( pos <= 0 )
259 {
260 cout << "位置必須大於0!刪除元素失敗!" << endl;
261 return false;
262 }
263 LList* tmp = head;
264 int index = 0;
265 while( index != pos - 1 && tmp )
266 {
267 tmp = tmp->next;
268 index ++;
269 }
270 LList* PDel = tmp->next;
271 value = PDel->data;
272 tmp->next = tmp->next->next;
273 delete PDel;
274 len --;
275 return true;
276 }
277
278 bool linkedList::insertListSort( int value )
279 {
280 ios::sync_with_stdio(false);
281 if( isEmpty() )
282 {
283 cout << "連結串列為空!插入元素失敗!" << endl;
284 return false;
285 }
286 LList* tmp = head;
287 while( tmp->next && tmp->next->data < value )//下一個節點的data比value小就繼續迴圈
288 //寫成下面這樣導致比最後一個節點的data大的value無法插入!因為迴圈結束時tmp->next為NULL,無法插入。
289 //while( tmp && tmp->next->data < value )
290 {
291 //if( tmp->data < value )
292 tmp = tmp->next;
293 }
294 LList* PNew = new LList;
295 PNew->data = value;
296 PNew->next = tmp->next;
297 tmp->next = PNew;
298 return true;
299 }
300
301 bool linkedList::oddEvenSort( linkedList& LA,linkedList& LB )
302 {
303 ios::sync_with_stdio(false);
304 if( isEmpty() )
305 {
306 cout << "原連結串列為空!分配元素失敗!" << endl;
307 return false;
308 }
309 //if( !LA.head->next && !LB.head->next )
310 if( !LA.head && !LB.head )
311 {
312 LA.initiateLinkedList();
313 LB.initiateLinkedList();
314 }
315 LList* tmp = head->next;
316 while(tmp)
317 {
318 if( tmp->data >= 0 && ( tmp->data & 1 ) )
319 LA.addLinkedListNodeLast( tmp->data );
320 //else if( tmp->data >= 0 && !( tmp->data & 1 ) )
321 else
322 LB.addLinkedListNodeLast( tmp->data );
323 tmp = tmp->next;
324 }
325 return true;
326 }
1 // LinkedList.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5 #include "linkedList1.h"
6
7 int main(int argc, char* argv[])
8 {
9 ios::sync_with_stdio(false);
10 freopen( "1.in", "r", stdin );
11
12 linkedList L1;//, L2;
13 int n;
14 cin >> n;
15 L1.createLinkedListFront(n);
16 cout << "原表表長為:" << endl;
17 cout << L1.linkedListLength() << endl;
18 cout << "原表元素為:" << endl;
19 L1.printLinkedList();
20 /*
21 L1.~linkedList();
22 cout << "現表表長為:" << endl;
23 cout << L1.linkedListLength() << endl;
24 cout << "現表元素為:" << endl;
25 L1.printLinkedList();
26 //L2.createLinkedListFront(5);
27 //cout << L2.linkedListLength() << endl;
28 //L2.printLinkedList();
29 22
30 30 70 92 91 15 47 84 10 43 34 9 62 60 26 79 96 38 4 92 24 25 5
31
32 linkedList L3;
33 int n;
34 cin >> n;
35 L3.createLinkedListRail(n);
36 cout << "原表表長為:" << endl;
37 cout << L3.linkedListLength() << endl;
38 cout << "原表元素為:" << endl;
39 L3.printLinkedList();//5,n,0,n+1,n+2
40
41 int value = -100;
42 int num;
43 cin >> num;
44 for( int i = 0; i < num; i ++ )
45 {
46 int pos;
47 cin >> pos;
48 if( L3.getElementByPosition( pos, value ) )
49 {
50 cout << "第 " << pos << " 個元素的值為:" << value << endl;
51
52 }
53 else
54 cout << "不存在位置為 " << pos << " 的元素!" << endl;
55 }
56
57 linkedList L4;
58 int n;
59 cin >> n;
60 L4.createLinkedListRail(n);
61 cout << "原表表長為:" << endl;
62 cout << L4.linkedListLength() << endl;
63 cout << "原表元素為:" << endl;
64 L4.printLinkedList();//x=100, i分別為5,n,n+1,0,1,n+2
65 int value = 100;
66 int num;
67 cin >> num;
68 for( int i = 0; i < num; i ++ )
69 {
70 int pos;
71 cin >> pos;
72 if( L4.insertListByPosition( pos, value ) )
73 {
74 cout << "value = " << value << " 的值已插在 pos = " << pos << "的位置上!" << endl;
75 cout << "現表表長為:" << endl;
76 cout << L4.linkedListLength() << endl;
77 cout << "現表元素為:" << endl;
78 L4.printLinkedList();
79 }
80 }
81
82 linkedList L5;
83 int n;
84 cin >> n;
85 L5.createLinkedListRail(n);
86 cout << "原表表長為:" << endl;
87 cout << L5.linkedListLength() << endl;
88 cout << "原表元素為:" << endl;
89 L5.printLinkedList();
90 int index = -1;
91 //1,17,20,88
92 for( int i = 0; i < 4; i ++ )
93 {
94 int value;
95 cin >> value;
96 if( L5.getElementByValue( index, value ) )
97 {
98 cout << "pos = " << index << ", value = " << 1 << endl;
99 }
100
101 else
102 {
103 cout << "連結串列中不存在值為 " << value << " 的值" << endl;
104 }
105 }
106
107 linkedList L6;
108 int n;
109 cin >> n;
110 L6.createLinkedListRail(n);
111 L6.printLinkedList();
112 cout << L6.linkedListLength() << endl;
113 int value = -1;
114 //5,n,1,n+1,0
115 if( L6.removeListNodeByPosition( 5, value ) )
116 {
117 cout << "pos = " << 5 << ", value = " << value << "已刪除!" << endl;
118 }
119 L6.printLinkedList();
120 if( L6.removeListNodeByPosition( n , value ) )
121 {
122 cout << "pos = " << n << ", value = " << value << "已刪除!" << endl;
123 }
124 else
125 {
126 cout << "不存在位置等於 " << n << " 的元素!" << endl;
127 }
128 L6.printLinkedList();
129 if( L6.removeListNodeByPosition( 1, value ) )
130 {
131 cout << "pos = " << 1 << ", value = " << value << "已刪除!" << endl;
132 }
133 L6.printLinkedList();
134 if( L6.removeListNodeByPosition( n + 1, value ) )
135 {
136 cout << "pos = " << n + 1 << ", value = " << value << "已刪除!" << endl;
137 }
138 else
139 {
140 cout << "不存在位置等於 " << n + 1 << " 的元素!" << endl;
141 }
142 L6.printLinkedList();
143 if( L6.removeListNodeByPosition( 0, value ) )
144 {
145 cout << "pos = " << 0 << ", value = " << value << "已刪除!" << endl;
146 }
147 else
148 {
149 cout << "不存在位置等於 " << 0 << " 的元素!" << endl;
150 }
151 L6.printLinkedList();
152
153
154 linkedList L7;
155 int n;
156 cin >> n;
157 L7.createLinkedListRail(n);
158 cout << "原表表長為:" << endl;
159 cout << L7.linkedListLength() << endl;
160 cout << "原表元素為:" << endl;
161 L7.printLinkedList();
162
163 //int value = -1;
164 //5,n,1,n+1,0
165 for( int i = 0; i < 1; i ++ )
166 {
167 int value;
168 cin >> value;
169 if( L7.removeListNodeByPosition( 5, value ) )
170 {
171 cout << "pos = " << 5 << ", value = " << value << "已刪除!" << endl;
172 cout << "現表表長為:" << endl;
173 cout << L7.linkedListLength() << endl;
174 cout << "現表元素為:" << endl;
175 L7.printLinkedList();
176 }
177 if( L7.removeListNodeByPosition( n , value ) )
178 {
179 cout << "pos = " << n << ", value = " << value << "已刪除!" << endl;
180 }
181 else
182 {
183 cout << "不存在位置等於 " << n << " 的元素!" << endl;
184 }
185 }
186
187 linkedList L8;
188 int n;
189 cin >> n;
190 L8.createLinkedListRail(n);
191 cout << "原表表長為:" << endl;
192 cout << L8.linkedListLength() << endl;
193
194 cout << "原表元素為:" << endl;
195 L8.printLinkedList();
196 int value;
197 for( int i = 0; i < 4; i ++ )
198 {
199 cin >> value;
200 if( L8.insertListSort(value) )
201 {
202 cout << "插入元素 " << value << " 後表長為:" << endl;
203 cout << L8.linkedListLength() << endl;
204 cout << "插入元素 " << value << " 表元素為:" << endl;
205 L8.printLinkedList();
206 }
207 else
208 cout << "Error!" << endl;
209 }
210
211 int n;
212 linkedList L9, LA, LB;
213 cin >> n;
214 L9.createLinkedListRail(n);
215 //LA.initiateLinkedList(), LB.initiateLinkedList();
216 cout << "原連結串列表長為:" << endl;
217 cout << L9.linkedListLength() << endl;
218 cout << "原連結串列元素為:" << endl;
219 L9.printLinkedList();
220 L9.oddEvenSort( LA, LB );
221 cout << "奇數連結串列表長為:" << endl;
222 cout << LA.linkedListLength() << endl;
223 cout << "奇數連結串列元素為:" << endl;
224 LA.printLinkedList();
225 cout << "偶數連結串列表長為:" << endl;
226 cout << LB.linkedListLength() << endl;
227 cout << "偶數連結串列元素為:" << endl;
228 LB.printLinkedList();
229 */
230 return 0;
231 }
圖1 測試(1)
圖2 測試(2)
圖3 測試(3)
圖4 測試(4)
圖5 測試(5)
圖6 測試(5)
圖7 測試(6)
圖8 測試(6)
圖9 測試(7)
圖10 測試(8)
圖11 測試(8)
圖12 測試(9)
圖13 測試(10)
圖14 測試(10)