写了一个用动态链表完成的简单的学生管理系统,想把每一个功能写成函数,主要出问题的是创建链表也就是添加学生这个函数,如果写在主函数中,功能就正常,写在函数里每次输出当前链表中的所有元素就只能输出最近一个节点
#include <iostream>
#include <string>
using namespace std;
//请无视,这个只是作业有要求要用到继承
class Person
{
public:
string m_Name;
int m_Age;
int m_Sex;
};
class Student :public Person
{
public:
void CreatInformation()
{
cout << "请输入该学生的姓名\n";
cin >> m_Name;
cout << "请输入该学生年龄\n";
cin >> m_Age;
cout << "请输入该学生性别\n";
cout << "1----男\n" << "2----女\n";
while (1)
{
cin >> m_Sex;
if (m_Sex == 1 || m_Sex == 2)
break;
else cout << "输入错误请重新输入\n";
}
cout << "请输入该学生成绩\n";
cin >> m_Grade;
cout << "请输入该学生学号\n";
cin >> m_Number;
}
int m_Number;
int m_Grade;
Student* m_Next;
};
void ShowInformation(Student* head)
{
Student* p = head->m_Next;
while (p != NULL)
{
cout << "姓名:" << p->m_Name << "\t";
cout << "年龄:" << p->m_Age << "\t";
cout << "性别:" << (p->m_Sex == 1 ? "男" : "女") << "\t";
cout << "成绩:" << p->m_Grade << "\t";
cout << "学号:" << p->m_Number << "\n";
p = p->m_Next;
}
system("pause");
system("cls");
}
void AddStudent(Student* pre)
{
//问题在于p为局部变量?如何解决?
Student* p = new Student;
p->CreatInformation();
pre->m_Next = p;
p->m_Next = NULL;
pre = p;
cout << "添加成功\n";
system("pause");
system("cls");
}
void menu()
{
for (int i = 0; i < 33; i++)
{
cout << "*";
}
cout << endl;
cout << "***** 1、添加学生 *****\n";
cout << "***** 2、显示当前所有学生 *****\n";
cout << "***** 3、删除学生 *****\n";
cout << "***** 4、显示不及格学生 *****\n";
cout << "***** 0、退出 *****\n";
for (int i = 0; i < 33; i++)
{
cout << "*";
}
cout << "\n";
}
int main()
{
Student* head = new Student;
Student* pre = head;
int select;
while (1)
{
menu();
cin >> select;
switch (select)
{
case 1:
AddStudent(pre);
break;
case 2:
ShowInformation(head);
break;
}
}
return 0;
}
添加了第一位学生张三
添加了第二位学生李四
输出当前链表的所有元素时,只能输出李四的信息,也就是只能输出最后一次输入的学生信息,可能是AddStudent这个函数里的那个指针为临时变量,函数调用完后就没了,是这里出了问题,可是除了把这个功能写在主函数中我想不到其他解决这个问题的办法
而当我把AddStudent这个函数的功能写在主函数中时,就像这样
while (1)
{
menu();
cin >> select;
switch (select)
{
case 1:
Student * p = new Student;
p->CreatInformation();
pre->m_Next = p;
p->m_Next = NULL;
pre = p;
cout << "添加成功\n";
system("pause");
system("cls");
break;
case 2:
ShowInformation(head);
break;
}
}
结果报错,原因是"p"的初始化操作由"case"标签跳过。可是当我把switch case换为if else时就可以正常运行了,而且之前的问题也没了。
忘解答