#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
// 定义学生信息结构体
typedef struct StudentMessage {
char name[20];
int ID;
int accountbalance;
struct StudentMessage* next;
} STU;
// int count(STU *phead){
// STU *pb=phead;
// int count=0;
// while(pb!=NULL){
// count++;
// pb=pb->next;
// }
// }
// 查询所有账户信息
void SearchAllTheAccounts(STU* phead) {
STU* pb = phead;
while (pb != NULL) {
printf("姓名:%20s || ID账号:%20d\n", pb->name, pb->ID);
pb = pb->next;
}
printf("NULL\n");
}
// 创建账户
// void CreateAccount(STU** phead) {
// int count = 0;
// STU* pb = *phead;
// while (pb != NULL) {
// count++;
// pb = pb->next;
// }
// pb = *phead;
// STU* newp = (STU*)malloc(sizeof(STU)); // 分配新节点的内存
// printf("\n输入您的名字:");
// scanf("%s", newp->name);
// newp->ID =pb->ID + count;
// printf("\n输入你想充值的金额:");
// scanf("%d",&newp->accountbalance);
// newp->next = NULL;
// while (pb->next != NULL) {
// pb = pb->next;
// }
// pb->next = newp;
// printf("您的id号码为%d",newp->ID);
// }
void CreateAccount(STU** phead) {
STU* pb = *phead;
STU* newp = (STU*)malloc(sizeof(STU));
printf("\n输入您的名字:");
scanf("%s", newp->name);
while (pb->next != NULL) {
pb = pb->next;
}
newp->ID = pb->ID + 1;
newp->next = NULL;
printf("\n输入你想充值的金额:");
scanf("%d", &newp->accountbalance);
pb->next = newp;
printf("您的id号码为%d\n", newp->ID);
}
void DeleteAccount(STU** phead)//注销账户
{
int count = 0;
STU* pb = *phead;
STU* pf = *phead;
int id;
printf("\n输入您的ID:");
scanf("%d", &id);
while (pb->ID != id && pb->next != NULL)
{
pf = pb;
pb = pb->next;
}
if (pb->ID == id)
{
if (pb == *phead)
{
*phead = pb->next;
}else{
pf->next = pb->next;
}
free(pb);
pb = NULL;
}else{
printf("没有找到您要注销的账户\n");
}
}
void AddAccount(STU* phead)//充值余额
{
int addation;
STU* pb = phead;
int count = 0;
int id;
printf("\n输入您的ID:");
scanf("%d", &id);
printf("\n输入你要充值的金额:");
scanf("%d", &addation);
while (pb != NULL) {
if (pb->ID == id) {
pb->accountbalance += addation;
count++;
break;
}
else {
pb = pb->next;
}
}
if (count == 0) {
printf("\n没有查找到您的信息");
}
}
void SerchAccountbanlance(STU* phead)//查找账户余额
{
STU* pb = phead;
int count = 0;
int id;
printf("\n输入您的ID:");
scanf("%d", &id);
while (pb != NULL) {
if (pb->ID ==id) {
printf("\n您的余额为%d", pb->accountbalance);
count++;
break;
}else{
pb = pb->next;
}
}
if (count == 0) {
printf("\n没有查找到您的信息");
}
}
// int main()
// {
// //创建一个随机数用于给不同学生不同的余额
// srand(time(NULL));
// // 初始化链表头
// STU* head = NULL;
// char names[][20] = { "lvzhongyu", "john", "arthon", "majinchao", "jack", "alien", "david", "lucy", "kevin", "adam","xiaohu", "weiwei", "jiejie", "knight", "mlxg", "theshy", "faker", "zues", "guma", "droan" };
// for (int i = 0; i < 20; ++i) {
// STU* newStudent = (STU*)malloc(sizeof(STU));
// // 设置每个学生的信息
// snprintf(newStudent->name, sizeof(newStudent->name), "%s", names[i]);
// newStudent->ID = 10001 + i; // 起始ID为10001
// newStudent->accountbalance = rand()%201; //初始余额为200元中的任意数
// newStudent->next = head; // 在链表头插入,头插节点
// head = newStudent; // 更新链表头
// }
int main() {
srand(time(NULL));
// 初始化链表头
STU* head = NULL;
char names[][20] = {"lvzhongyu", "john", "arthon", "majinchao", "jack", "alien", "david", "lucy", "kevin", "adam", "xiaohu", "weiwei", "jiejie", "knight", "mlxg", "theshy", "faker", "zues", "guma", "droan"};
for (int i = 0; i < 20; ++i) {
STU* newStudent = (STU*)malloc(sizeof(STU));
// 设置每个学生的信息
snprintf(newStudent->name, sizeof(newStudent->name), "%s", names[i]);
newStudent->ID = 10001 + i;
newStudent->accountbalance = rand() % 201;
newStudent->next = NULL;// 在链表尾部插入
if (head == NULL) {
head = newStudent; // 如果链表为空,直接将新节点设为头结点
} else {
// 否则,找到当前链表的尾节点,将新节点链接到其后
STU* tail = head;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newStudent;
}
}
char c = ' ';
printf("输入下列几个选项来表示您需要的操作\n"
"A.查询现有的账户ID\n"
"B.查询账户余额\n"
"C.对余额进行充值\n"
"D.创建新的账户\n"
"E.注销您的账户\n");
while (c != '#') {
printf("\n输入您要进行的操作(当您输入#时会结束程序): ");
scanf_s(" %c", &c);
switch (c) {
case 'A':
SearchAllTheAccounts(head);
break;
case 'B':
SerchAccountbanlance(head);
break;
case 'C':
AddAccount(head);
break;
case 'D':
CreateAccount(&head);
break;
case 'E':
DeleteAccount(&head);
break;
}
}
printf("\n感谢您的使用");
STU* cur = head;
while (cur != NULL) {
STU* temp = cur;
cur = cur->next;
free(temp);
}
return 0;
}
代码的主体大部分不变,在上篇文章中我提到创建账户时使用的是计数器的方法来赋值id,但是这种方法在面对删除过节点后是错误的,所以我这次采用了新的方式即为上一个账户的id加一。这样带来了一个新的问题,那就是我本来是头插节点,我的第一个用户是在链表的末尾,而我创建的新用户又是在末尾,所以我将代码改正为尾插节点。