c++链表——银行账户管理系统


前言

新手小白的第一次设计项目,希望大家提出修改意见。


一、题目要求与分析

模拟某银行活期储蓄账户管理。该银行有许多账户,每个账户的存取款或转账的流水账单操作次数无法预估,故皆采用链表进行处理。
现需要编写一个程序处理并保存每个账户的流水账单。每个账户的信息主要有:银行账号(关键字段)、姓名、身份证号、联系方式、流水账单信息等。其中流水账单信息(从链表)包括:日期、操作类别(存入、支取、转入、转出)、账号的余额等。转账时需要记录对方账户信息(只考虑在已有账户之间转账)。
增强功能:记录用户流水账单。查询某个用户指定时段的明细等。

定义结构体中包含账户信息;定义子函数解决各种操作类别。

二、程序实现步骤

1.结构体与子函数声明

代码如下(示例):

#include <iostream>
#include <cstdio>
#include <cstdlib>

#define MAXNUM 30
using namespace std;

struct part{
    int number;
    char name[MAXNUM+1];
    int identification;
    int c_number;
    int money;
    struct part *next;
    // 此处,C++中可省略关键词struct(C语言中不可缺省)
};
part *find_part(part *head, int number);
// 不改变链表的首地址,故形参采用指针的值传递
void insert(part *&head);				
// 通过形参"返回"head的新地址,故形参为指针的引用
void search(part *head);
void update(part *head);
void print(const part *head);
void freelist(part *&head);				
// 增加一个函数,释放链表的所有结点。
// 否则程序退出后,链表个结点仍占用堆内存单元

2.主函数

明确操作类型

代码如下(示例):

int main() {
	part *first = NULL;	// 定义局部自动指针变量
	char code;
	for(;;){
	    cout<<"Enter operation code: "<<endl;
	    cout<<"i means insert."<<endl;
	    cout<<"s means search."<<endl;
	    cout<<"u means update."<<endl;
	    cout<<"p means print."<<endl;
	    cout<<"q means quit."<<endl;
	    cin>>code;
	    while(getchar()!='\n'){
	        ;
	    }
		if(code == 'q')	
		// 先判断是否退出,避免在下面的switch结构中难以退出。
		// 程序结束前还需要执行freelist释放链表各结点
			break;
	    switch(code){
	        case 'i':	insert(first);
	        break;
	        case 's':	search(first);
	        break;
	        case 'u':	update(first);;
	        break;
	        case 'p':	print(first);
	        break;
	        default:cout<<"Illegal code"<<endl;
	    }
	    cout<<endl; 
	}
	freelist(first);
	return 0;
}

3.子函数

1.find_part函数

//修改前
part *find_part(part *first, int number){
    struct part *p;
    for(p=first; p!=NULL && number > p->number 
    ;p=p->next)		
    // 这样的判断,强烈地依赖于链表有序的前提
		;
    if(p!=NULL && number==p->number){
    return p;
    }
    return NULL;
}
//修改后
part *find_part(part *first, int number){
    struct part *p;
	for(p=first; p!=NULL && p->number != number; 
	p = p->next)
		;
	return p;			
	// 修改后,无须分情况,返回p就可以了
}

2.insert函数

void insert(part *&first){
	part *cur, *prev, *new_node;
//new_node=(struct part*)malloc(sizeof(struct part));
	new_node = new part;
    if(new_node==NULL){
		cout << "Can't insert a node because there is not enough memory." << endl;
		return ;
    }
    cout<<"Enter your account number: ";
    cin >> new_node->number;
    for(cur=first,prev=NULL; cur!=NULL && new_node->number > cur->number; prev=cur,cur=cur->next)
		;
	if(cur!=NULL && new_node->number == cur->number){
        cout<<"account already exists."<<endl;
		delete new_node;
        return ;
    }
	cout<<"Enter your name: ";
	cin.getline(new_node->name, MAXNUM);
	// 处理掉输入编号后的换行字符
	cin.getline(new_node->name, MAXNUM);	
	// 读取真正的姓名字符串
    cout<<"Enter identification number: ";
	cin >> new_node->identification;
    cout<<"Enter cell phone number: ";
	cin >> new_node->c_number;
    cout<<"Enter rest money: ";
	cin >> new_node->money;  
    new_node->next=cur;
    if(prev==NULL)
        first=new_node;
    else
        prev->next=new_node;
}

注:
c语言中使用malloc前需加(struct part*)
c++中有new运算符来替换
3.search函数

void search(part *head){
    int number;
	part *p;
    cout<<"Enter account number: ";
    cin>>number;
    p=find_part(head, number);
    if(p!=NULL){
        cout<<"account name: "<<p->name<<endl;
        cout<<"identification number:"<<p->identification<<endl;
        cout<<"cell phone number: "<<p->c_number<<endl;
        cout<<"your rest money: "<<p->money<<endl;
    }
    else{
        cout<<"account not found."<<endl;
    }
}

4.update函数

void update(part *head){
    int number,change;
	part *p;
    cout<<"Enter account number: ";
    cin>>number;
    p=find_part(head, number);
    if(p!=NULL){
        cout<<"Enter change in account: (roll out use minus,roll in use add)";
        cin>>change;
        p->money+=change;
    }
    //add others' account
    else{
        cout<<"account not found."<<endl;
    }
}

5.print函数

void print(const part *first){
	const part *p;
    cout<<"Account Number\tAccount name\tIdentification number\tCellphone number\tBalance"<<endl;
    for(p=first;p!=NULL;p=p->next){
        cout<<p->number<<"\t"<<p->name<<"\t"
        <<p->identification<<"\t"<<p->c_number
        <<"\t"<<p->money << endl;
    }
}

6.freelist函数

void freelist(part *&head)
{
	part *p;
	while(head)
	{
		p = head;
		head = head->next;
		delete p;
	}
}

总结

不要使用全局变量,需要将链表传递给函数。如果使用全局变量,本程序中只能处理一条链表,无法处理多条同类型的链表
edg牛逼!!!!!!!

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zedkyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值