学习思路

为了彻底掌握链表,我决定写一个用链表实现的学生管理系统,其中有链表的增删改查和显示菜单界面,当把这些链表常用的操作都练熟了之后再去对应的做一些题,就可以彻底掌握链表

代码:

#include <iostream>
#include <cstring>
using namespace std;
#define NO_Value 20
#define NAME_Value 11

typedef struct Student
{
    char studentNo[NO_Value];
    char studentName[NAME_Value];
} st;
typedef struct node
{
    struct Student data;
    struct node *next;
} Node, *Link;
void myMenu() //菜单界面
{
    cout << "============================ 欢迎来到学生管理系统 ============================" << endl;
    cout << "\t\t ----------------------------------------\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              1.增加学生记录            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              2.删除学生记录            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              3.查找学生记录            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              4.修改学生记录            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              5.统计学生人数            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              6.显示学生记录            |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t|              7.退出系统                |\n";
    cout << "\t\t|                                        |\n";
    cout << "\t\t ----------------------------------------\n";
    cout << "请输入您的选择: ";
}
void inputStudent(Link p) //每当要增加学生时便调用这个函数接收用户的输入
{
    cout << "请输入学生的学号: ";

    cin >> p->data.studentNo;

    cout << "请输入学生的姓名: ";

    cin >> p->data.studentName;

    p->next = nullptr;
}

void inputStudentNo(char s[], char no[]) //每当要执行删除,修改和查询时便调用这个函数,接收用户输入的学号
{
    cout << "请输入要" << s << "的学生学号:";

    cin >> no;
}

bool addNode(Link head) //增加学生
{
    Link p, q;
    Link node;
    node = new Node;
    inputStudent(node); //调用这个函数接收用户输入要增加的学生的学号和姓名
    q = head;
    p = head->next;
    if (head->next == nullptr)
    {
        head->next = node;
    }
    else
    {
        while (nullptr != p)
        {
            if (node->data.studentNo < p->data.studentNo)
            {
                q->next = node;
                node->next = p;
                return true;
            }
            else
            {
                q = p;
                p = p->next;
            }
        }
        q->next = node;
    }
    return true;
}
bool deleteNode(Link head) //删除学生
{
    char no[NO_Value];
    inputStudentNo("删除", no); //调用这个函数接收用户输入要删除的学生的学号
    Link q = head;
    Link p = head->next;
    if (head == NULL || head->next == NULL)
    {
        return false;
    }
    while (p)
    {
        if (strcmp(p->data.studentNo, no) == 0)
        {
            q->next = p->next;
            free(p);
            cout << "删除成功!" << endl;
            return true;
        }
        else
        {
            q = p;
            p = p->next;
        }
    }
    return false;
}
bool queryNode(Link head) //查找学生,通过学号查找
{
    char no[NO_Value];
    inputStudentNo("查找", no); //调用这个函数接收用户输入要查找的学生的学号
    Link p = head->next;
    if (head == NULL || head->next == NULL)
    {
        return false;
    }
    while (p)
    {
        if (strcmp(p->data.studentNo, no) == 0)
        {
            cout << "查找到学号 " << p->data.studentNo << " 学生的姓名为:" << p->data.studentName << endl;
            return true;
        }
        else
        {
            p = p->next;
        }
    }
    return false;
}
bool modifyNode(Link head) //修改学生
{
    char no[NO_Value];
    inputStudentNo("修改", no); //调用这个函数接收用户输入要修改的学生的学号
    Link p = head->next;
    if (head == NULL || head->next == NULL)
    {
        return false;
    }
    while (p)
    {
        if (strcmp(p->data.studentNo, no) == 0)
        {
            cout << "请输入你要修改" << p->data.studentNo << "学生的姓名: ";
            cin >> p->data.studentName;
            cout << "修改成功!" << endl;
            cout << "修改后学号 " << p->data.studentNo << " 学生的姓名为: " << p->data.studentName << endl;
            return true;
        }
        else
        {
            p = p->next;
        }
    }
    return false;
}
int countNode(Link head) //统计学生人数
{
    Link p;
    int count = 0;
    p = head->next;
    while (p)
    {
        count++;
        p = p->next;
    }
    return count;
}
void displayNode(Link head) //显示系统现有的所有学生,也就是遍历整个链表输出链表所存储的数据,要注意如果为空就不进行遍历
{
    Link p = head->next;
    if (!p)
    {
        cout << "学生管理系统为空!" << endl;
    }
    else
    {
        while (p)
        {
            cout << "学生学号:" << p->data.studentNo << "\t";
            cout << "学生姓名:" << p->data.studentName << endl;
            p = p->next;
        }
    }
}
void clearLink(Link head) //释放整个链表的空间
{
    Link q, p;
    q = head;
    p = head->next;
    while (p)
    {
        q->next = p->next;
        free(p);
        p = q->next;
    }
    free(q);
}
int main()
{

    int select;
    int count;
    Link head;
    head = new Node;
    head->next = nullptr;
    while (1)
    {
        //菜单页面
        myMenu();

        scanf("%d", &select); //接收用户的选择
        switch (select)
        {
        case 1:
            //增加学生
            if (addNode(head))
            {
                cout << "插入成功!" << endl;
            }
            system("pause");
            system("cls");
            break;
        case 2:
            //删除学生
            if (!deleteNode(head))
            {
                cout << "删除失败,没有要删除的学生信息!" << endl;
            }
            system("pause");
            system("cls");
            break;
        case 3:
            //查找学生
            if (!queryNode(head))
            {
                cout << "查询失败,没有要查询的学生信息!" << endl;
            }
            system("pause");
            system("cls");
            break;
        case 4:
            //修改学生
            if (!modifyNode(head))
            {
                cout << "修改失败,没有要修改的学生信息!" << endl;
            }
            system("pause");
            system("cls");
            break;
        case 5:
            //统计学生人数
            count = countNode(head);
            cout << "学生人数为: " << count << endl;
            system("pause");
            system("cls");
            break;
        case 6:
            //显示现有学生
            displayNode(head);
            system("pause");
            system("cls");
            break;
        case 7:
            //释放所有链表空间,终止程序
            clearLink(head);
            return 0;
        default:
            cout << "输入不正确,应该输入1到7之间的数字" << endl;
            system("pause");
            system("cls");
            break;
        }
    }
    system("pause");
    return 0;
}