C++利用鏈表實現一個簡單的圖書信息管理系統,供大家參考,具體內容如下
(1)圖書信息包括ISBN號、書名、作者名、價格和數量等;
(2)系統的主要功能包括:圖書信息的創建、輸出圖書信息、查詢圖書信息、增加圖書信息、刪除圖書信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
#include <stdio.h> #include <stdlib.h> #include <string.h> //創建結構體及其成員 typedef struct Node { int num; //編號 char name[20]; //書名 char author[20]; //作者 int isexsit; //數量 float price; //價格 struct Node *next; //指針域 } S; //結構體定義為S //各函數定義 void choose(); void menu(); //菜單函數 S *create(); //創建鏈表函數 void print(S *); //輸出鏈表函數 void pop_sort(S *); //排序 void insert(S *); //插入節點函數 void del(S *); //刪除節點函數 void search1(S *); //書名查找節點函數 void search2(S *); //作者查找節點函數 void search3(S *); //編號查找 void mod(S *); //修改圖書信息 //主函數 int main() { choose(); } void choose() { S *head; int n, a = 1; //n用來控制選擇操作類型,a控制循環,以-1終止 while (a > 0) { menu(); //顯示菜單 printf ( "選擇你想使用的功能:" ); scanf ( "%d" , &n); //選擇操作 switch (n) //各操作數字對應菜單數字,通過n確定操作類型 { case 1: //創建 head = create(); break ; case 2: //輸出 printf ( "圖書信息為(按價格排序后)\n" ); pop_sort(head); printf ( "編號\t書名\t作者\t數量\t價格\n" ); print(head); break ; case 3: //插入 insert(head); printf ( "插入后\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); print(head); break ; case 4: //刪除 del(head); printf ( "刪除后\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); print(head); break ; case 5: //書名查找 search1(head); break ; case 6: //作者查找 search2(head); break ; case 7: //編號查找 search3(head); break ; case 8: //修改 mod(head); pop_sort(head); printf ( "圖書信息為\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); print(head); break ; default : a = -1; //跳出循環條件 break ; } } } //菜單模塊直接顯示 void menu() { printf ( "\n\n" ); printf ( "\t\t 歡迎使用圖書管理系統\n" ); printf ( "\t\t|----------SCORE-----------|\n" ); printf ( "\t\t|\t1.創建圖書 |\n" ); printf ( "\t\t|\t2.展示圖書信息 |\n" ); printf ( "\t\t|\t3.添加圖書信息 |\n" ); printf ( "\t\t|\t4.刪除圖書 |\n" ); printf ( "\t\t|\t5.按圖書名搜索 |\n" ); printf ( "\t\t|\t6.按作者名搜索 |\n" ); printf ( "\t\t|\t7.按圖書編號搜索 |\n" ); printf ( "\t\t|\t8.修改圖書信息 |\n" ); printf ( "\t\t|\t9.退出程序 |\n" ); printf ( "\t\t|--------------------------|\n" ); printf ( "\t\t\tchoice(1-9):\n" ); } //創建鏈表模塊 S *create() { S *head, *p, *q; //定義指針 int i; head = (S *) malloc ( sizeof (S)); //頭節點開辟空間 head->next = NULL; //置空頭節點的指針域 q = head; //q指針記錄頭節點的地址 p = head->next; //p指針記錄頭節點的指針域的地址 printf ( "請輸入圖書編號,圖書名,作者,圖書數量,價格,最后輸入0結束\n" ); int num; scanf ( "%d" , &num); while (num != 0) //輸入書籍編號輸入為零停止循環 { p = (S *) malloc ( sizeof (S)); //p指針開辟空間 //輸入各成員 p->num = num; scanf ( "%s %s %d %f" , p->name, p->author, &p->isexsit, &p->price); p->next = NULL; //置空p節點的指針域 q->next = p; //p,q節點連接 q = p; //q指針后移 printf ( "請輸入圖書編號,圖書名,作者,圖書數量,價格,最后輸入0結束\n" ); scanf ( "%d" , &num); } return head; //返回鏈表的起始地址 } //插入節點模塊(可多個插入) void insert(S *head) { int i, num, flag = 1; //flag實現判斷指針是否到達最后一個節點 S *p, *q, *r; //定義指針便于插入操作 printf ( "請輸入一本圖書的信息:\n" ); printf ( "請輸入圖書的編號,輸入0結束\n" ); scanf ( "%d" , &num); while (num != 0) //輸入編號不為零時循環,以零終止,可實現多個插入 { r = (S *) malloc ( sizeof (S)); //為r開辟空間 r->next = NULL; //置空r的指針域 r->num = num; printf ( "請輸入圖書名,作者,圖書數量,圖書價格\n" ); scanf ( "%s %s %d %f" , r->name, r->author, &r->isexsit, &r->price); q = head; //q指針記錄頭節點的地址 p = head->next; //p指針記錄頭節點的指針域的地址 while (q->next != NULL && p->price < r->price) //循環條件:當q->next不為空,以及按價格排序插入 { p = p->next; //p指針后移 q = q->next; //q指針后移 if (q->next == NULL) //這個判斷防止q->next為空時,在執行循環是出現野指針使程序出錯 { p = NULL; //防止出現野指針p q->next = r; //連接節點 r->next = NULL; //置空r指針域 flag = 0; //到達最后一個節點更改flag break ; } } if (flag) //判斷是否到達最后一個節點,為真執行該操作 { r->next = p; q->next = r; //實現將r節點插入鏈表 } printf ( "請輸入圖書編號,輸入0結束\n" ); scanf ( "%d" , &num); } } //刪除節點模塊 void del(S *head) { S *p, *q; //定義指針 int b; //用于輸入編號查找刪除 p = head; //p記錄頭節點的地址 q = head->next; //q記錄頭節點的指針域的地址 printf ( "請輸入你想要刪除的圖書編號:" ); //輸入編號 scanf ( "%d" , &b); while (q != NULL) //q不為空時執行循環 { if (q->num == b) //判斷是否找到輸入的編號 //為真時 { p->next = q->next; //斷開q節點 free (q); //釋放q節點neicun q = NULL; //置空q指針防止出現野指針 } else { //判斷為假時 p = p->next; //p指針后移 q = q->next; //q指針后移 } } if (p == NULL) //當查找到最后一個節點還未查到要刪除的編號時,輸出輸入錯誤 printf ( "輸入錯誤\n" ); } //書名查找模塊 void search1(S *head) { S *p; //定義指針 char name1[20]; //定義name1用于輸入查找書名 printf ( "請輸入你要搜素的書名:" ); //輸入查找書名 scanf ( "%s" , name1); p = head->next; while (p != NULL) { if ( strcmp (p->name, name1) == 0) //判斷是否找到書籍 { //為真時,輸出信息 printf ( "書籍信息\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); printf ( "%d\t%s\t%s\t%d\t%.2f\n" , p->num, p->name, p->author, p->isexsit, p->price); break ; } else //為假時 p = p->next; //指針后移 } if (p == NULL) //查找到最后一個節點還未查到要的編號時,輸出輸入錯誤 printf ( "輸入錯誤\n" ); } //作者查找模塊 void search2(S *head) { S *p; //定義指針 char name2[20]; //定義name2用于輸入查找書籍 printf ( "輸入你想要查詢的作者:" ); //輸入查找作者 scanf ( "%s" , name2); p = head->next; while (p != NULL) { if ( strcmp (p->author, name2) == 0) //判斷是否找到書籍 { //為真時,輸出信息 printf ( "書籍信息\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); printf ( "%d\t%s\t%s\t%d\t%.2f\n" , p->num, p->name, p->author, p->isexsit, p->price); break ; } else //為假時 p = p->next; //指針后移 } if (p == NULL) //查找到最后一個節點還未查到要的編號時,輸出輸入錯誤 printf ( "輸入錯誤\n" ); } //編號查找 void search3(S *head) { S *p; //定義指針 int num1; //定義num1用于輸入查找書籍 printf ( "請輸入你要搜索的圖書編號:" ); //輸入查找編號 scanf ( "%d" , &num1); p = head->next; while (p != NULL) { if (p->num == num1) //判斷是否找到書籍 { //為真時,輸出信息 printf ( "書籍信息\n" ); printf ( "編號\t書名\t作者\t數量\t價格\n" ); printf ( "%d\t%s\t%s\t%d\t%.2f\n" , p->num, p->name, p->author, p->isexsit, p->price); break ; } else //為假時 p = p->next; //指針后移 } if (p == NULL) //查找到最后一個節點還未查到要的編號時,輸出ERROR INPUT printf ( "輸入錯誤\n" ); } //修改信息模塊 void mod(S *head) { S *p; //定義指針 int num1, num2, isexsit1; //定義num1用于輸入查找書籍修改信息,num2用于修改 char name1[20], author1[20]; float price1; printf ( "請輸入你要修改的圖書編號:" ); //輸入要修改的圖書編號 scanf ( "%d" , &num1); p = head->next; while (p != NULL) { if (p->num == num1) //判斷是否找到書籍 { printf ( "請再次輸入 圖書編號,書名,作者,圖書數量 ,價格\n" ); //為真時,重輸圖書信息 scanf ( "%d %s %s %d %f" , &num2, name1, author1, &isexsit1, &price1); p->num = num2; strcpy (p->name, name1); strcpy (p->author, author1); p->isexsit = isexsit1; p->price = price1; break ; } else //為假時 p = p->next; //指針后移 } if (p == NULL) //查找到最后一個節點還未查到要的編號時,輸出輸入錯誤 printf ( "輸入錯誤\n" ); } void pop_sort(S *head) //鏈表冒泡排序 { //排序中沒有修改頭節點指針值,只是修改指針內容head->next的值 S *pre, *p, *tail, *temp; tail = NULL; pre = head; while ((head->next->next) != tail) //(head->next)!=tail同樣適用 ,多執行最后一個步比較 { p = head->next; pre = head; while (p->next != tail) { if ((p->price) > (p->next->price)) { pre->next = p->next; //交換節點方法 temp = p->next->next; p->next->next = p; p->next = temp; p = pre->next; //p回退一個節點 } p = p->next; //p再前進一個節點 pre = pre->next; } tail = p; } } //輸出鏈表模塊 void print(S *head) { int i; S *p = head->next; while (p) //當p不為空的時候執行 { printf ( "%d\t%s\t%s\t%d\t%.2f\n" , p->num, p->name, p->author, p->isexsit, p->price); printf ( "\n" ); p = p->next; //指針后移 } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_43896463/article/details/109043796