zoukankan      html  css  js  c++  java
  • C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享

    最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是《学生成绩管理系统》,其实当你项目写多了你就会发现:其实各类的管理系统都离不开一个核心——链表!

    是的,不管是你想要写学生成绩管理系统,宿舍管理系统、火车票管理系统亦或者还是旅游管理系统等等,都需要用的到我们的链式结构来写,那么今天呢,我们就来看看如何利用C语言链式管理系统应该如何来写!

    本期分享并不是直接教大家写这个学生成绩管理系统,而是以这个为线头,引出我们的大学项目类管理系统核心——链式结构。

    话不多说,我们接下来就来看看我们的本文核心——链式结构管理系统的核心源码吧!让你做到:一表在手,系统我有!

    源码献上

    先来看看我们的singleList.h文件的代码,这个文件实际上也就是对我们的数据进行具体的操作,当然,核心还是我们的链式结构:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct MM
    {
        char name[20];
        int age;
        int num;
        char addr[20];
    };
    struct Node
    {
        //int data;
        struct MM data;
        struct Node* next;
    };
    //所有涉及到数据的地方都要改
    struct Node* createHead()
    {
        struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
        headNode->next = NULL;
        return headNode;
    }
    struct Node* createNode(struct MM  data)
    {
        struct Node * newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode->data = data;
        newNode->next = NULL;
        return newNode;
    }
    void insertByHead(struct Node* headNode, struct MM data)
    {
        struct Node* newNode = createNode(data);
        newNode->next = headNode->next;
        headNode->next = newNode;
    }
    //按查找浏览
    void searchAllInfo(struct Node* headNode, char *name)
    {
        struct Node* pMove = headNode->next;
        while (pMove != NULL)
        {
            //!strcmp(pMove->data.name,name)条件可以改为
            //strcmp(pMove->data.name,name)==0
            //!:否定  真变假 ,假变真
            //!-1等于0
            //计算机中非零表示成立
            if (!strcmp(pMove->data.name, name))
                printf("%s	%d	%d	%s
    ", pMove->data.name, pMove->data.age, pMove->data.num, pMove->data.addr);
            pMove = pMove->next;
        }
    }
    //按姓名查找
    struct Node* searchInfo(struct Node* headNode, char *name)
    {
        struct Node* pMove = headNode->next;
        while (pMove != NULL&&strcmp(pMove->data.name, name))
        {
            pMove = pMove->next;
        }
        return pMove;        //返回NULL没有找到
    }
    
    //改为按照姓名的方式
    //删除一个方式
    void deleteByAppoin(struct Node* headNode, char *name)
    {
        struct Node* posNodeLeft = headNode;
        struct Node* posNode = headNode->next;
        //字符串比较+数据剥洋葱
        while (posNode != NULL&&strcmp(posNode->data.name ,name))
        {
            posNodeLeft = posNode;
            posNode = posNodeLeft->next;
        }
        if (posNode == NULL)
        {
            printf("未找到指定位置,无法删除!
    ");
        }
        else
        {
            posNodeLeft->next = posNode->next;
            free(posNode);
            posNode = NULL;
            printf("删除成功!
    ");
        }
    }
    
    //删除所有姓名相同的
    void deleteAll(struct Node* headNode, char *name)
    {
        while (searchInfo(headNode, name) != NULL)
        {
            deleteByAppoin(headNode, name);
        }
    }
    
    //修改所有姓名相同的
    void modifyALL(struct Node* headNode, char *name,struct MM newInfo)
    {
        while (searchInfo(headNode, name) != NULL)
        {
            searchInfo(headNode, name)->data = newInfo;
        }
    }
    
    //打印-->具体需求:抬头
    void printList(struct Node* headNode)
    {
        struct Node* pMove = headNode->next;
        //表格数据的表头
        printf("name	age	num	addr
    ");
        while (pMove != NULL)
        {
            //打印结构体的数据需要剥洋葱
            printf("%s	%d	%d	%s
    ", pMove->data.name, pMove->data.age, pMove->data.num, pMove->data.addr);
            pMove = pMove->next;
        }
    }
    
    //链表的冒泡排序
    void BubbleSortList(struct Node*headNode)
    {
        //0---size
        for (struct Node* p = headNode->next; p != NULL; p = p->next)
        {
            for (struct Node* q = headNode->next; q->next != NULL; q = q->next)
            {
                if ((q->data.age > q->next->data.age))
                {
                    struct MM tempData = q->data;
                    q->data = q->next->data;
                    q->next->data = tempData;
                }
            }
        }
        printList(headNode);
    }
    
    void BubbleSortByName(struct Node*headNode)
    {
        //0---size
        for (struct Node* p = headNode->next; p != NULL; p = p->next)
        {
            for (struct Node* q = headNode->next; q->next != NULL; q = q->next)
            {
                if (strcmp(q->data.name, q->next->data.name)>0)
                {
                    struct MM tempData = q->data;
                    q->data = q->next->data;
                    q->next->data = tempData;
                }
            }
        }
        printList(headNode);
    }

    好,接下来再来将我们的这个界面给完善一下:

    #define _CRT_SECURE_NO_WARNINGS
    #include "singleList.h"
    
    struct Node* list = NULL;    //存储数据的容器
    //1.菜单
    void makeMenu()
    {
        printf("-----------【小姐姐管理系统】--------
    ");
        printf("	0.退出系统
    ");
        printf("	1.录入信息
    ");
        printf("	2.浏览系统
    ");
        printf("	3.修改系统
    ");
        printf("	4.查找显示
    ");
        printf("	5.删除信息
    ");
        printf("	6.排序显示
    ");
        printf("-------------------------------------
    ");
    }
    //2.做按键交互
    void keyDown()
    {
        int userKey = 0;
        struct MM tempData;    //存储用户的数据
        struct Node* posNode = NULL;
        scanf("%d", &userKey);
        switch (userKey)
        {
        case 0:
            printf("正常退出,欢迎下次光临!
    ");
            system("pause");
            exit(0);
            break;
        case 1:
            //为当前函数传参
            //增加全局变量
            printf("请输入信息:(name,age,num,addr):");
            scanf("%s%d%d%s", tempData.name, &tempData.age, &tempData.num, tempData.addr);
            insertByHead(list,tempData);
            break;
        case 2:
            printList(list);
            break;
        case 3: //修改 --->修改作业
            printf("请输入要修改的姓名:");
            scanf("%s", tempData.name);
            //输入信息存储到临时变量 tempInfo
            //循环去做修改: 知道posNode==NULL 位置
            posNode = searchInfo(list, tempData.name);
            if (posNode == NULL)
            {
                printf("未找到指定位置,无法修改!");
            }
            else
            {
                printf("请输入新的信息:(name,age,num,addr):");
                scanf("%s%d%d%s", posNode->data.name, &posNode->data.age, &posNode->data.num, posNode->data.addr);
                //posNode->data=tempInfo;
                printf("修改成功!");
            }
            break;
        case 4: //查找
            printf("请输入要查找的姓名:");
            scanf("%s", tempData.name);
            searchAllInfo(list, tempData.name);
            break;
        case 5: //删除
            printf("请输入要删除的姓名:");
            scanf("%s", tempData.name);
            deleteByAppoin(list, tempData.name);
            break;
        case 6:
            BubbleSortList(list);
            break;        //
        default:
            printf("输入错误!,重新输入!
    ");
            break;
        }
    }
    int main()
    {
        list = createHead();    //1.创建容器
        while (1)
        {
            makeMenu();
            keyDown();
            system("pause");
            system("cls");
        }
        system("pause");
        return 0;
    }

    好了,本期分享就到这里了!希望能够对大家有帮助,希望大家都能依照本文分享的东西自己完成自己的管理系统哦~

    其实做为一个编程学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流Q群1108152000,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

    微信公众号:C语言编程学习基地,学习C/C++编程知识,欢迎关注~

  • 相关阅读:
    Python 解决: from pip import main ImportError: cannot import name 'main'
    tensorflow学习笔记
    python多线程、多进程相关知识
    灰度发布相关
    自定义flume的hbase sink 的序列化程序
    pyspark数据准备
    利用pipeline批量插入数据到redis
    CentOS Linux系统下更改Apache默认网站目录
    更改nginx网站根目录
    chkconfig用法
  • 原文地址:https://www.cnblogs.com/yxy6/p/13122191.html
Copyright © 2011-2022 走看看