数据结构链表之活期账目储蓄管理系统(C++)
活期储蓄账目管理系统
1 问题内容与目的要求
(1)结构背景
链表是一种链式存储的数据结构,是用一组地址任意的存储单元存放线性表中的数据元素,链表中的数据是以结点来表示,每个结点的由元素+指针,其中元素就是存储数据的存储单元,指针就是链接每个结点的地址数据。
(2)实现目的通过指针对链表进行插入、删除、查找等功能具体题目内容如下:
本程序主要是模拟银行活期储蓄账目管理系统,并实现以下功能:
1.开户,开户市需要记录储蓄账户(包括账号、姓名、余额),并设置余额为0
2.销户,找到账户信息,若余额为0,则删除储户信息
3.向某账户存款,找到账户信息,修改账户余额(原来余额+存入金额),并生成一条交易记录(包括交易时间、存取款标志、交易金额)
4.从某账户取款,找到账户信息,修改账户余额(原来余额-取入金额),并生成一条交易记录(包括交易时间、存取款标志、交易金额)
5.显示所有账号信息,显示所有账户信息(账号、姓名、余额等)
6.查询某账户余额,找到要查找的账户,显示账户余额
7.查询某账户交易记录,找到要查询的账户,显示账户全部交易记录
8.如果将现有记录储存到文件,程序运行时从文件中读入相关信息,在程序运行结束时更新文件中的信息
9.如果要求添加计算利息的功能,应该如何进行(未成功实现)
本题目是活期储蓄账目管理系统,需要存储的信息由两部分构成,一个是账号信息,一个是存取款记录,其中在单链表中增加了一个指针域,即整个存储结构是由两个链表来进行存储,其中横向链表是存储了一个用户的存取记录等信息,纵向链表存储了用户的账号ID等信息。
图1 存储结构
其中对数据结构定义如下:`
typedef struct node_log
{
string DataTime;//交易时间
char W_D;//用于标记交易类型
float balance;
struct node_log *next;
} node_log,*p_mode_log;
typedef struct node_account
{
string ID;//用户ID
string Name;//用户姓名
float balance;//账户余额
struct node_log *first_node_log;
struct node_account *next;
int num;
} node_account,*p_node_account;``
##2.2.3函数原型以及功能介绍
main ( )
功能:主调函数。主要功能为调用各个函数,生成数据集,完成人机交互。程序执行总是从main函数开始,如果有有其他函数,则完成对其他函数的调用后再返回到主函数,最后由main函数结束整个程序。在执行程序时,由系统调用main函数 [1] 。main 函数是在程序启动中完成对具有静态存储期的非局部对象的初始化之后被调用的。
get_time ( )
功能:打印系统时间,用于记录存取款时间,并将时间在tmp,后面将tmp存入node_log存储结构的DataTime域;
add( )
功能:在存储结构node_account中顺序添加新的结点,并在新的结点内存储入用户从键盘上输入的数据并设置node_log的指针,使得原指向node_account的指针变成指向node_log的指针。
Delete ( )
功能:在存储结构node_account中删除原有或者新添加的结点,并让用户输入ID,与原有存储的ID进行匹配,并检查在该ID账户中余额是否为0,若为0则删除账户,将该账户在存储结构node_account中删除,若检查余额不为0则返回主界面。
get_money ( )
功能:实现取钱功能,先在存储结构node_account中找到匹配的ID,先将要取出的钱跟原来账户进行比较,如果取出的钱小于node_account中balance域中的金额则将用户要取出的钱与到node_account中的balance(金额)相减,并标记取出符号,通过调用time()函数打印出取款时间,创建一个新的结点,将上一个node_log指针指向新创建的结点中。如果取出的钱大于node_account中balance域中的金额则打印余额不足并返回。
store_money( )
功能:实现存钱功能,先在存储结构node_account中找到匹配的ID,将用户存入的钱与到node_account中的balance(金额)相加,并标记取出符号,通过调用time()函数打印出取款时间,创建一个新的结点,将上一个node_log指针指向新创建的结点中。
void show( )
功能:实现显示所有用户的功能。用while()循环对整个node_account进行遍历,若发现未创建node_account结构则先对结构进行创建,然后匹配用户输入的ID,如果匹配则输出存储在node_account存储的ID、Name、balance数据,用for()循环对node_log进行遍历,其中输出的结果个数等于node_log链表的表长。其输出的结果包含交易时间(DataTime),存取款(W_D),余额(balance)。
void search1( )
功能:实现查询账户余额的功能。先检查L是否已经被创建,若发现未创建node_account结构则先对结构进行创建,通过用if()语句在node_account链表中顺序查找与用户输入的ID相匹配的ID,如果匹配成功则对node_account进行遍历,输出node_account中的用户ID(ID),用户名(Name),余额(balance)。
search2( )
功能:查询账户交易记录的功能。先检查L是否已经被创建,若发现未创建node_account结构则先对结构进行创建,通过用if()语句在node_account链表中顺序查找与用户输入的ID相匹配的ID,如果匹配成功则对node_account进行遍历,输出node_account中的用户ID(ID),用户名(Name),余额(balance)。再用for()循环对node_log进行顺序遍历查找,并与存取款标记进行匹配,打印“存款”/“取款”,并输出交易时间(DataTime),存/取款(W_D),余额(balance)。
exit(0)
功能:exit(0)的意思指的是正常状态退出。exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出。退出程序,括号中的0表示程序的退出返回代码,无实际意义。exit()就是退出 , 0就是返回的参数, 也可以返回 1 -1 等 你可以用来判断函数是否正确返回。
C++代实现 (Xcode)
该代码也可在Code::blocks 20.03中实现
// main.cpp
// 活期储蓄账目管理系统
//
// Created by Tony's Macbook pro on 2021/6/16.
//
#include <iostream>
#include <fstream>
#include <string.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
typedef struct node_log
{
string DataTime;
char W_D;
float balance;
struct node_log *next;
} node_log,*p_mode_log;
typedef struct node_account
{
string ID;
string Name;
float balance;
struct node_log *first_node_log;
struct node_account *next;
int num;
} node_account,*p_node_account;
p_node_account L;
string get_time()
{
time_t t = time(0);
char tmp[64];
strftime(tmp,sizeof(tmp),"%Y/%m/%d/%X",localtime(&t));
return tmp;
}
void add()
{
if(L==NULL)
{
L=new node_account;
L->next=NULL;
}
p_node_account Lp = new node_account;
cout<<"请输入卡号:";
cin>>Lp->ID;
cout<<"请输入姓名:";
cin>>Lp->Name;
Lp-&