前言
新手小白的第一次设计项目,希望大家提出修改意见。
一、题目要求与分析
模拟某银行活期储蓄账户管理。该银行有许多账户,每个账户的存取款或转账的流水账单操作次数无法预估,故皆采用链表进行处理。
现需要编写一个程序处理并保存每个账户的流水账单。每个账户的信息主要有:银行账号(关键字段)、姓名、身份证号、联系方式、流水账单信息等。其中流水账单信息(从链表)包括:日期、操作类别(存入、支取、转入、转出)、账号的余额等。转账时需要记录对方账户信息(只考虑在已有账户之间转账)。
增强功能:记录用户流水账单。查询某个用户指定时段的明细等。
定义结构体中包含账户信息;定义子函数解决各种操作类别。
二、程序实现步骤
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牛逼!!!!!!!