VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 215|回复: 11

[已解决]链表删除最后一个节点的问题

[复制链接]
56_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-14 18:32:43 | 显示全部楼层 |阅读模式
我弄了一个链表,first是头指针,pre是指向前一个节点的指针,next是指向后一个节点的指针;问题是,我想删除链表最后一个节点,我照着网上做的,但是总提示我那个是空指针的错误,我该怎么办,困扰我一个假期了这个问题额!
最佳答案
57_avatar_small
2020-4-16 13:01:02
之前的回复有一些不正确,思考了一下。直接回复完整代码,该代码经过测试,且附带输入输出信息。
相关信息:windows10 64位  vs2015 解决方案平台x86

Student.h代码
  1. #pragma once

  2. #include<iostream>
  3. #include<string>
  4. #include<cstdlib>

  5. using namespace std;

  6. class Student
  7. {
  8. private:
  9.         friend class StudentMessage;
  10.         Student* next;        //指向下一个节点的指针
  11.         Student* pre;        //指向上一个节点的指针
  12.        
  13.         //string Class, Name, Sex; 建议分开定义,代码清晰
  14.         string Class;
  15.         string Name;
  16.         string Sex;

  17.         long long Number;
  18.         double Score[3];

  19. public:
  20.         //构造和析构函数统一在类外定义
  21.         Student();
  22.         Student(string _name, double* _score, long long _number, string _class, string _sex);
  23.         ~Student() {}
  24. };

  25. class StudentMessage
  26. {
  27. private:
  28.         friend class Student;
  29.         //Student* num[1000]{};//不需要额外的空间保存节点用来删除,
  30.                                                         //而且此处申请的空间大小为4*1000kb。楼主可多定义几个StudentMessage对象测试一下会怎么样。

  31.         Student* first;                //头指针
  32.         //Student* ex;                //不需要
  33.         int nums;                        //学生数

  34. public:
  35.         //构造和析构函数统一在类外定义
  36.         StudentMessage();
  37.         //以下注释代码,如果first和ex发生改变,内存泄漏。
  38.         //而且在该成程序中,只需要定义头指针就好。双向链表不需要ex(指向链表倒数第二个节点)
  39.         /*{
  40.                 first = new Student;//???
  41.                 ex = new Student;//???
  42.                 nums = 0;
  43.         }
  44.         */
  45.         ~StudentMessage();
  46.         //{
  47.                 //delete first;
  48.                 //delete ex;
  49.         //}
  50.         void Insert();
  51.         long Table();
  52.         void Find();
  53.         void Find_Num();
  54.         void Find_Name();
  55.         //void Change();
  56.         void Display();
  57.         void Delete();
  58.         void Delete_Name();
  59.         void Delete_Num();

  60. };
复制代码



