T-Dubb 2021-06-13 23:31 采纳率: 0%
浏览 56

想写一个动态链表,如何用函数实现创建链表的功能?

写了一个用动态链表完成的简单的学生管理系统,想把每一个功能写成函数,主要出问题的是创建链表也就是添加学生这个函数,如果写在主函数中,功能就正常,写在函数里每次输出当前链表中的所有元素就只能输出最近一个节点

#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时就可以正常运行了,而且之前的问题也没了。

忘解答

  • 写回答

2条回答 默认 最新

  • 关注
    pre->m_Next = p;
    p->m_Next = NULL;
    pre = p;
    //改为
    
    p->m_Next = pre->m_Next;
    pre->m_Next = p;
    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用