指针链表 C++
Linked list of pointers C++
我有一个列表,但现在我必须link它。
这是我的程序(我删除了函数内的代码,使我的程序更容易阅读)。
#include <iostream>
using namespace std;
struct Student
{
char ime[16];
char priimek[16];
char vpisna[10];
char ocenaRV[10];
char ocenaDN[10];
char ocenaKV[10];
char ocenaVI[10];
Student *next;
};
void clean(Student* pointer,int x) // Delete random data
{
}
void dodajanje(int x,Student* s) // Add information about student
{
}
void brisi(Student* pointer,int x) // Delete information about student
{
}
int main()
{
int student,mesto, brisanje, ali = 0;
cout << "Number of students?." << endl;
cin >> student;
Student* s = new Student[student];
clean(s,student);
cout << endl;
cout << "Add student to i place in array." << endl;
cin >> mesto;
dodajanje( mesto, s );
for(int i=0;i<(student*2);i++)
{
cout << "add student = 1, delete student = 2, cout information = 3"<<endl;
cin>>ali;
if (ali == 1)
{
cout << endl;
cout << "Add student to i place in array." << endl;
cin >> mesto;
dodajanje( mesto, s );
}
else if (ali == 2)
{
cout << "delete student on i place ?" << endl;
cin >> brisanje;
brisi(s,brisanje);
}
else
{
break;
}
}
delete[] s;
return 0;
}
谁能解释一下如何 link 我的列表,因为我遇到的所有教程中的代码都与此类似:
Node* temp = Node();
但是在我的程序中我的代码是:
Student* s = new Student[student];
现在我迷路了;
注意:我必须动态创建 linked 列表。
链表是一种基于节点的数据结构。您要做的是创建一个动态的学生数组,而不是 linked 列表。
如果您确实需要创建一个 linked 列表,请代替以下行
Student* s = new Student[student];
你应该通过更新 student()-> next= next_student (Psuedo code)
创建一个节点,如下所示,在 for 循环中学生的时间和 link 彼此
Student* s = new Student;
最后,您必须在 for 循环中调用 delete s
来释放内存。
Node* temp = Node();
这将创建一个 Node
实例。虽然应该是这样的:
Node* temp = new Node;
Student* s = new Student[student];
这将创建一个包含 student
个实例的数组,其中包含 Student
个实例。这违背了链表的目的,因为您将无法有效地从数组中 add/remove Student
个实例。但是,只是为了争论,假设你真的需要一个数组。您可以像这样 "link" Student
个实例:
for (int i = 0; i < (student-1); i++)
s[i].next = &s[i+1];
s[student-1].next = NULL;
如果你真的需要一个链表,那么你需要更像这样的东西:
Student *studentList = NULL;
Student *lastStudent = NULL;
for (int i = 0; i < student; ++i)
{
Student* s = new Student;
s->next = NULL;
if (lastStudent) lastStudent->next = s;
if (!studentList) studentList = s;
lastStudent = s;
}
// use studentList as needed...
Student *s = studentList;
while (s)
{
Student *next = s->next;
delete s;
s = next;
}
修复后,考虑使用 STL std::list
class,甚至是 C++11 中的 std::forward_list
。
话虽如此,您还需要重新考虑您的代码设计。链表会动态增长和收缩,因此没有必要预先询问用户学生的数量,或者预先为列表分配必须在使用前清理的垃圾。永远将循环更改为 运行 (或至少直到用户说停止)。在每次迭代中,询问用户要做什么。如果 Add
,则在那时向列表中添加一个新的 Student
。如果Delete
,询问用户要删除哪个学生,找到Student
,取消链接,然后delete
。如果Display
,询问用户显示哪个学生,找到Student
,并显示它。等等。
我有一个列表,但现在我必须link它。
这是我的程序(我删除了函数内的代码,使我的程序更容易阅读)。
#include <iostream>
using namespace std;
struct Student
{
char ime[16];
char priimek[16];
char vpisna[10];
char ocenaRV[10];
char ocenaDN[10];
char ocenaKV[10];
char ocenaVI[10];
Student *next;
};
void clean(Student* pointer,int x) // Delete random data
{
}
void dodajanje(int x,Student* s) // Add information about student
{
}
void brisi(Student* pointer,int x) // Delete information about student
{
}
int main()
{
int student,mesto, brisanje, ali = 0;
cout << "Number of students?." << endl;
cin >> student;
Student* s = new Student[student];
clean(s,student);
cout << endl;
cout << "Add student to i place in array." << endl;
cin >> mesto;
dodajanje( mesto, s );
for(int i=0;i<(student*2);i++)
{
cout << "add student = 1, delete student = 2, cout information = 3"<<endl;
cin>>ali;
if (ali == 1)
{
cout << endl;
cout << "Add student to i place in array." << endl;
cin >> mesto;
dodajanje( mesto, s );
}
else if (ali == 2)
{
cout << "delete student on i place ?" << endl;
cin >> brisanje;
brisi(s,brisanje);
}
else
{
break;
}
}
delete[] s;
return 0;
}
谁能解释一下如何 link 我的列表,因为我遇到的所有教程中的代码都与此类似:
Node* temp = Node();
但是在我的程序中我的代码是:
Student* s = new Student[student];
现在我迷路了;
注意:我必须动态创建 linked 列表。
链表是一种基于节点的数据结构。您要做的是创建一个动态的学生数组,而不是 linked 列表。
如果您确实需要创建一个 linked 列表,请代替以下行
Student* s = new Student[student];
你应该通过更新 student()-> next= next_student (Psuedo code)
Student* s = new Student;
最后,您必须在 for 循环中调用 delete s
来释放内存。
Node* temp = Node();
这将创建一个 Node
实例。虽然应该是这样的:
Node* temp = new Node;
Student* s = new Student[student];
这将创建一个包含 student
个实例的数组,其中包含 Student
个实例。这违背了链表的目的,因为您将无法有效地从数组中 add/remove Student
个实例。但是,只是为了争论,假设你真的需要一个数组。您可以像这样 "link" Student
个实例:
for (int i = 0; i < (student-1); i++)
s[i].next = &s[i+1];
s[student-1].next = NULL;
如果你真的需要一个链表,那么你需要更像这样的东西:
Student *studentList = NULL;
Student *lastStudent = NULL;
for (int i = 0; i < student; ++i)
{
Student* s = new Student;
s->next = NULL;
if (lastStudent) lastStudent->next = s;
if (!studentList) studentList = s;
lastStudent = s;
}
// use studentList as needed...
Student *s = studentList;
while (s)
{
Student *next = s->next;
delete s;
s = next;
}
修复后,考虑使用 STL std::list
class,甚至是 C++11 中的 std::forward_list
。
话虽如此,您还需要重新考虑您的代码设计。链表会动态增长和收缩,因此没有必要预先询问用户学生的数量,或者预先为列表分配必须在使用前清理的垃圾。永远将循环更改为 运行 (或至少直到用户说停止)。在每次迭代中,询问用户要做什么。如果 Add
,则在那时向列表中添加一个新的 Student
。如果Delete
,询问用户要删除哪个学生,找到Student
,取消链接,然后delete
。如果Display
,询问用户显示哪个学生,找到Student
,并显示它。等等。