本文實例為大家分享了C語言實現(xiàn)ATM機存取款系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
利用結(jié)構(gòu)體和構(gòu)造函數(shù)并且采用輸入輸出文件實現(xiàn)ATM機系統(tǒng)。
主要功能有:
利用三種方法查詢、開戶、登陸、菜單、取款、修改密碼、存款、轉(zhuǎn)賬、創(chuàng)建個人信息、輸出、刪除、增加、退出。
是一個功能齊全,完備的ATM機系統(tǒng)。
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
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
|
#include<stdio.h> #include<string.h> #include<stdlib.h> struct per //定義結(jié)構(gòu)體 { char name[20]; char ID[20]; int money; char mima[6]; struct per * next; }; typedef struct person //定義另一結(jié)構(gòu)體 { struct per kehu; struct person *next; }L; void chaxun( struct per *head); //各個函數(shù)的聲明 void kaihu( struct per *head); void denglu( struct per *head); void caidan( struct per *head); void qukuan( struct per *head); void xgmm( struct per *head); void cunkuan( struct per *head); void zhuanzhang( struct per *head); void chuangjian( struct person **Phead); void shuchu( struct person *Phead); void shanchu( struct person **Phead); void zengjia( struct person **Phead); void chaxun1( struct person *Phead); void chaxun2( struct person *Phead); void chaxun3( struct person *Phead); void tuichu(); void menu(); /*主函數(shù)*/ // void main() { char x; char choose; //choose為定義輸入選擇的變量 int flag=1; struct person *Phead=NULL; //Phead為定義二層頭指針 struct per *head=NULL; //head為定義一層頭指針 printf ( "*****************************\n" ); printf ( "**歡迎使用ATM自動取款機系統(tǒng)**\n" ); printf ( "*****************************\n" ); printf ( "——————————————\n" ); printf ( "| 1 開戶 |\n" ); printf ( "——————————————\n" ); printf ( "| 2 登陸 |\n" ); printf ( "——————————————\n" ); printf ( "| 3 前臺客戶信息查詢中心|\n" ); printf ( "——————————————\n" ); printf ( "| 4 請選擇您的需求 |\n" ); printf ( "——————————————\n" ); scanf ( "%s" ,&x); system ( "cls" ); switch (x) { case '1' : system ( "cls" ); kaihu(head); //調(diào)用開戶函數(shù) break ; case '2' : system ( "cls" ); denglu(head); //調(diào)用登陸函數(shù) break ; case '3' : system ( "cls" ); menu(); //調(diào)用后臺菜單函數(shù) break ; } while (flag) { system ( "cls" ); menu(); //調(diào)用后臺菜單函數(shù) choose= getchar (); switch (choose) { case '1' :chuangjian(&Phead); shuchu(Phead); //調(diào)用后臺輸出函數(shù) system ( "pause" ); system ( "cls" ); break ; case '2' :chaxun1(Phead); //調(diào)用后臺卡號查詢函數(shù) system ( "pause" ); system ( "cls" ); break ; case '3' :chaxun2(Phead); //調(diào)用后臺姓名查詢函數(shù) system ( "pause" ); system ( "cls" ); break ; case '4' : chaxun3(Phead); //調(diào)用后臺余額查詢函數(shù) system ( "pause" ); system ( "cls" ); break ; case '5' :shanchu(&Phead); //調(diào)用后臺刪除用戶函數(shù) system ( "pause" ); system ( "cls" ); break ; case '6' : zengjia(&Phead); //調(diào)用后臺增加用戶函數(shù) system ( "pause" ); system ( "cls" ); break ; case '7' :shuchu(Phead); //調(diào)用后臺輸出函數(shù)函數(shù) system ( "pause" ); system ( "cls" ); break ; case '8' :shuchu(Phead); system ( "pause" ); system ( "cls" ); break ; case '0' :flag=0; printf ( "The end.\n" ); break ; } } } /*開戶函數(shù)*/ void kaihu( struct per *head) { head=NULL; FILE *fp; //定義文件指針 struct per *p1=NULL,*p2=NULL; //p1,p2為定義鏈表指針 p1=( struct per*) malloc ( sizeof ( struct per)); //開辟內(nèi)存單元 printf ( "請輸入您的姓名:\n" ); //請數(shù)據(jù)輸入鏈表中 scanf ( "%s" ,p1->name); printf ( "請設置您的卡號:\n" ); scanf ( "%s" ,p1->ID); printf ( "請設置您銀行卡密碼:\n" ); scanf ( "%s" ,p1->mima); p1->money=0; p1->next=NULL; printf ( "您的個人信息為" ); printf ( "姓名:%s \n卡號:%s \n余額:%4d\n" ,p1->name,p1->ID,p1->money); if (NULL==head) //為新用戶開辟內(nèi)存單元 { head=( struct per *) malloc ( sizeof ( struct per)); head->next=p1; //進行頭插法,將其作為第一個節(jié)點 } else //為新增客戶開辟內(nèi)存單元 { for (p2=head;p2->next!=NULL;p2=p2->next); //進行尾插 p2->next=p1; } if ((fp= fopen ( "save.txt" , "ab+" ))==NULL) //打開文件 { printf ( "cannot poen file\n" ); return ; } if ( fwrite (p1, sizeof ( struct per),1,fp)!=1) //將鏈表信息寫入文件中 printf ( "file write error\n" ); fclose (fp); printf ( "\n" ); printf ( "恭喜您開戶成功,請登錄\n" ); system ( "pause" ); system ( "cls" ); denglu(head); } //登陸函數(shù) / void denglu( struct per *head) { char d[20]; char mima[20]; int i,j; FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前節(jié)點的指針,作為下一結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); printf ( " **********************\n" ); printf ( " ***歡迎來都建設銀行***\n" ); printf ( " **********************\n" ); for (j=1;j<4;j++) //限制卡號輸入的次數(shù)的循環(huán) { printf ( "請輸入您的卡號\n" ); scanf ( "%s" ,d); for (q=head;q!=NULL;q=q->next) //遍歷鏈表 { if ( strcmp (q->ID,d)!=0) //核對賬號 { continue ; //跳出循環(huán) } else { for (i=1;i<4;i++) //限制密碼輸入的次數(shù)的循環(huán) { printf ( "\n\n請輸入您的密碼\n" ); scanf ( "%s" ,mima); if ( strcmp (q->mima,mima)!=0) //核對密碼 { printf ( "密碼不正確。請重新輸入密碼\n" ); system ( "pause" ); system ( "cls" ); continue ; //若密碼不對,跳出循環(huán) } else { system ( "cls" ); caidan(head); //調(diào)用菜單函數(shù) } } printf ( "\n\n\n您輸入密碼三次錯誤,謝謝光臨\n" ); system ( "pause" ); system ( "cls" ); exit (0); } } printf ( "\n\n\n您輸入的卡號有誤,請重試\n" ); system ( "pause" ); system ( "cls" ); } printf ( "您的卡號三次輸入錯誤,謝謝使用\n" ); exit (0); } //銀行菜單函數(shù) / void caidan( struct per *head) { head=NULL; int i; //i為客戶選擇輸入的變量 while (1) { printf ( "請選擇您需要的業(yè)務\n" ); //銀行業(yè)務菜單 printf ( "*********************************\n" ); printf ( "** 1 取款 ***** 2 查詢 **\n" ); printf ( "*********************************\n" ); printf ( "** 3 轉(zhuǎn)賬 ***** 4 修改密碼**\n" ); printf ( "*********************************\n" ); printf ( "** 5 存款 ***** 6 退出 **\n" ); printf ( "*********************************\n" ); scanf ( "%d" ,&i); if (i<6||i>0) { switch (i) { case 1:qukuan(head); //調(diào)用銀行取款函數(shù) system ( "pause" ); system ( "cls" ); break ; case 2: system ( "cls" ); chaxun(head); //調(diào)用銀行查詢函數(shù) break ; case 3: system ( "cls" ); zhuanzhang(head); //調(diào)用銀行轉(zhuǎn)賬函數(shù) break ; case 4: system ( "cls" ); xgmm(head); //調(diào)用銀行修改密碼函數(shù) break ; case 5: system ( "cls" ); cunkuan(head); //調(diào)用銀行存款函數(shù) break ; case 6: system ( "cls" ); tuichu(); //調(diào)用銀行退出函數(shù) break ; } } else { printf ( "您的輸入有誤\n" ); system ( "pause" ); system ( "cls" ); } } } //銀行取款函數(shù) // void qukuan( struct per *head) { head=NULL; //head為鏈表頭指針 int i; FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒有讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前結(jié)點的指針,作為下一個結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); system ( "cls" ); printf ( "************************************\n" ); printf ( "** 1: 100元 ***** 2:200元 **\n" ); printf ( "************************************\n" ); printf ( "** 3: 300元 ***** 4:400元 **\n" ); printf ( "************************************\n" ); printf ( "** 5: 500元 ***** 6:600元 **\n" ); printf ( "************************************\n" ); printf ( "請按要求選擇您要取款的金額\n" ); scanf ( "%d" ,&i); if (i>6||i<=0) //限制輸入范圍 { printf ( "對不起,您的輸入有誤\n\n" ); return ; } else { i=100*i; //對應選項乘以一百為取款金額 if (i>q->money) { printf ( "對不起,您的金額不足\n" ); system ( "pause" ); system ( "cls" ); caidan(head); //調(diào)用取款機菜單函數(shù) } else { q->money-=i; //對金額進行處理 if ((fp= fopen ( "save.txt" , "wb+" ))==NULL) //打開文件 { printf ( "cannot open file\n" ); return ; } if ( fwrite (q, sizeof ( struct per),1,fp)!=1) //將修改的信息重新寫入文件 printf ( "file write error\n" ); printf ( "您已經(jīng)成功取走%d元\n" ); q->next=NULL; fclose (fp); //關(guān)閉文件 } } } //銀行轉(zhuǎn)賬函數(shù) / void zhuanzhang( struct per *head) { head=NULL; FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前結(jié)點的指針,作為下一個結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); int i,j,k; printf ( "請輸入帳號號碼\n" ); scanf ( "%d" ,&i); printf ( "請再次輸入帳號號碼\n" ); //核對卡號 scanf ( "%d" ,&j); if (i!=j) { printf ( "兩次賬號不同,請重新輸入\n" ); zhuanzhang(head); } else { system ( "cls" ); printf ( "************************************\n" ); printf ( "** 1: 100元 ***** 2:200元 **\n" ); printf ( "************************************\n" ); printf ( "** 3: 300元 ***** 4:400元 **\n" ); printf ( "************************************\n" ); printf ( "** 5: 500元 ***** 6:600元 **\n" ); printf ( "************************************\n" ); printf ( "請輸入轉(zhuǎn)賬金額\n" ); scanf ( "%d" ,&k); if (k>6||k<=0) { printf ( "對不起,您的輸入有誤\n\n" ); return ; } else { k=k*100; if (k>q->money) //對余額進行判斷 { printf ( "對不起,您的余額不足\n" ); system ( "pause" ); system ( "cls" ); caidan(head); } else { printf ( "您已成功轉(zhuǎn)賬%d元\n" ,k); q->money-=k; if ((fp= fopen ( "save.txt" , "wb+" ))==NULL) { printf ( "cannot open file\n" ); return ; } if ( fwrite (q, sizeof (per),1,fp)!=1) //將數(shù)據(jù)重新寫入文件 printf ( "file write error\n" ); q->next=NULL; fclose (fp); system ( "pause" ); system ( "cls" ); } } } } //銀行查詢函數(shù) / void chaxun( struct per *head) { head=NULL; //鏈表頭指針 FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前結(jié)點的指針,作為下一個結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); printf ( "您卡上原有余額%d元\n\n" ,q->money); system ( "pause" ); system ( "cls" ); } //銀行修改密碼函數(shù) // void xgmm( struct per *head) { head=NULL; //鏈表頭指針 char mima[20]; FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前結(jié)點的指針,作為下一個結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); printf ( "請輸入您的原密碼\n" ); scanf ( "%s" ,mima); if ( strcmp (q->mima,mima)==0) //核對密碼 { { printf ( "密碼正確\n" ); printf ( "請輸入您的新密碼:\n" ); scanf ( "%s" ,q->mima); if ((fp= fopen ( "save.txt" , "wb+" ))==NULL) //文件頭指針 { printf ( "cannot open file\n" ); } if ( fwrite (q, sizeof ( struct per),1,fp)!=1) //將修改的密碼重新寫入文件 printf ( "file write error\n" ); fclose (fp); printf ( "修改密碼成功\n\n\n\n\n" ); } } else { printf ( "您輸入的密碼與原密碼不同\n" ); return ; system ( "pause" ); } q->next=NULL; } //銀行存款函數(shù) void cunkuan( struct per *head) { int i; head=NULL; //鏈表頭指針 FILE *fp; //定義文件指針 struct per *p,*q=NULL; if ((fp= fopen ( "save.txt" , "rb+" ))==NULL) //打開一個二進制文件,為讀方式 { printf ( "不能打開文件\n" ); //如不能打開,則結(jié)束程序 } p=( struct per*) malloc ( sizeof ( struct per)); //申請空間 head=p; while (! feof (fp)) //循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束 { if (1!= fread (p, sizeof ( struct per),1,fp)) break ; //如果沒讀到數(shù)據(jù),跳出循環(huán) p->next=( struct per *) malloc ( sizeof ( struct per)); //為下一個結(jié)點申請空間 q=p; //保存當前結(jié)點的指針,作為下一個結(jié)點的前驅(qū) p=p->next; //指針后移,新讀入數(shù)據(jù)鏈到當前表尾 } q->next=NULL; //最后一個結(jié)點的后繼指針為空 fclose (fp); system ( "cls" ); printf ( "您卡上原有余額%d元\n" ,q->money); printf ( "************************************\n" ); printf ( "** 1: 100元 ***** 2:200元 **\n" ); printf ( "************************************\n" ); printf ( "** 3: 300元 ***** 4:400元 **\n" ); printf ( "************************************\n" ); printf ( "** 5: 500元 ***** 6:600元 **\n" ); printf ( "************************************\n" ); printf ( "請選擇您要存入的余額\n" ); scanf ( "%d" ,&i); if (i>6||i<=0) { printf ( "對不起,您的輸入有誤\n\n" ); return ; } else { i=100*i; q->money+=i; if ((fp= fopen ( "save.txt" , "wb+" ))==NULL) //打開文件 { printf ( "cannot open file\n" ); } if ( fwrite (q, sizeof ( struct per),1,fp)!=1) //將修改的密碼重新寫入文件 printf ( "file write error\n" ); printf ( "您已經(jīng)成功存取%d元\n" ,i); q->next=NULL; fclose (fp); system ( "pause" ); system ( "cls" ); } } //退出銀行函數(shù) /// void tuichu() { printf ( "謝謝使用\n" ); exit (0); } //后臺運行菜單函數(shù) /// void menu() { printf ( "****************歡迎來到建設銀行取款機系統(tǒng)****************\n\n\n\n" ); printf ( "**************************************************\n" ); printf ( "**** 1 建立信息并顯示 ****** 2 卡號查詢信息 ****\n" ); printf ( "**************************************************\n" ); printf ( "**** 3 姓名查詢信息 ****** 4 余額查詢信息 ****\n" ); printf ( "**************************************************\n" ); printf ( "**** 5 刪除某卡號信息 ****** 6 增加新的用戶 ****\n" ); printf ( "**************************************************\n" ); printf ( "**** 7 按余額降序輸出 ****** 8 輸出 ****\n" ); printf ( "**************************************************\n" ); printf ( "**** 0 退出 ****** 謝謝光臨 ****\n" ); printf ( "**************************************************\n" ); printf ( "請選擇您需要的業(yè)務\n\n" ); } //后臺運行創(chuàng)建鏈表函數(shù) void chuangjian( struct person **Phead) //*(*Phead)為指向結(jié)構(gòu)體指針的地址 { struct person *p,*t; //定義操作指針 char n[20]; char a[20]; int s; if (*Phead) *Phead=NULL; printf ( "請輸入卡號 姓名 余額 (若要結(jié)束請輸入三個為零)\n" ); printf ( "請輸入卡號\n" ); scanf ( "%s" ,n); printf ( "請輸入姓名\n" ); scanf ( "%s" ,a); printf ( "請輸入預存金額\n" ); scanf ( "%d" ,&s); if (s==0) return ; p=(L *) malloc ( sizeof (L)); //將信息輸入鏈表中 strcpy (p->kehu.ID,n); strcpy (p->kehu.name,a); *Phead=p; //將指針重新指向頭指針 printf ( "請輸入卡號\n" ); scanf ( "%s" ,n); printf ( "請輸入姓名\n" ); scanf ( "%s" ,a); printf ( "請輸入預存金額\n" ); scanf ( "%d" ,&s); while (s) { t=p; //將p的值賦給t,p又可以儲存下一個結(jié)點 p=(L *) malloc ( sizeof (L)); //為新結(jié)點開辟新的內(nèi)存 strcpy (p->kehu.ID,n); strcpy (p->kehu.name,a); p->kehu.money=s; p->next=NULL; t->next=p; //將p的值接在t(即上一個結(jié)點的后面) printf ( "請輸入卡號\n" ); //尾插法 scanf ( "%s" ,n); printf ( "請輸入姓名\n" ); scanf ( "%s" ,a); printf ( "請輸入預存金額\n" ); scanf ( "%d" ,&s); } } //后臺運行輸出鏈表函數(shù) / void shuchu( struct person *Phead) { printf ( "\n\n" ); if (NULL==Phead) { printf ( "沒有客戶信息可輸出!\n" ); //若頭指針指向空,則沒有客戶信息 return ; } while (Phead) //遍歷輸出鏈表中所有客戶信息 { printf ( "卡號:%s\n姓名:\n余額:%d\n" ,Phead->kehu.ID,Phead->kehu.name,Phead->kehu.money); Phead=Phead->next; } printf ( "\n\n" ); } //后臺運行卡號查詢函數(shù) /// void chaxun1( struct person*Phead) { char m[20]; //定義輸入查找客戶卡號的變量 if (NULL==Phead) //若頭指針向空,則沒有客戶信息 { printf ( "沒有客戶信息可查詢!\n" ); return ; } printf ( "請輸入要查詢的客戶卡號:\n" ); scanf ( "%s" ,m); while (NULL!=Phead&& strcmp (Phead->kehu.ID,m)!=0) //在鏈表中遍歷尋找中,直到鏈表存在并且卡號核對無誤 Phead=Phead->next; if (Phead==NULL) //若指針指最后指向空,則沒有客戶信息 printf ( "對不起,沒有該用戶!\n" ); else printf ( "卡號:%s\n姓名:\n余額:%d\n" ,Phead->kehu.ID,Phead->kehu.name,Phead->kehu.money); } //若找到,則輸出客戶信息 //后臺運行姓名查詢函數(shù) / void chaxun2( struct person *Phead) { char m[20]; //定義輸入查找客戶卡號的變量 if (NULL==Phead) //若頭指針向空,則沒有客戶信息 { printf ( "沒有客戶信息可查詢!\n" ); return ; } printf ( "請輸入要查詢的客戶姓名:\n" ); scanf ( "%s" ,m); while (NULL!=Phead&& strcmp (Phead->kehu.name,m)!=0) //在鏈表中遍歷尋找中,直到鏈表存在并且姓名核對無誤 Phead=Phead->next; if (Phead==NULL) //若指針指最后指向空,則沒有客戶信息 printf ( "對不起,沒有該用戶!\n" ); else printf ( "卡號:%s\n姓名:\n余額:%d\n" ,Phead->kehu.ID,Phead->kehu.name,Phead->kehu.money); } //若找到,則輸出客戶信息 //后臺運行余額查詢函數(shù) / void chaxun3( struct person *Phead) { long x; //定義輸入查找客戶余額的變量 if (NULL==Phead) //若頭指針向空,則沒有客戶信息 { printf ( "沒有客戶信息可查詢!\n" ); return ; } printf ( "請輸入要查詢的客戶信息的余額:\n" ); scanf ( "%ld" ,&x); while (NULL!=Phead&&Phead->kehu.money!=x) //在鏈表中遍歷尋找中,直到鏈表存在并且余額核對無誤,繼續(xù)尋找 Phead=Phead->next; if (Phead==NULL) //若指針指最后指向空,則沒有客戶信息 printf ( "對不起,沒有該用戶!\n" ); else printf ( "該客戶的信息為\n" ); printf ( "卡號:%s\n姓名:\n余額:%d\n" ,Phead->kehu.ID,Phead->kehu.name,Phead->kehu.money); } //若找到,則輸出客戶信息 //后臺運行刪除客戶信息函數(shù) /// void shanchu( struct person **Phead) //*(*Phead)為指向結(jié)構(gòu)體指針的地址 { char k[20]; //定義輸入查找客戶姓名卡號的變量 struct person *p=*Phead,*t; if (NULL==(*Phead)) //若指針最后指向空,則沒有客戶信息 { printf ( "沒有客戶信息可刪除!\n" ); return ; } printf ( "請輸入要刪除的客戶卡號:\n" ); scanf ( "%s" ,k); if (p->kehu.ID==k) //若第一個客戶就是,則讓頭指針指向下一個結(jié)點 *Phead=(*Phead)->next, free (p); else { while (NULL==p->next&&p->next->kehu.ID!=k) //遍歷尋找,核對客戶卡號 p=p->next; //當p->next沒指向空,并且客戶的卡號還沒找到,則繼續(xù)尋找 if (p->next==NULL) printf ( "對不起,沒有該客戶!\n" ); else { t=p->next; //如果找到,則把p->next的值賦給t p->next=p->next->next; } } } //后臺運行增加用戶信息函數(shù) void zengjia( struct person **Phead) //*(*Phead) 為指向結(jié)構(gòu)體指針的地址 { char n[20]; //定義輸入增加客戶卡號的變量 char a[20]; //定義輸入增加客戶姓名的變量 int s; L *p,*t,*k; //定義操作指針變量 printf ( "請輸入要插入的客戶信息\n" ); printf ( "請輸入卡號\n" ); //尾插法 scanf ( "%s" ,&n); printf ( "請輸入姓名\n" ); scanf ( "%s" ,a); printf ( "請輸入預存金額\n" ); scanf ( "%d" ,&s); p=(L *) malloc ( sizeof (L)); //開辟空間 strcpy (p->kehu.ID,a); //將新的客戶信息寫入鏈表 p->kehu.money=s; strcpy (p->kehu.name,n); if (NULL==(*Phead)) //如果是空鏈表,則把新客戶信息作為第一個結(jié)點 { *Phead=p; //頭插法 (*Phead)->next=NULL; return ; } else { p->next=(*Phead); //頭插法 (*Phead)=p; } } |
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家
原文鏈接:https://blog.csdn.net/qq_37859039/article/details/70888637