#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct account
{
int accountnumber;
char name[50];
float balance;
struct account* next;
}account;
account* createnode(int accountnumber, const char* name, float balance) {
account* newnode = (account*)malloc(sizeof(account));
if (newnode == NULL)
{
printf(" 创建账户失败\n");
return NULL;
}
newnode->accountnumber = accountnumber;
newnode->balance = balance;
newnode->next = NULL;
strcpy(newnode->name, name);
return newnode;
}
void safe_scanf_int(int* num) {
int success = 0;
while (!success) {
printf("请输入一个整数: ");
success = scanf("%d", num);
while (getchar() != '\n');
if (!success) {
printf("输入无效,请重新输入\n");
}
}
}
void safe_scanf_float(float* num) {
int success = 0;
while (!success) {
printf("请输入一个浮点数: ");
success = scanf("%f", num);
while (getchar() != '\n');
if (!success) {
printf("输入无效,请重新输入\n");
}
}
}
void safe_scanf_string(char* str, size_t size) {
printf("请输入字符串: ");
if (fgets(str, size, stdin)) {
str[strcspn(str, "\n")] = '\0';
}
}
void traverserlist(int accountnumber, float amount, account* first)
{
account* current = first;
while (current->next != NULL)
{
if (current->accountnumber == accountnumber) {
current->balance += amount;
printf("账号 %d 的余额现在是 %.2f\n", accountnumber, current->balance);
return;
}
current = current->next;
}
printf("未找到账户号为%d的账户\n", accountnumber);
}
void withdraw(account* first, int accountnumber, float amount) {
account* current = first;
while (current != NULL) {
if (current->accountnumber == accountnumber) {
if (current->balance >= amount) {
current->balance -= amount;
printf("账号 %d 的余额现在是 %.2f\n", accountnumber, current->balance);
}
else {
printf("余额不足,无法取款\n");
}
return;
}
current = current->next;
}
printf("未找到账号为 %d 的账户\n", accountnumber);
}
void checkBalance(account* first, int accountnumber) {
account* current = first;
while (current != NULL) {
if (current->accountnumber == accountnumber) {
printf("账号 %d 的余额是 %.2f\n", accountnumber, current->balance);
return;
}
current = current->next;
}
printf("未找到账号为 %d 的账户\n", accountnumber);
}
void listAllAccounts(account* first) {
account* current = first;
while (current != NULL) {
printf("账号 %d, 姓名 %s, 余额 %.2f\n", current->accountnumber, current->name, current->balance);
current = current->next;
}
}
void free_a(account* first)
{
account* current = first;
account* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
}
int main() {
account* first = NULL;
float amount;
char name[50];
int accountnumber;
printf("输入0来创建账户\n输入1来存款到指定账户\n输入2来从指定账户取款\n输入3来查询指定账户的余额\n输入4来列出所有账户的信息\n输入5来终止操作");
while (1) {
int command = 9;
safe_scanf_int(&command);
if (command == 0) {
accountnumber++;
safe_scanf_string(name, sizeof(name));
safe_scanf_float(&amount);
account* newnode = createnode(accountnumber, name, amount);
if (first == NULL) {
first = newnode;
}
else {
account* current = first;
while (current->next != NULL) {
current = current->next;
}
current->next = newnode;
}
printf("创建账户%d成功,请进行下一步操作\n", accountnumber);
continue;
}
if (command == 1) {
safe_scanf_int(&accountnumber);
safe_scanf_float(&amount);
traverserlist(accountnumber, amount, first);
continue;
}
if (command == 2) {
safe_scanf_int(&accountnumber);
safe_scanf_float(&amount);
withdraw(first, accountnumber, amount);
continue;
}
if (command == 3) {
safe_scanf_int(&accountnumber);
checkBalance(first, accountnumber);
continue;
}
if (command == 4) {
listAllAccounts(first);
continue;
}
if (command == 5) {
break;
}
}
free_a(first);
return 0;
}