Student.cpp代码
  1. #include"Student.h"

  2. Student::Student()
  3. {
  4.         Name = Class = Sex = "null";
  5.         Score[0] = Score[1] = Score[2] = 0;
  6.         Number = 0;
  7.         next = NULL;
  8.         pre = NULL;
  9. }

  10. Student::Student(string _name, double* _score, long long _number, string _class, string _sex)
  11. {
  12.         Name = _name;
  13.         Score[0] = _score[0];
  14.         Score[1] = _score[1];
  15.         Score[2] = _score[2];
  16.         Number = _number;
  17.         Class = _class;
  18.         Sex = _sex;
  19.         next = NULL;
  20.         pre = NULL;
  21. }

  22. StudentMessage::StudentMessage()
  23.         : first(NULL)
  24.         , nums(0)
  25. {
  26. }

  27. StudentMessage::~StudentMessage()
  28. {
  29. }

  30. long StudentMessage::Table()
  31. {
  32.         long ch;
  33.         cout << "*************           学生信息管理系统        ****************" << endl;
  34.         cout << endl;
  35.         cout << "*************          1、显示所有学生信息      ****************" << endl;
  36.         cout << "*************          2、录入学生信息          ****************" << endl;
  37.         cout << "*************          3、查询学生信息          ****************" << endl;
  38.         cout << "*************          4、修改学生信息          ****************" << endl;
  39.         cout << "*************          5、删除学生信息          ****************" << endl;
  40.         cout << "*************          6、系统初始化            ****************" << endl;
  41.         cout << "*************          0、退出系统              ****************" << endl;
  42.         cout << endl;
  43.         cout << "“选项(0—6)”" << endl;
  44.         cout << "请输入:";
  45.         cin >> ch;
  46.         return ch;
  47. }


  48. void StudentMessage::Insert()
  49. {
  50.         long long num;
  51.         string name, sex, cla;
  52.         double score[3];
  53.         cout << "请输入学生姓名:";
  54.         cin >> name;
  55.         cout << endl;
  56.         cout << "请输入学生性别:";
  57.         cin >> sex;
  58.         cout << endl;
  59.         cout << "请输入学生学号:";
  60.         cin >> num;
  61.         cout << endl;
  62.         cout << "请输入学生班级:";
  63.         cin >> cla;
  64.         cout << endl;
  65.         cout << "请输入第一门成绩:";
  66.         cin >> score[0];
  67.         cout << endl;
  68.         cout << "请输入第二门成绩:";
  69.         cin >> score[1];
  70.         cout << endl;
  71.         cout << "请输入第三门成绩:";
  72.         cin >> score[2];
  73.         cout << endl;

  74.         Student* newstu = new Student(name, score, num, cla, sex);
  75.         Student* pNode = this->first;
  76.         if (first == NULL)
  77.         {
  78.                 first = newstu;
  79.                 nums++;
  80.         }
  81.         else
  82.         {
  83.                 while (pNode)
  84.                 {
  85.                         if (pNode->next)
  86.                         {
  87.                                 pNode = pNode->next;
  88.                         }
  89.                         else
  90.                         {
  91.                                 break;
  92.                         }
  93.                 }
  94.                 pNode->next = newstu;
  95.                 newstu->pre = pNode;
  96.                 nums++;
  97.         }
  98. }

  99. void StudentMessage::Display()
  100. {
  101.         if (nums == 0)
  102.         {
  103.                 cout << "当前系统中无学生信息!!" << endl;
  104.         }
  105.         else
  106.         {
  107.                 Student * p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  108.                 while (p != NULL)
  109.                 {
  110.                         cout << "姓名:" << p->Name << " " <<
  111.                                 "学号:" << p->Number << " " <<
  112.                                 "班级:" << p->Class << " " <<
  113.                                 "性别:" << p->Sex << " " <<
  114.                                 "第一门成绩:" << p->Score[0] << " " <<
  115.                                 "第二门成绩:" << p->Score[1] << " " <<
  116.                                 "第三门成绩:" << p->Score[2] << endl;
  117.                         p = p->next;

  118.                 }
  119.         }
  120. }

  121. void StudentMessage::Find()
  122. {
  123.         //按1、姓名  2、学号 查找;

  124.         cout << "【1、姓名查找】" << endl;
  125.         cout << "【2、学号查找】" << endl;
  126.         cout << "【0、返回】" << endl;
  127.         cout << "请选择:" << endl;
  128.         long long op;
  129.         cin >> op;
  130.         switch (op)
  131.         {
  132.         case 1:Find_Name(); break;
  133.         case 2:Find_Num(); break;
  134.         default:
  135.                 cout << "请正确输入:";
  136.                 cin >> op;

  137.         }
  138.         cout << "是否继续查找?" << endl;
  139.         cout << "【1、继续查找】" << endl;
  140.         cout << "【0、返回菜单】" << endl;
  141.         int op1;
  142.         cin >> op1;
  143.         switch (op1)
  144.         {
  145.         case 1:
  146.                 Find();
  147.                 break;
  148.         default:
  149.                 break;
  150.         }
  151. }

  152. void StudentMessage::Find_Name()
  153. {
  154.         Student* p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  155.         string name;
  156.         cout << "请输入姓名:";
  157.         cin >> name;
  158.         int nor = 0;
  159.         while (p != NULL)
  160.         {
  161.                 if (p->Name == name)
  162.                 {
  163.                         nor++;
  164.                         cout << "姓名:" << p->Name << " " <<
  165.                                 "学号:" << p->Number << " " <<
  166.                                 "班级:" << p->Class << " " <<
  167.                                 "性别:" << p->Sex << " " <<
  168.                                 "第一门成绩:" << p->Score[0] << " " <<
  169.                                 "第二门成绩:" << p->Score[1] << " " <<
  170.                                 "第三门成绩:" << p->Score[2] << endl;

  171.                 }
  172.                 p = p->next;
  173.         }
  174.         if (nor == 0)
  175.         {
  176.                 cout << "无此同学..." << endl;
  177.                 cout << "是否继续?";
  178.                 cout << "【1、是】" << endl;
  179.                 cout << "【0、否】" << endl;
  180.                 long long op;
  181.                 cin >> op;
  182.                 while (op)
  183.                 {
  184.                         switch (op)
  185.                         {
  186.                         case 1:
  187.                                 Find_Name();
  188.                                 break;
  189.                         default:
  190.                                 cout << "请正确输入:";
  191.                                 cin >> op;
  192.                         }
  193.                 }
  194.         }
  195. }

  196. void StudentMessage::Find_Num()
  197. {
  198.         Student* p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  199.         long long number;
  200.         cout << "请输入学号:";
  201.         cin >> number;
  202.         int nor = 0;
  203.         while (p != NULL)
  204.         {
  205.                 if (p->Number == number)
  206.                 {
  207.                         nor++;
  208.                         cout << "姓名:" << p->Name << " " <<
  209.                                 "学号:" << p->Number << " " <<
  210.                                 "班级:" << p->Class << " " <<
  211.                                 "性别:" << p->Sex << " " <<
  212.                                 "第一门成绩:" << p->Score[0] << " " <<
  213.                                 "第二门成绩:" << p->Score[1] << " " <<
  214.                                 "第三门成绩:" << p->Score[2] << endl;

  215.                 }
  216.                 p = p->next;
  217.         }
  218.         if (nor == 0)
  219.         {
  220.                 cout << "无此同学..." << endl;
  221.                 cout << "是否继续?";
  222.                 cout << "【1、是】" << endl;
  223.                 cout << "【0、否】" << endl;
  224.                 long long op;
  225.                 cin >> op;
  226.                 while (op)
  227.                 {
  228.                         switch (op)
  229.                         {
  230.                         case 1:
  231.                                 Find_Num();
  232.                                 break;
  233.                         default:
  234.                                 cout << "请正确输入:";
  235.                                 cin >> op;
  236.                         }
  237.                 }
  238.         }
  239. }

  240. void StudentMessage::Delete()
  241. {
  242.         //按1、姓名  2、学号 删除;
  243.         cout << "【1、删除姓名】" << endl;
  244.         cout << "【2、删除学号】" << endl;
  245.         int op;
  246.         cin >> op;
  247.         switch (op)
  248.         {
  249.         case 1:
  250.                 Delete_Name();
  251.                 break;
  252.         case 2:
  253.                 Delete_Num();
  254.                 break;
  255.         default:
  256.                 cout << "请正确输入:";
  257.                 cin >> op;
  258.         }
  259. }

  260. void StudentMessage::Delete_Name()
  261. {
  262.         Student* pNode = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  263.         string name;
  264.         cout << "请输入姓名:";
  265.         cin >> name;
  266.         while (pNode != NULL)
  267.         {
  268.                 if (pNode->Name == name)
  269.                 {
  270.                         cout << "姓名:" << pNode->Name << " "
  271.                                 << "学号:" << pNode->Number << " "
  272.                                 << "班级:" << pNode->Class << " "
  273.                                 << "性别:" << pNode->Sex << " "
  274.                                 << "第一门成绩:" << pNode->Score[0] << " "
  275.                                 << "第二门成绩:" << pNode->Score[1] << " "
  276.                                 << "第三门成绩:" << pNode->Score[2] << endl;
  277.                         break;
  278.                 }
  279.                 pNode = pNode->next;
  280.         }

  281.         if (pNode == NULL)
  282.         {
  283.                 cout << "无此同学..." << endl;
  284.                 cout << "是否继续?";
  285.                 cout << "【1、是】" << endl;
  286.                 cout << "【0、否】" << endl;
  287.                 long long op;
  288.                 cin >> op;
  289.                 while (op)
  290.                 {
  291.                         switch (op)
  292.                         {
  293.                         case 1:
  294.                                 Find_Name();
  295.                                 break;
  296.                         default:
  297.                                 cout << "请正确输入:";
  298.                                 cin >> op;
  299.                         }
  300.                 }
  301.         }
  302.         else
  303.         {
  304.                 int op;
  305.                 cout << "是否删除?" << endl;
  306.                 cout << "【1、是】" << endl;
  307.                 cout << "【0、否】" << endl;
  308.                 cin >> op;

  309.                 if (op == 1)
  310.                 {       
  311.                         if (pNode->pre != NULL)
  312.                         {
  313.                                 pNode->pre->next = pNode->next;
  314.                         }

  315.                         if (pNode->next != NULL)
  316.                         {
  317.                                 pNode->next->pre = pNode->pre;
  318.                         }

  319.                         if (pNode == first)
  320.                         {
  321.                                 first = pNode->next;
  322.                         }

  323.                         delete pNode;
  324.                         --nums;

  325.                         if (nums == 0)
  326.                         {
  327.                                 first = NULL;
  328.                         }
  329.                 }
  330.         }
  331. }

  332. void StudentMessage::Delete_Num()
  333. {
  334.         Student* pNode = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  335.         long long number;
  336.         cout << "请输入学号:";
  337.         cin >> number;
  338.         while (pNode != NULL)
  339.         {
  340.                 if (pNode->Number == number)
  341.                 {
  342.                         cout << "姓名:" << pNode->Name << " "
  343.                                 << "学号:" << pNode->Number << " "
  344.                                 << "班级:" << pNode->Class << " "
  345.                                 << "性别:" << pNode->Sex << " "
  346.                                 << "第一门成绩:" << pNode->Score[0] << " "
  347.                                 << "第二门成绩:" << pNode->Score[1] << " "
  348.                                 << "第三门成绩:" << pNode->Score[2] << endl;
  349.                         break;
  350.                 }
  351.                 pNode = pNode->next;
  352.         }

  353.         if (pNode == NULL)
  354.         {
  355.                 cout << "无此同学..." << endl;
  356.                 cout << "是否继续?";
  357.                 cout << "【1、是】" << endl;
  358.                 cout << "【0、否】" << endl;
  359.                 long long op;
  360.                 cin >> op;
  361.                 while (op)
  362.                 {
  363.                         switch (op)
  364.                         {
  365.                         case 1:
  366.                                 Find_Name();
  367.                                 break;
  368.                         default:
  369.                                 cout << "请正确输入:";
  370.                                 cin >> op;
  371.                         }
  372.                 }
  373.         }
  374.         else
  375.         {
  376.                 int op;
  377.                 cout << "是否删除?" << endl;
  378.                 cout << "【1、是】" << endl;
  379.                 cout << "【0、否】" << endl;
  380.                 cin >> op;

  381.                 if (op == 1)
  382.                 {
  383.                         if (pNode->pre != NULL)
  384.                         {
  385.                                 pNode->pre->next = pNode->next;
  386.                         }

  387.                         if (pNode->next != NULL)
  388.                         {
  389.                                 pNode->next->pre = pNode->pre;
  390.                         }

  391.                         if (pNode == first)
  392.                         {
  393.                                 first = pNode->next;
  394.                         }

  395.                         delete pNode;
  396.                         --nums;

  397.                         if (nums == 0)
  398.                         {
  399.                                 first = NULL;
  400.                         }
  401.                 }
  402.         }
  403. }
