【C语言】由链表创建的简单的学生信息管理系统

#include <stdio.h>
#include <stdlib.h>
struct Student //学生信息结构
{
    char name[10];
    int num;
    int math;
};
struct Node //定义结点结构
{
    struct Student data;//student作为结构体变量
    struct Node *next;
};
struct Node *CreateList() //创建头节点
{
    struct Node *HeadNode = (struct Node *)malloc(sizeof(struct Node)); //动态分配内存
    HeadNode->next = NULL;
    return HeadNode; //返回头节点
}
struct Node *CreateNode(struct Student data) //创建节点
{
    struct Node *NewNode = (struct Node *)malloc(sizeof(struct Node)); //动态分配内存
    NewNode->data = data;                                              //给节点赋值
    NewNode->next = NULL;
    return NewNode;
}
void insertNodeByHead(struct Node *HeadNode, struct Student data) //头插法
{
    struct Node *NewNode = CreateNode(data); //创建新节点
    NewNode->next = HeadNode->next;          //把头节点的next赋给新节点的next
    HeadNode->next = NewNode;                //头节点的next赋给新节点,之后插入新节点,也将会成为头节点的next,而老节点将成为新节点的next
}
void DeleteNodeByData(struct Node *HeadNode, int num) //指定数据删除节点
{
    struct Node *posNode = HeadNode->next; //把头节点next赋给posNode(posNode就是要找的指定数据节点)
    struct Node *posNodeFront = HeadNode;  //posNodeFront作为posNode的前节点,作用就是链接posNode的next,这样posNode就可被释放即成功删除。
    if (posNode == NULL)                   //判断链表是否为空
    {
        printf("链表为空。");
    }
    else
    {
        while (posNode->data.num != num) //循环查找值是否对应,不对应就向下查找。
        {
            posNodeFront = posNode;
            posNode = posNodeFront->next; /*顺序往后推*/
            if (posNode == NULL)          //查找到结尾为NULL
            {
                printf("未找到指定数据。");
            }
        }
        posNodeFront->next = posNode->next; //找到数据并且执行跨越链接操作
        free(posNode);                      //释放(即删除)
    }
}
void printList(struct Node *HeadNode) //输出链表
{
    struct Node *pMove = HeadNode->next; //移动节点定位
    printf("编号\t姓名\t成绩\n");
    while (pMove) //循环输出
    {
        printf("%d\t%s\t%d\t\n", pMove->data.num, pMove->data.name, pMove->data.math);
        pMove = pMove->next;//移动节点往后走
    }
}
int main(void)//主函数
{
    struct Node *list = CreateList();//定义链表并创建
    struct Student st1;//存放学生信息
    while (1) //录入学生信息
    {
        printf("请输入学生的姓名,学号,成绩。\n");
        scanf("%s%d%d", st1.name, &st1.num, &st1.math);
        fflush(stdin);               //清除键盘缓冲区里的回车符
        insertNodeByHead(list, st1); //压入链表
        printf("countinue?(Y/N)?\n");
        int sign = getchar(); //标识符
        if (sign == 'n' || sign == 'N')
        {
            break;
        }
    }
    printf("是否删除学生信息?(Y/N)\n");
    fflush(stdin);//清除键盘缓冲区里的回车符
    int sign = getchar();
    if (sign == 'n' || sign == 'N')
    {
        ;
    }
    else
    {
        printf("请输入要删除的学生编号:\n");
        while (1)//删除信息循环
        {
            int num;
            scanf("%d", &num);
            DeleteNodeByData(list, num);//删除对应学号的学生信息
            printf("countinue?(Y/N)");
            fflush(stdin);//清空缓冲区
            int chioce = getchar();
            if (chioce == 'n' || chioce == 'N')
            {
                break;
            }
        }
    }
    printf("-------------------\n");
    printList(list);
    printf("-------------------\n");
    system("pause");
    return 0;
}

数据结构基础,代码释义已经放在注释里。
不过还是有很多问题,例如查找没有的学生信息之后会结束程序运行,算是一个BUG,还没有找到原因在哪里。
运行截图示例:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值