对于文章学生账户管理系统的改正

#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加一。这样带来了一个新的问题,那就是我本来是头插节点,我的第一个用户是在链表的末尾,而我创建的新用户又是在末尾,所以我将代码改正为尾插节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值