复制代码


main.cpp
  1. #include <iostream>
  2. #include "Student.h"

  3. int main()
  4. {
  5.         StudentMessage studentmessage;
  6.        
  7.         long ch = studentmessage.Table();
  8.         do
  9.         {
  10.                 switch (ch)
  11.                 {
  12.                 case 1:
  13.                         studentmessage.Display();
  14.                         break;
  15.                 case 2:
  16.                         studentmessage.Insert();
  17.                         break;
  18.                 case 3:
  19.                         studentmessage.Find();
  20.                         break;
  21.                 case 4:
  22.                         //studentmessage.Change();
  23.                         break;
  24.                 case 5:
  25.                         studentmessage.Delete();
  26.                         break;
  27.                 case 6:
  28.                         //do 系统初始化
  29.                         break;
  30.                 default:
  31.                         break;
  32.                 }
  33.                 ch = studentmessage.Table();
  34.         } while (ch);


  35.         return 0;
  36. }
复制代码


测试输入输出信息:
  1. *************           学生信息管理系统        ****************

  2. *************          1、显示所有学生信息      ****************
  3. *************          2、录入学生信息          ****************
  4. *************          3、查询学生信息          ****************
  5. *************          4、修改学生信息          ****************
  6. *************          5、删除学生信息          ****************
  7. *************          6、系统初始化            ****************
  8. *************          0、退出系统              ****************

  9. “选项(0—6)”
  10. 请输入:2
  11. 请输入学生姓名:test01

  12. 请输入学生性别:man

  13. 请输入学生学号:01

  14. 请输入学生班级:01

  15. 请输入第一门成绩:100

  16. 请输入第二门成绩:100

  17. 请输入第三门成绩:100

  18. *************           学生信息管理系统        ****************

  19. *************          1、显示所有学生信息      ****************
  20. *************          2、录入学生信息          ****************
  21. *************          3、查询学生信息          ****************
  22. *************          4、修改学生信息          ****************
  23. *************          5、删除学生信息          ****************
  24. *************          6、系统初始化            ****************
  25. *************          0、退出系统              ****************

  26. “选项(0—6)”
  27. 请输入:2
  28. 请输入学生姓名:test02

  29. 请输入学生性别:01

  30. 请输入学生学号:02

  31. 请输入学生班级:01

  32. 请输入第一门成绩:100

  33. 请输入第二门成绩:100

  34. 请输入第三门成绩:100

  35. *************           学生信息管理系统        ****************

  36. *************          1、显示所有学生信息      ****************
  37. *************          2、录入学生信息          ****************
  38. *************          3、查询学生信息          ****************
  39. *************          4、修改学生信息          ****************
  40. *************          5、删除学生信息          ****************
  41. *************          6、系统初始化            ****************
  42. *************          0、退出系统              ****************

  43. “选项(0—6)”
  44. 请输入:2
  45. 请输入学生姓名:test03

  46. 请输入学生性别:01

  47. 请输入学生学号:03

  48. 请输入学生班级:01

  49. 请输入第一门成绩:100

  50. 请输入第二门成绩:100

  51. 请输入第三门成绩:100

  52. *************           学生信息管理系统        ****************

  53. *************          1、显示所有学生信息      ****************
  54. *************          2、录入学生信息          ****************
  55. *************          3、查询学生信息          ****************
  56. *************          4、修改学生信息          ****************
  57. *************          5、删除学生信息          ****************
  58. *************          6、系统初始化            ****************
  59. *************          0、退出系统              ****************

  60. “选项(0—6)”
  61. 请输入:1
  62. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  63. 姓名:test02 学号:2 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  64. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  65. *************           学生信息管理系统        ****************

  66. *************          1、显示所有学生信息      ****************
  67. *************          2、录入学生信息          ****************
  68. *************          3、查询学生信息          ****************
  69. *************          4、修改学生信息          ****************
  70. *************          5、删除学生信息          ****************
  71. *************          6、系统初始化            ****************
  72. *************          0、退出系统              ****************

  73. “选项(0—6)”
  74. 请输入:5
  75. 【1、删除姓名】
  76. 【2、删除学号】
  77. 1
  78. 请输入姓名:test02
  79. 姓名:test02 学号:2 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  80. 是否删除?
  81. 【1、是】
  82. 【0、否】
  83. 1
  84. *************           学生信息管理系统        ****************

  85. *************          1、显示所有学生信息      ****************
  86. *************          2、录入学生信息          ****************
  87. *************          3、查询学生信息          ****************
  88. *************          4、修改学生信息          ****************
  89. *************          5、删除学生信息          ****************
  90. *************          6、系统初始化            ****************
  91. *************          0、退出系统              ****************

  92. “选项(0—6)”
  93. 请输入:1
  94. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  95. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  96. *************           学生信息管理系统        ****************

  97. *************          1、显示所有学生信息      ****************
  98. *************          2、录入学生信息          ****************
  99. *************          3、查询学生信息          ****************
  100. *************          4、修改学生信息          ****************
  101. *************          5、删除学生信息          ****************
  102. *************          6、系统初始化            ****************
  103. *************          0、退出系统              ****************

  104. “选项(0—6)”
  105. 请输入:5
  106. 【1、删除姓名】
  107. 【2、删除学号】
  108. 2
  109. 请输入学号:01
  110. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  111. 是否删除?
  112. 【1、是】
  113. 【0、否】
  114. 1
  115. *************           学生信息管理系统        ****************

  116. *************          1、显示所有学生信息      ****************
  117. *************          2、录入学生信息          ****************
  118. *************          3、查询学生信息          ****************
  119. *************          4、修改学生信息          ****************
  120. *************          5、删除学生信息          ****************
  121. *************          6、系统初始化            ****************
  122. *************          0、退出系统              ****************

  123. “选项(0—6)”
  124. 请输入:1
  125. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  126. *************           学生信息管理系统        ****************

  127. *************          1、显示所有学生信息      ****************
  128. *************          2、录入学生信息          ****************
  129. *************          3、查询学生信息          ****************
  130. *************          4、修改学生信息          ****************
  131. *************          5、删除学生信息          ****************
  132. *************          6、系统初始化            ****************
  133. *************          0、退出系统              ****************

  134. “选项(0—6)”
  135. 请输入:5
  136. 【1、删除姓名】
  137. 【2、删除学号】
  138. 1
  139. 请输入姓名:test03
  140. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  141. 是否删除?
  142. 【1、是】
  143. 【0、否】
  144. 1
  145. *************           学生信息管理系统        ****************

  146. *************          1、显示所有学生信息      ****************
  147. *************          2、录入学生信息          ****************
  148. *************          3、查询学生信息          ****************
  149. *************          4、修改学生信息          ****************
  150. *************          5、删除学生信息          ****************
  151. *************          6、系统初始化            ****************
  152. *************          0、退出系统              ****************

  153. “选项(0—6)”
  154. 请输入:1
  155. 当前系统中无学生信息!!
  156. *************           学生信息管理系统        ****************

  157. *************          1、显示所有学生信息      ****************
  158. *************          2、录入学生信息          ****************
  159. *************          3、查询学生信息          ****************
  160. *************          4、修改学生信息          ****************
  161. *************          5、删除学生信息          ****************
  162. *************          6、系统初始化            ****************
  163. *************          0、退出系统              ****************

  164. “选项(0—6)”
  165. 请输入:
