c++链表创建linked list of linked list

c++ linked list creation linked list of linked list

这行代码发送错误 课程["CS"].student=新课程*[1];

我想创建包含学生链表的课程链表

这是代码

struct Student{
    string name; 
    int id; 
    int grade; 

    Student(string n, int i, int gd ){

    name=n; 
    id=i;
    grade=gd; 
    }
};

struct Course{
    string C_Name; 
    Student **student;
    int index;
    void add_student(Student *new_student){
    student[++index]=new_student;   

    } 
};
Course course[4];
void init(){

    course["CS"].student=new Course*[1];
}

在 C++ 中你没有定义课程 ["string"],所以你不能使用 "CS" 作为 Course 类型对象的索引 *.student 是 class Student 的 对象,而不是 Course 类型

#include <iostream>
#include <stdexcept>
 using namespace std;

struct Student{
    string name; 
    int id; 
    int grade; 

    Student(string n, int i, int gd ){

    name=n; 
    id=i;
    grade=gd; 
    }
};

struct Course{
    string C_Name; 
    Student **student;
    int index;
    void add_student(Student *new_student){
    student[++index]=new_student;   

    } 
};
Course course[4];

void init(){
    // Need allocate space for a new object of class "Course"
    Course course;
    course.student = new Student*[1];// "student" is Student type but not Course 
}

int main()
{
    try{
        init();
    }
    catch(...){
        return -1;
    }
    std::cerr <<"your debug info" <<endl;
    return 0;
}

我个人认为,在 C++ 中,您可以尝试参考,它与 class 课程对 class 学生的定义相反。以这种方式使用打印机可能会导致意外错误。

您的代码不包含任何类型的链表,而只包含普通数组。 除此之外,最后一行 (course["CS"].student=new Course*[1];) 包含一些无效语法。

  • 必须使用整数或枚举类型来访问数组(strings 或 char[] 不起作用)
  • 不允许将 Course** 分配给 Student** 对象

链表包含节点,每个节点都有指向下一个节点的指针。最后一个节点通常有一个值为 nullptr (C++11) 或 0(旧标准)的指针。注意:还有一个所谓的双链表,其中每个节点还存储一个指向前一个节点的指针。 节点包含您希望它存储的所有数据。 示例:

struct Node {
    Node* next;
    // other node data here
};

要创建链表,首先要从一个节点开始并设置 next = nullptr; // 0。要添加另一个节点,只需创建一个新节点并更改第一个节点的指针。 示例:

Node* node1 = new Node();
node1 -> next = nullptr;

Node* node2 = new Node();
node2 -> next = nullptr;

node1 -> next = node2;

你开始看到一个规律。要在前面插入,只需创建一个新的 Node 并将其 next 设置为第一个已经存在的节点。要在两个节点之间插入,请说 node1node2:

node1 -> next = newNode;
newNode -> next = node2;

为了让它更漂亮,通常会编写一个包装器 class,其中包含诸如

之类的函数
InsertNodeAt(Node* node, uint index);
Node* GetNodeAt(uint index);
RemoveNodeAt(uint index);

由于您有两种不同类型的对象(StudentCurse),您可能希望使用模板并避免为每种类型编写链表 class。

如果你想自己创建链表,我建议你做一些额外的研究(google 是你的朋友)因为我只提到了一些事情。

如果您不介意使用 c++ 标准库,您可能有兴趣使用已经预制的链表 classes std::forward_list(标准链表)和 std::list(双向链表)。