• 【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--下)


    目录

    1.补充上节插入节点的第三种方法(按序插入)

    图示说明需求原理:

    代码实现:

    实际效果:

    2.查询链表节点

    1.方法调用

    2.搜索函数实现 

    3.搜索功能结果展示测试

    3.删除链表

    1.图示删除链表的原理

    ​编辑

    2.函数调用

     3.代码实现删除函数

    4.结果展示

    4.释放整个链表

    1.函数调用

    2.释放链表的函数实现

     3.结果展示

     5.main函数最终所有代码


    3.搜索功能结果展示测试

    3.删除链表

    4.释放整个链表


    ---------------------------------------------------------------------------------------------------------------------------------

    1.补充上节插入节点的第三种方法(按序插入)

    图示说明需求原理:

    代码实现:

    1. //链表插入之 按序插入
    2. STU_NODE *insertLink(STU_NODE *head,STU_NODE tmp){
    3. //从堆区申请带插入的节点空间
    4. STU_NODE *pi = new STU_NODE();
    5. //给空间赋值
    6. *pi = tmp;
    7. pi->next = nullptr;
    8. //判断链表这个结点为不为空
    9. if(nullptr == head){ //不存在
    10. head = pi;
    11. }else{//链表存在
    12. //寻找插入点
    13. STU_NODE *pf=head, *pb = head;
    14. while((pb->num < pi->num)&& (pb->next != NULL))
    15. {
    16. //pf保存pb的位置
    17. pf = pb;//pb移动到下一个节点
    18. pb = pb->next;
    19. }
    20. //判断插入点的位置
    21. if(pb->num>=pi->num)//头部、中部插入
    22. {
    23. if(pb == head)
    24. {//头部
    25. pi->next = head;
    26. head = pi;
    27. }
    28. else{//尾部
    29. pf->next = pi;
    30. pi->next = pb;
    31. }
    32. }else{//尾部插入
    33. pb->next = pi;
    34. }
    35. }
    36. return head;
    37. }

    实际效果:

    2.查询链表节点

    1.方法调用

    2.搜索函数实现 

    1. STU_NODE *searchLink(STU_NODE *head,char *name){
    2. //判断链表是否存在
    3. //判断链表这个结点为不为空
    4. if(nullptr == head){ //不存在
    5. cout<<"Link is not exist"<
    6. return nullptr;
    7. }
    8. //逐个节点查询
    9. STU_NODE *pnode = head;
    10. while((strcpy_s(pnode->name,name) != 0) && (pnode->next != nullptr))
    11. pnode = pnode->next;
    12. if(strcpy_s(pnode->name,name) == 0){
    13. return pnode;
    14. }else{
    15. cout<<"未找到相关节点"<
    16. }
    17. }

    3.搜索功能结果展示测试

     

    3.删除链表

    1.图示删除链表的原理

    2.函数调用

     3.代码实现删除函数

    1. STU_NODE *deleteLink(STU_NODE *head,int num){
    2. //判断链表这个结点为不为空
    3. if(nullptr == head){ //不存在
    4. cout<<"Link is not exist"<
    5. return nullptr;
    6. }
    7. //逐个节点比较,寻找删除点
    8. STU_NODE *pf=head, *pb = head;
    9. while((pb->num != num) && (pb->next != nullptr)){
    10. pf = pb;
    11. pb = pb->next;
    12. }
    13. //找到删除点
    14. if(pb->num == num){
    15. if(pb == head) //头结点删除
    16. {
    17. head = head->next;
    18. }else{//中尾部删除
    19. pf->next = pb->next;
    20. }
    21. delete pb;
    22. }else{
    23. cout<<"未找到要删除的节点:"<
    24. }
    25. return head;
    26. }

    4.结果展示

     

    4.释放整个链表

    1.函数调用

    2.释放链表的函数实现

    1. STU_NODE *freeLink(STU_NODE *head)
    2. {
    3. //判断链表这个结点为不为空
    4. if(nullptr == head){ //不存在
    5. cout<<"Link is not exist"<
    6. return nullptr;
    7. }
    8. //逐个节点遍历删除
    9. STU_NODE *pb = head;
    10. while (pb != nullptr) {
    11. head = head->next;
    12. delete pb;
    13. pb = head;
    14. }
    15. return head;
    16. }

     3.结果展示

     5.main函数最终所有代码

    1. #include
    2. #include "link.h"
    3. #include
    4. using namespace std;
    5. STU_NODE *head = nullptr;
    6. int main()
    7. {
    8. helpMessage();
    9. while(1){
    10. char cmd[64] = "";
    11. cout<<"请输入操作指令: ";
    12. cin >> cmd;
    13. if(strcmp(cmd,"help") == 0){
    14. helpMessage();
    15. }else if(strcmp(cmd,"insert") == 0){
    16. cout << "-------insert-------"<
    17. cout<<"请输入要插入的节点信息(num name):";
    18. STU_NODE tmp;
    19. cin>>tmp.num>>tmp.name;
    20. //往哪个链表插,此时需要一个指向链表的头结点指针
    21. head = insertLink(head,tmp);
    22. }else if(strcmp(cmd,"print") == 0){
    23. //遍历链表
    24. printLink(head);
    25. }else if(strcmp(cmd,"search") == 0){
    26. cout << "-------search-------"<
    27. cout<<"请输入查询的姓名:";
    28. char name[32]="";
    29. cin>>name;
    30. STU_NODE *ret = nullptr;
    31. ret = searchLink(head,name);
    32. if(ret != nullptr){
    33. cout<<"查询的结构:num="<num<<", name="<name<
    34. }
    35. }else if(strcmp(cmd,"delete") == 0){
    36. cout << "-------delete-------"<
    37. cout << "请输入要删除的学号num: ";
    38. int num = 0;
    39. cin>>num;
    40. head = deleteLink(head,num);
    41. }else if(strcmp(cmd,"free") == 0){
    42. cout << "-------free-------"<
    43. head = freeLink(head);
    44. }else if(strcmp(cmd,"clear") == 0){
    45. system("cls");
    46. }else if(strcmp(cmd,"quit") == 0){
    47. head = freeLink(head);
    48. return 0;
    49. }
    50. }
    51. return 0;
    52. }

  • 相关阅读:
    C++ day6
    AI新工具 百分50%算力确达到了GPT-4水平;将音乐轨道中的人声、鼓声、贝斯等音源分离出来等
    【MySQL】内置函数——日期函数
    nginx.4——正向代理和反向代理(七层代理和四层代理)
    mysql 使用idb文件恢复数据
    C#调用innosetup实现自动打包
    系统架构技能之设计模式-工厂模式
    nikto工具的用法描述(漏洞分析)
    关于Dubbo传输协议与上传文件的坑
    Python API教程:API入门(上)
  • 原文地址:https://blog.csdn.net/Phofomy/article/details/134507175