复制代码
[Z5A{IZC8A%NIDW}FEX2I6I.png




上一篇:求问一下这道字符串删除的题,谢谢!
下一篇:如何区分这道题中的两种风格?
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-16 13:01:02 | 显示全部楼层    本楼为最佳答案   
bestAnswer
之前的回复有一些不正确,思考了一下。直接回复完整代码,该代码经过测试,且附带输入输出信息。
相关信息:windows10 64位  vs2015 解决方案平台x86

Student.h代码
  1. #pragma once

  2. #include<iostream>
  3. #include<string>
  4. #include<cstdlib>

  5. using namespace std;

  6. class Student
  7. {
  8. private:
  9.         friend class StudentMessage;
  10.         Student* next;        //指向下一个节点的指针
  11.         Student* pre;        //指向上一个节点的指针
  12.        
  13.         //string Class, Name, Sex; 建议分开定义,代码清晰
  14.         string Class;
  15.         string Name;
  16.         string Sex;

  17.         long long Number;
  18.         double Score[3];

  19. public:
  20.         //构造和析构函数统一在类外定义
  21.         Student();
  22.         Student(string _name, double* _score, long long _number, string _class, string _sex);
  23.         ~Student() {}
  24. };

  25. class StudentMessage
  26. {
  27. private:
  28.         friend class Student;
  29.         //Student* num[1000]{};//不需要额外的空间保存节点用来删除,
  30.                                                         //而且此处申请的空间大小为4*1000kb。楼主可多定义几个StudentMessage对象测试一下会怎么样。

  31.         Student* first;                //头指针
  32.         //Student* ex;                //不需要
  33.         int nums;                        //学生数

  34. public:
  35.         //构造和析构函数统一在类外定义
  36.         StudentMessage();
  37.         //以下注释代码,如果first和ex发生改变,内存泄漏。
  38.         //而且在该成程序中,只需要定义头指针就好。双向链表不需要ex(指向链表倒数第二个节点)
  39.         /*{
  40.                 first = new Student;//???
  41.                 ex = new Student;//???
  42.                 nums = 0;
  43.         }
  44.         */
  45.         ~StudentMessage();
  46.         //{
  47.                 //delete first;
  48.                 //delete ex;
  49.         //}
  50.         void Insert();
  51.         long Table();
  52.         void Find();
  53.         void Find_Num();
  54.         void Find_Name();
  55.         //void Change();
  56.         void Display();
  57.         void Delete();
  58.         void Delete_Name();
  59.         void Delete_Num();

  60. };
复制代码



Student.cpp代码
  1. #include"Student.h"

  2. Student::Student()
  3. {
  4.         Name = Class = Sex = "null";
  5.         Score[0] = Score[1] = Score[2] = 0;
  6.         Number = 0;
  7.         next = NULL;
  8.         pre = NULL;
  9. }

  10. Student::Student(string _name, double* _score, long long _number, string _class, string _sex)
  11. {
  12.         Name = _name;
  13.         Score[0] = _score[0];
  14.         Score[1] = _score[1];
  15.         Score[2] = _score[2];
  16.         Number = _number;
  17.         Class = _class;
  18.         Sex = _sex;
  19.         next = NULL;
  20.         pre = NULL;
  21. }

  22. StudentMessage::StudentMessage()
  23.         : first(NULL)
  24.         , nums(0)
  25. {
  26. }

  27. StudentMessage::~StudentMessage()
  28. {
  29. }

  30. long StudentMessage::Table()
  31. {
  32.         long ch;
  33.         cout << "*************           学生信息管理系统        ****************" << endl;
  34.         cout << endl;
  35.         cout << "*************          1、显示所有学生信息      ****************" << endl;
  36.         cout << "*************          2、录入学生信息          ****************" << endl;
  37.         cout << "*************          3、查询学生信息          ****************" << endl;
  38.         cout << "*************          4、修改学生信息          ****************" << endl;
  39.         cout << "*************          5、删除学生信息          ****************" << endl;
  40.         cout << "*************          6、系统初始化            ****************" << endl;
  41.         cout << "*************          0、退出系统              ****************" << endl;
  42.         cout << endl;
  43.         cout << "“选项(0—6)”" << endl;
  44.         cout << "请输入:";
  45.         cin >> ch;
  46.         return ch;
  47. }


  48. void StudentMessage::Insert()
  49. {
  50.         long long num;
  51.         string name, sex, cla;
  52.         double score[3];
  53.         cout << "请输入学生姓名:";
  54.         cin >> name;
  55.         cout << endl;
  56.         cout << "请输入学生性别:";
  57.         cin >> sex;
  58.         cout << endl;
  59.         cout << "请输入学生学号:";
  60.         cin >> num;
  61.         cout << endl;
  62.         cout << "请输入学生班级:";
  63.         cin >> cla;
  64.         cout << endl;
  65.         cout << "请输入第一门成绩:";
  66.         cin >> score[0];
  67.         cout << endl;
  68.         cout << "请输入第二门成绩:";
  69.         cin >> score[1];
  70.         cout << endl;
  71.         cout << "请输入第三门成绩:";
  72.         cin >> score[2];
  73.         cout << endl;

  74.         Student* newstu = new Student(name, score, num, cla, sex);
  75.         Student* pNode = this->first;
  76.         if (first == NULL)
  77.         {
  78.                 first = newstu;
  79.                 nums++;
  80.         }
  81.         else
  82.         {
  83.                 while (pNode)
  84.                 {
  85.                         if (pNode->next)
  86.                         {
  87.                                 pNode = pNode->next;
  88.                         }
  89.                         else
  90.                         {
  91.                                 break;
  92.                         }
  93.                 }
  94.                 pNode->next = newstu;
  95.                 newstu->pre = pNode;
  96.                 nums++;
  97.         }
  98. }

  99. void StudentMessage::Display()
  100. {
  101.         if (nums == 0)
  102.         {
  103.                 cout << "当前系统中无学生信息!!" << endl;
  104.         }
  105.         else
  106.         {
  107.                 Student * p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  108.                 while (p != NULL)
  109.                 {
  110.                         cout << "姓名:" << p->Name << " " <<
  111.                                 "学号:" << p->Number << " " <<
  112.                                 "班级:" << p->Class << " " <<
  113.                                 "性别:" << p->Sex << " " <<
  114.                                 "第一门成绩:" << p->Score[0] << " " <<
  115.                                 "第二门成绩:" << p->Score[1] << " " <<
  116.                                 "第三门成绩:" << p->Score[2] << endl;
  117.                         p = p->next;

  118.                 }
  119.         }
  120. }

  121. void StudentMessage::Find()
  122. {
  123.         //按1、姓名  2、学号 查找;

  124.         cout << "【1、姓名查找】" << endl;
  125.         cout << "【2、学号查找】" << endl;
  126.         cout << "【0、返回】" << endl;
  127.         cout << "请选择:" << endl;
  128.         long long op;
  129.         cin >> op;
  130.         switch (op)
  131.         {
  132.         case 1:Find_Name(); break;
  133.         case 2:Find_Num(); break;
  134.         default:
  135.                 cout << "请正确输入:";
  136.                 cin >> op;

  137.         }
  138.         cout << "是否继续查找?" << endl;
  139.         cout << "【1、继续查找】" << endl;
  140.         cout << "【0、返回菜单】" << endl;
  141.         int op1;
  142.         cin >> op1;
  143.         switch (op1)
  144.         {
  145.         case 1:
  146.                 Find();
  147.                 break;
  148.         default:
  149.                 break;
  150.         }
  151. }

  152. void StudentMessage::Find_Name()
  153. {
  154.         Student* p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  155.         string name;
  156.         cout << "请输入姓名:";
  157.         cin >> name;
  158.         int nor = 0;
  159.         while (p != NULL)
  160.         {
  161.                 if (p->Name == name)
  162.                 {
  163.                         nor++;
  164.                         cout << "姓名:" << p->Name << " " <<
  165.                                 "学号:" << p->Number << " " <<
  166.                                 "班级:" << p->Class << " " <<
  167.                                 "性别:" << p->Sex << " " <<
  168.                                 "第一门成绩:" << p->Score[0] << " " <<
  169.                                 "第二门成绩:" << p->Score[1] << " " <<
  170.                                 "第三门成绩:" << p->Score[2] << endl;

  171.                 }
  172.                 p = p->next;
  173.         }
  174.         if (nor == 0)
  175.         {
  176.                 cout << "无此同学..." << endl;
  177.                 cout << "是否继续?";
  178.                 cout << "【1、是】" << endl;
  179.                 cout << "【0、否】" << endl;
  180.                 long long op;
  181.                 cin >> op;
  182.                 while (op)
  183.                 {
  184.                         switch (op)
  185.                         {
  186.                         case 1:
  187.                                 Find_Name();
  188.                                 break;
  189.                         default:
  190.                                 cout << "请正确输入:";
  191.                                 cin >> op;
  192.                         }
  193.                 }
  194.         }
  195. }

  196. void StudentMessage::Find_Num()
  197. {
  198.         Student* p = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  199.         long long number;
  200.         cout << "请输入学号:";
  201.         cin >> number;
  202.         int nor = 0;
  203.         while (p != NULL)
  204.         {
  205.                 if (p->Number == number)
  206.                 {
  207.                         nor++;
  208.                         cout << "姓名:" << p->Name << " " <<
  209.                                 "学号:" << p->Number << " " <<
  210.                                 "班级:" << p->Class << " " <<
  211.                                 "性别:" << p->Sex << " " <<
  212.                                 "第一门成绩:" << p->Score[0] << " " <<
  213.                                 "第二门成绩:" << p->Score[1] << " " <<
  214.                                 "第三门成绩:" << p->Score[2] << endl;

  215.                 }
  216.                 p = p->next;
  217.         }
  218.         if (nor == 0)
  219.         {
  220.                 cout << "无此同学..." << endl;
  221.                 cout << "是否继续?";
  222.                 cout << "【1、是】" << endl;
  223.                 cout << "【0、否】" << endl;
  224.                 long long op;
  225.                 cin >> op;
  226.                 while (op)
  227.                 {
  228.                         switch (op)
  229.                         {
  230.                         case 1:
  231.                                 Find_Num();
  232.                                 break;
  233.                         default:
  234.                                 cout << "请正确输入:";
  235.                                 cin >> op;
  236.                         }
  237.                 }
  238.         }
  239. }

  240. void StudentMessage::Delete()
  241. {
  242.         //按1、姓名  2、学号 删除;
  243.         cout << "【1、删除姓名】" << endl;
  244.         cout << "【2、删除学号】" << endl;
  245.         int op;
  246.         cin >> op;
  247.         switch (op)
  248.         {
  249.         case 1:
  250.                 Delete_Name();
  251.                 break;
  252.         case 2:
  253.                 Delete_Num();
  254.                 break;
  255.         default:
  256.                 cout << "请正确输入:";
  257.                 cin >> op;
  258.         }
  259. }

  260. void StudentMessage::Delete_Name()
  261. {
  262.         Student* pNode = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  263.         string name;
  264.         cout << "请输入姓名:";
  265.         cin >> name;
  266.         while (pNode != NULL)
  267.         {
  268.                 if (pNode->Name == name)
  269.                 {
  270.                         cout << "姓名:" << pNode->Name << " "
  271.                                 << "学号:" << pNode->Number << " "
  272.                                 << "班级:" << pNode->Class << " "
  273.                                 << "性别:" << pNode->Sex << " "
  274.                                 << "第一门成绩:" << pNode->Score[0] << " "
  275.                                 << "第二门成绩:" << pNode->Score[1] << " "
  276.                                 << "第三门成绩:" << pNode->Score[2] << endl;
  277.                         break;
  278.                 }
  279.                 pNode = pNode->next;
  280.         }

  281.         if (pNode == NULL)
  282.         {
  283.                 cout << "无此同学..." << endl;
  284.                 cout << "是否继续?";
  285.                 cout << "【1、是】" << endl;
  286.                 cout << "【0、否】" << endl;
  287.                 long long op;
  288.                 cin >> op;
  289.                 while (op)
  290.                 {
  291.                         switch (op)
  292.                         {
  293.                         case 1:
  294.                                 Find_Name();
  295.                                 break;
  296.                         default:
  297.                                 cout << "请正确输入:";
  298.                                 cin >> op;
  299.                         }
  300.                 }
  301.         }
  302.         else
  303.         {
  304.                 int op;
  305.                 cout << "是否删除?" << endl;
  306.                 cout << "【1、是】" << endl;
  307.                 cout << "【0、否】" << endl;
  308.                 cin >> op;

  309.                 if (op == 1)
  310.                 {       
  311.                         if (pNode->pre != NULL)
  312.                         {
  313.                                 pNode->pre->next = pNode->next;
  314.                         }

  315.                         if (pNode->next != NULL)
  316.                         {
  317.                                 pNode->next->pre = pNode->pre;
  318.                         }

  319.                         if (pNode == first)
  320.                         {
  321.                                 first = pNode->next;
  322.                         }

  323.                         delete pNode;
  324.                         --nums;

  325.                         if (nums == 0)
  326.                         {
  327.                                 first = NULL;
  328.                         }
  329.                 }
  330.         }
  331. }

  332. void StudentMessage::Delete_Num()
  333. {
  334.         Student* pNode = first;//此处修改,原代码为Student * p = first->next;。修改原因first指向第一个节点
  335.         long long number;
  336.         cout << "请输入学号:";
  337.         cin >> number;
  338.         while (pNode != NULL)
  339.         {
  340.                 if (pNode->Number == number)
  341.                 {
  342.                         cout << "姓名:" << pNode->Name << " "
  343.                                 << "学号:" << pNode->Number << " "
  344.                                 << "班级:" << pNode->Class << " "
  345.                                 << "性别:" << pNode->Sex << " "
  346.                                 << "第一门成绩:" << pNode->Score[0] << " "
  347.                                 << "第二门成绩:" << pNode->Score[1] << " "
  348.                                 << "第三门成绩:" << pNode->Score[2] << endl;
  349.                         break;
  350.                 }
  351.                 pNode = pNode->next;
  352.         }

  353.         if (pNode == NULL)
  354.         {
  355.                 cout << "无此同学..." << endl;
  356.                 cout << "是否继续?";
  357.                 cout << "【1、是】" << endl;
  358.                 cout << "【0、否】" << endl;
  359.                 long long op;
  360.                 cin >> op;
  361.                 while (op)
  362.                 {
  363.                         switch (op)
  364.                         {
  365.                         case 1:
  366.                                 Find_Name();
  367.                                 break;
  368.                         default:
  369.                                 cout << "请正确输入:";
  370.                                 cin >> op;
  371.                         }
  372.                 }
  373.         }
  374.         else
  375.         {
  376.                 int op;
  377.                 cout << "是否删除?" << endl;
  378.                 cout << "【1、是】" << endl;
  379.                 cout << "【0、否】" << endl;
  380.                 cin >> op;

  381.                 if (op == 1)
  382.                 {
  383.                         if (pNode->pre != NULL)
  384.                         {
  385.                                 pNode->pre->next = pNode->next;
  386.                         }

  387.                         if (pNode->next != NULL)
  388.                         {
  389.                                 pNode->next->pre = pNode->pre;
  390.                         }

  391.                         if (pNode == first)
  392.                         {
  393.                                 first = pNode->next;
  394.                         }

  395.                         delete pNode;
  396.                         --nums;

  397.                         if (nums == 0)
  398.                         {
  399.                                 first = NULL;
  400.                         }
  401.                 }
  402.         }
  403. }
复制代码


main.cpp
  1. #include <iostream>
  2. #include "Student.h"

  3. int main()
  4. {
  5.         StudentMessage studentmessage;
  6.        
  7.         long ch = studentmessage.Table();
  8.         do
  9.         {
  10.                 switch (ch)
  11.                 {
  12.                 case 1:
  13.                         studentmessage.Display();
  14.                         break;
  15.                 case 2:
  16.                         studentmessage.Insert();
  17.                         break;
  18.                 case 3:
  19.                         studentmessage.Find();
  20.                         break;
  21.                 case 4:
  22.                         //studentmessage.Change();
  23.                         break;
  24.                 case 5:
  25.                         studentmessage.Delete();
  26.                         break;
  27.                 case 6:
  28.                         //do 系统初始化
  29.                         break;
  30.                 default:
  31.                         break;
  32.                 }
  33.                 ch = studentmessage.Table();
  34.         } while (ch);


  35.         return 0;
  36. }
复制代码


测试输入输出信息:
  1. *************           学生信息管理系统        ****************

  2. *************          1、显示所有学生信息      ****************
  3. *************          2、录入学生信息          ****************
  4. *************          3、查询学生信息          ****************
  5. *************          4、修改学生信息          ****************
  6. *************          5、删除学生信息          ****************
  7. *************          6、系统初始化            ****************
  8. *************          0、退出系统              ****************

  9. “选项(0—6)”
  10. 请输入:2
  11. 请输入学生姓名:test01

  12. 请输入学生性别:man

  13. 请输入学生学号:01

  14. 请输入学生班级:01

  15. 请输入第一门成绩:100

  16. 请输入第二门成绩:100

  17. 请输入第三门成绩:100

  18. *************           学生信息管理系统        ****************

  19. *************          1、显示所有学生信息      ****************
  20. *************          2、录入学生信息          ****************
  21. *************          3、查询学生信息          ****************
  22. *************          4、修改学生信息          ****************
  23. *************          5、删除学生信息          ****************
  24. *************          6、系统初始化            ****************
  25. *************          0、退出系统              ****************

  26. “选项(0—6)”
  27. 请输入:2
  28. 请输入学生姓名:test02

  29. 请输入学生性别:01

  30. 请输入学生学号:02

  31. 请输入学生班级:01

  32. 请输入第一门成绩:100

  33. 请输入第二门成绩:100

  34. 请输入第三门成绩:100

  35. *************           学生信息管理系统        ****************

  36. *************          1、显示所有学生信息      ****************
  37. *************          2、录入学生信息          ****************
  38. *************          3、查询学生信息          ****************
  39. *************          4、修改学生信息          ****************
  40. *************          5、删除学生信息          ****************
  41. *************          6、系统初始化            ****************
  42. *************          0、退出系统              ****************

  43. “选项(0—6)”
  44. 请输入:2
  45. 请输入学生姓名:test03

  46. 请输入学生性别:01

  47. 请输入学生学号:03

  48. 请输入学生班级:01

  49. 请输入第一门成绩:100

  50. 请输入第二门成绩:100

  51. 请输入第三门成绩:100

  52. *************           学生信息管理系统        ****************

  53. *************          1、显示所有学生信息      ****************
  54. *************          2、录入学生信息          ****************
  55. *************          3、查询学生信息          ****************
  56. *************          4、修改学生信息          ****************
  57. *************          5、删除学生信息          ****************
  58. *************          6、系统初始化            ****************
  59. *************          0、退出系统              ****************

  60. “选项(0—6)”
  61. 请输入:1
  62. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  63. 姓名:test02 学号:2 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  64. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  65. *************           学生信息管理系统        ****************

  66. *************          1、显示所有学生信息      ****************
  67. *************          2、录入学生信息          ****************
  68. *************          3、查询学生信息          ****************
  69. *************          4、修改学生信息          ****************
  70. *************          5、删除学生信息          ****************
  71. *************          6、系统初始化            ****************
  72. *************          0、退出系统              ****************

  73. “选项(0—6)”
  74. 请输入:5
  75. 【1、删除姓名】
  76. 【2、删除学号】
  77. 1
  78. 请输入姓名:test02
  79. 姓名:test02 学号:2 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  80. 是否删除?
  81. 【1、是】
  82. 【0、否】
  83. 1
  84. *************           学生信息管理系统        ****************

  85. *************          1、显示所有学生信息      ****************
  86. *************          2、录入学生信息          ****************
  87. *************          3、查询学生信息          ****************
  88. *************          4、修改学生信息          ****************
  89. *************          5、删除学生信息          ****************
  90. *************          6、系统初始化            ****************
  91. *************          0、退出系统              ****************

  92. “选项(0—6)”
  93. 请输入:1
  94. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  95. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  96. *************           学生信息管理系统        ****************

  97. *************          1、显示所有学生信息      ****************
  98. *************          2、录入学生信息          ****************
  99. *************          3、查询学生信息          ****************
  100. *************          4、修改学生信息          ****************
  101. *************          5、删除学生信息          ****************
  102. *************          6、系统初始化            ****************
  103. *************          0、退出系统              ****************

  104. “选项(0—6)”
  105. 请输入:5
  106. 【1、删除姓名】
  107. 【2、删除学号】
  108. 2
  109. 请输入学号:01
  110. 姓名:test01 学号:1 班级:01 性别:man 第一门成绩:100 第二门成绩:100 第三门成绩:100
  111. 是否删除?
  112. 【1、是】
  113. 【0、否】
  114. 1
  115. *************           学生信息管理系统        ****************

  116. *************          1、显示所有学生信息      ****************
  117. *************          2、录入学生信息          ****************
  118. *************          3、查询学生信息          ****************
  119. *************          4、修改学生信息          ****************
  120. *************          5、删除学生信息          ****************
  121. *************          6、系统初始化            ****************
  122. *************          0、退出系统              ****************

  123. “选项(0—6)”
  124. 请输入:1
  125. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  126. *************           学生信息管理系统        ****************

  127. *************          1、显示所有学生信息      ****************
  128. *************          2、录入学生信息          ****************
  129. *************          3、查询学生信息          ****************
  130. *************          4、修改学生信息          ****************
  131. *************          5、删除学生信息          ****************
  132. *************          6、系统初始化            ****************
  133. *************          0、退出系统              ****************

  134. “选项(0—6)”
  135. 请输入:5
  136. 【1、删除姓名】
  137. 【2、删除学号】
  138. 1
  139. 请输入姓名:test03
  140. 姓名:test03 学号:3 班级:01 性别:01 第一门成绩:100 第二门成绩:100 第三门成绩:100
  141. 是否删除?
  142. 【1、是】
  143. 【0、否】
  144. 1
  145. *************           学生信息管理系统        ****************

  146. *************          1、显示所有学生信息      ****************
  147. *************          2、录入学生信息          ****************
  148. *************          3、查询学生信息          ****************
  149. *************          4、修改学生信息          ****************
  150. *************          5、删除学生信息          ****************
  151. *************          6、系统初始化            ****************
  152. *************          0、退出系统              ****************

  153. “选项(0—6)”
  154. 请输入:1
  155. 当前系统中无学生信息!!
  156. *************           学生信息管理系统        ****************

  157. *************          1、显示所有学生信息      ****************
  158. *************          2、录入学生信息          ****************
  159. *************          3、查询学生信息          ****************
  160. *************          4、修改学生信息          ****************
  161. *************          5、删除学生信息          ****************
  162. *************          6、系统初始化            ****************
  163. *************          0、退出系统              ****************

  164. “选项(0—6)”
  165. 请输入:
复制代码

评分

参与人数 2驿站币 +3 热心值 +3 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!
56_avatar_small userabao + 1 + 1

查看全部评分

57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-14 18:47:47 | 显示全部楼层
提示的很明显,p1是空指针。也就是说num[1]->pre == NULL.
有一点疑问,楼主在数组里面存储了链表的节点吗?
如果还有其他疑问,最好把源代码发出来
56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-14 19:01:41 | 显示全部楼层
JLDawson 发表于 2020-4-14 18:47
提示的很明显,p1是空指针。也就是说num[1]->pre == NULL.
有一点疑问,楼主在数组里面存储了链表的节点吗 ...

是的,我把要删除的那个节点赋给num[1],源代码我发在下面把。
56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-14 19:03:02 | 显示全部楼层
源代码
#include"标头.h"

Student::Student(string _name, double* _score, long long _number, string _class, string _sex)
{
        Name = _name;
        Score[0] = _score[0];
        Score[1] = _score[1];
        Score[2] = _score[2];
        Number = _number;
        Class = _class;
        Sex = _sex;
        next = NULL;
        pre = NULL;
}


long StudentMessage::Table()
{
        long ch;
        cout << "*************           学生信息管理系统        ****************" << endl;
        cout << endl;
        cout << "*************          1、显示所有学生信息      ****************" << endl;
        cout << "*************          2、录入学生信息          ****************" << endl;
        cout << "*************          3、查询学生信息          ****************" << endl;
        cout << "*************          4、修改学生信息          ****************" << endl;
        cout << "*************          5、删除学生信息          ****************" << endl;
        cout << "*************          6、系统初始化            ****************" << endl;
        cout << "*************          0、退出系统              ****************" << endl;
        cout << endl;
        cout << "“选项(0—6)”" << endl;
        cout << "请输入:";
        cin >> ch;
        return ch;
}


void StudentMessage::Insert()
{
        long long num;
        string name, sex, cla;
        double score[3];
        cout << "请输入学生姓名:";
        cin >> name;
        cout << endl;
        cout << "请输入学生性别:";
        cin >> sex;
        cout << endl;
        cout << "请输入学生学号:";
        cin >> num;
        cout << endl;
        cout << "请输入学生班级:";
        cin >> cla;
        cout << endl;
        cout << "请输入第一门成绩:";
        cin >> score[0];
        cout << endl;
        cout << "请输入第二门成绩:";
        cin >> score[1];
        cout << endl;
        cout << "请输入第三门成绩:";
        cin >> score[2];
        cout << endl;

        Student* newstu = new Student(name, score, num, cla, sex);
        Student* p = first;
        while(p->next != NULL)
        {
                ex = p;
                p = p->next;
               
        }
        p->pre = ex;
        p->next = newstu;
        nums++;
       
}

void StudentMessage::Display()
{
        if (nums == 0)
        {
                cout << "当前系统中无学生信息!!" << endl;
        }
        else
        {
                Student * p = first->next;
                while (p != null)
                {
                        cout << "姓名:" << p->Name << " " <<
                                "学号:" << p->Number << " " <<
                                "班级:" << p->Class << " " <<
                                "性别:" << p->Sex << " " <<
                                "第一门成绩:" << p->Score[0] << " " <<
                                "第二门成绩:" << p->Score[1] << " " <<
                                "第三门成绩:" << p->Score[2] << endl;
                        p = p -> next;
                       
                }
        }
}

void StudentMessage::Find()
{
        //按1、姓名  2、学号 查找;
       
        cout << "【1、姓名查找】" << endl;
        cout << "【2、学号查找】" << endl;
        cout << "【0、返回】" << endl;
        cout << "请选择:" << endl;
        long long op;
        cin >> op;
        switch (op)
        {
        case 1:Find_Name(); break;
        case 2:Find_Num(); break;
        default:
                cout << "请正确输入:";
                cin >> op;

        }
        cout << "是否继续查找?" << endl;
        cout << "【1、继续查找】" << endl;
        cout << "【0、返回菜单】" << endl;
        int op1;
        cin >> op1;
        switch (op1)
        {
        case 1:
                Find();
                break;
        default:
                break;
        }
}
       
void StudentMessage::Find_Name()
{
        Student* p = first->next;
        string name;
        cout << "请输入姓名:";
        cin >> name;
        int nor = 0;
        while (p != null)
        {
                if (p->Name == name)
                {
                        nor++;
                        cout << "姓名:" << p->Name << " " <<
                                "学号:" << p->Number << " " <<
                                "班级:" << p->Class << " " <<
                                "性别:" << p->Sex << " " <<
                                "第一门成绩:" << p->Score[0] << " " <<
                                "第二门成绩:" << p->Score[1] << " " <<
                                "第三门成绩:" << p->Score[2] << endl;
                       
                }
                        p = p->next;
        }
        if (nor == 0)
        {
                cout << "无此同学..." << endl;
                cout << "是否继续?";
                cout << "【1、是】" << endl;
                cout << "【0、否】" << endl;
                long long op;
                cin >> op;
                while (op)
                {
                        switch (op)
                        {
                        case 1:
                                Find_Name();
                                break;
                        default:
                                cout << "请正确输入:";
                                cin >> op;
                        }
                }
        }
}

void StudentMessage::Find_Num()
{
        Student* p = first->next;
        long long number;
        cout << "请输入学号:";
        cin >> number;
        int nor = 0;
        while (p != null)
        {
                if (p->Number == number)
                {
                        nor++;
                        cout << "姓名:" << p->Name << " " <<
                                "学号:" << p->Number << " " <<
                                "班级:" << p->Class << " " <<
                                "性别:" << p->Sex << " " <<
                                "第一门成绩:" << p->Score[0] << " " <<
                                "第二门成绩:" << p->Score[1] << " " <<
                                "第三门成绩:" << p->Score[2] << endl;

                }
                p = p->next;
        }
        if (nor == 0)
        {
                cout << "无此同学..." << endl;
                cout << "是否继续?";
                cout << "【1、是】" << endl;
                cout << "【0、否】" << endl;
                long long op;
                cin >> op;
                while (op)
                {
                        switch (op)
                        {
                        case 1:
                                Find_Num();
                                break;
                        default:
                                cout << "请正确输入:";
                                cin >> op;
                        }
                }
        }
}

void StudentMessage::Delete()
{

        //按1、姓名  2、学号 删除;
        cout << "【1、删除姓名】" << endl;
        cout << "【2、删除学号】" << endl;
        int op;
        cin >> op;
        switch (op)
        {
        case 1:
                Delete_Name();
                break;
        case 2:
                Delete_Num();
                break;
        default:
                cout << "请正确输入:";
                cin >> op;
        }

       

       
}

void StudentMessage::Delete_Name()
{
        Student* p = first->next;
        string name;
        cout << "请输入姓名:";
        cin >> name;
        int nor = 0;
        while (p != null)
        {
                if (p->Name == name)
                {
                        nor++;
                        cout << nor << "、"<< "姓名:" << p->Name << " " <<
                                "学号:" << p->Number << " " <<
                                "班级:" << p->Class << " " <<
                                "性别:" << p->Sex << " " <<
                                "第一门成绩:" << p->Score[0] << " " <<
                                "第二门成绩:" << p->Score[1] << " " <<
                                "第三门成绩:" << p->Score[2] << endl;
                        num[nor] = p;
                }
                p = p->next;
        }
        if (nor == 0)
        {
                cout << "无此同学..." << endl;
                cout << "是否继续?";
                cout << "【1、是】" << endl;
                cout << "【0、否】" << endl;
                long long op;
                cin >> op;
                while (op)
                {
                        switch (op)
                        {
                        case 1:
                                Find_Name();
                                break;
                        default:
                                cout << "请正确输入:";
                                cin >> op;
                        }
                }
        }
        else if (nor == 1)
        {
                int op;
                cout << "是否删除?" << endl;
                cout << "【1、是】" << endl;
                cout << "【0、否】" << endl;
                cin >> op;

                if (op == 1)
                {
                        if (num[1]->next != NULL)
                        {
                                num[1]->pre->next = num[1]->next;
                                num[1]->next->pre = num[1]->pre;
                        }
                        else
                        {
                                Student* p1 = first;
                                p1->next = num[1];
                                p1 = num[1]->pre;
                                p1->next = NULL;
                        }
                        delete num[1];
                }
               
        }
56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-14 19:04:48 | 显示全部楼层
#include<iostream>
#include<string>
#include<cstdlib>
#define null NULL
using namespace std;

class Student
{
private:
        friend class StudentMessage;
        Student* next;                                        //指向下一个节点的指针
        Student* pre;                                        //指向上一个节点的指针
        string Class, Name, Sex;      
        long long Number;              
        double Score[3];                          

public:
        Student(string _name, double* _score, long long _number, string _class, string _sex);
        Student()
        {
                Name = Class = Sex = "null";
                Score[0] = Score[1] = Score[2] = 0;
                Number = 0;
                next = NULL;
                pre = NULL;
        }
        ~Student() {}

       
};

class StudentMessage
{
private:
        friend class Student;
        Student* num[1000]{};
        Student* first;          //头指针
        Student* ex;
        int nums;          //学生数
public:
        StudentMessage()
        {
                first = new Student;
                ex = new Student;
                nums = 0;
        }
        ~StudentMessage()
        {
                delete first;
                delete ex;
        }
        void Insert();
        long Table();
        void Find();
        void Find_Num();
        void Find_Name();
        void Change();
        void Display();
        void Delete();
        void Delete_Name();
        void Delete_Num();

};
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-15 09:29:53 | 显示全部楼层
以下代码可以解决楼主疑问。注意看注释
  1. Student::Student(string _name, double* _score, long long _number, string _class, string _sex)
  2. {
  3.         Name = _name;
  4.         Score[0] = _score[0];
  5.         Score[1] = _score[1];
  6.         Score[2] = _score[2];
  7.         Number = _number;
  8.         Class = _class;
  9.         Sex = _sex;
  10.         next = NULL;
  11.         pre = NULL; //pre初始化为NULL
  12. }

  13. void StudentMessage::Insert()
  14. {
  15.         long long num;
  16.         string name, sex, cla;
  17.         double score[3];
  18.         cout << "请输入学生姓名:";
  19.         cin >> name;
  20.         cout << endl;
  21.         cout << "请输入学生性别:";
  22.         cin >> sex;
  23.         cout << endl;
  24.         cout << "请输入学生学号:";
  25.         cin >> num;
  26.         cout << endl;
  27.         cout << "请输入学生班级:";
  28.         cin >> cla;
  29.         cout << endl;
  30.         cout << "请输入第一门成绩:";
  31.         cin >> score[0];
  32.         cout << endl;
  33.         cout << "请输入第二门成绩:";
  34.         cin >> score[1];
  35.         cout << endl;
  36.         cout << "请输入第三门成绩:";
  37.         cin >> score[2];
  38.         cout << endl;

  39.         Student* newstu = new Student(name, score, num, cla, sex);

  40.         //新增一个问题,当链表为空,即first==NULL。此处会报错
  41.         Student* p = first;
  42.         while (p->next != NULL)
  43.         {
  44.                 ex = p;
  45.                 p = p->next;

  46.         }
  47.         /*
  48.         此处为上面提出问题的解决方法
  49.         Student* pNode = this->first;
  50.         if(first)
  51.         {
  52.                 first == newstu;
  53.                 nums++;
  54.         }
  55.         else
  56.         {
  57.                 while (pNode)
  58.                 {
  59.                         if (pNode->next)
  60.                         {
  61.                                 pNode = pNode->next;
  62.                         }
  63.                         else
  64.                         {
  65.                                 break;
  66.                         }
  67.                 }
  68.                 pNode->next = newstu;
  69.                 newstu->pre = pNode;
  70.                 nums++;
  71.         }
  72.         */

  73.         p->pre = ex;//这句代码多余
  74.         p->next = newstu;
  75.         //此处应设置newstu的pre指向当前链表的最后一个节点ex。添加此处可解决楼主当前报错问题
  76.         newstu->pre = ex;
  77.         nums++;
  78. }
复制代码

评分

参与人数 1威望 +2 驿站币 +2 热心值 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2 很给力!

查看全部评分

56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-15 21:41:31 | 显示全部楼层
JLDawson 发表于 2020-4-15 09:29
以下代码可以解决楼主疑问。注意看注释

看到你写这么多,很感谢!但是那个ex并不是最后一个节点,ex是用来传递每个节点前面的那个节点,再给pre的;还有就是我向你这样写有几个警告,而且输入“1、显示所有成绩”时就没有任何信息了。我把截图发在下面。
56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-15 21:46:02 | 显示全部楼层
这时运行的结果,还有一些警告
K04HZK6FTFA4A)J$0{9S{@Y.png
NWT33IJ~]9%NBQS2Q_39BQI.png
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-16 09:34:15 | 显示全部楼层
userabao 发表于 2020-4-15 21:41
看到你写这么多,很感谢!但是那个ex并不是最后一个节点,ex是用来传递每个节点前面的那个节点,再给pre ...

楼主应该没有看懂这个for循环才有此疑问。
比如当前有2个节点first和second,
①p = first
判断p-next == NULL ,还有第二个节点所以不为NULL,
那ex  = p ,此时p指向first,所以ex等于first
p = p->next  相当于 p = first->next 相当于p=second
②判断p->next == NULL,因为此时p == second最后一个节点,所以 p->next为NULL,不满足继续循环的条件,循环结束。

③循环结束后 p == second,ex == first。所以ex指向的是链表最后一个节点的前一个节点,也就是倒数第二个节点。
上面描述解释ex相关信息。对于报错问题,需要解决需要楼主将源代码发出来,最好将输入的信息也发出来。
  1. Student* p = first;
  2.         while (p->next != NULL)
  3.         {
  4.                 ex = p;
  5.                 p = p->next;

  6.         }
复制代码

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
56_avatar_small userabao + 1 + 1

查看全部评分

57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-16 09:38:15 | 显示全部楼层
JLDawson 发表于 2020-4-15 09:29
以下代码可以解决楼主疑问。注意看注释

更正最后一处注释:
原注释为://此处应设置newstu的pre指向当前链表的最后一个节点ex。添加此处可解决楼主当前报错问题
正确注释为:/此处应设置newstu的pre指向当前链表的倒数第二个节点ex。添加此处可解决楼主当前报错问题。

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
56_avatar_small userabao + 1 + 1

查看全部评分

56_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-16 15:03:05 | 显示全部楼层
JLDawson 发表于 2020-4-16 13:01
之前的回复有一些不正确,思考了一下。直接回复完整代码,该代码经过测试,且附带输入输出信息。
相关信息 ...

太感谢你了!终于解决了,哈哈,答主幸苦了!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-8-7 17:17

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表