2015-05-04 7 views
-1

Код ошибки в этой строке курс ["CS"]. Student = new Course * [1];C++ связанный список создание связанный список связанных списков

я хочу создать связанный список курсов содержит связанный список студентов

здесь код

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]; 
} 
+0

Вы можете сообщить об ошибке? – Shaggy

+4

'' CS "' недействительный индекс для массива. Используйте std :: map/std :: unordered_map, если вы хотите индексировать также строки – Borgleader

+0

, 'student' является указателем' Student', поэтому присвоение 'Course *' не будет работать. – dwcanillas

ответ

0

Ваш код не содержит какого-либо связанного списка, а только простые массивы. Кроме того, последняя строка (course["CS"].student=new Course*[1];) содержит недействительный синтаксис.

  • Неотъемлемый или перечисление типа должен быть использован для доступа массива (string с или 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 на первый уже существующий узел. Чтобы вставить между двумя узлами, скажем node1 и node2:

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

Чтобы сделать хороший один обычно пишет класс-оболочку, содержащую такие функции, как

InsertNodeAt(Node* node, uint index); 
Node* GetNodeAt(uint index); 
RemoveNodeAt(uint index); 

Поскольку у вас есть два различных типа объектов (Student и Curse), вы можете использовать шаблоны и избегать написания связанного класса списка для каждого типа.

Если вы хотите создать свой собственный список самостоятельно, я рекомендую сделать некоторые дополнительные исследования (google - ваш друг), поскольку я упомянул только несколько вещей.

Если вы не против использовать стандартную библиотеку C++, вам может быть интересно использовать уже подготовленные связанные классы списка std::forward_list (стандартный связанный список) и std::list (двойной список).

+0

Я буду работать над этим, это простой способ, но поддерживайте контакт, я вам понадоблюсь. Plz –

+1

Ну, я не собираюсь писать ваш код для вас. Думаю, вы научились бы гораздо лучше, если бы сделали это сами. :) –

+0

В любом случае, если вы просто хотите код, который вы можете использовать для своего проекта, google it. Многие люди уже сделали примерные реализации. –

0

в C++ вы не определен курс [ «строка»], так что вы не можете использовать «CS» в качестве индекса объекта типа Course и * .student является объектом класса Стьюдента, не курса типа

#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++ вы можете попробовать ссылку и ее счетчик в определении класса курса классу Student. Использование принтера таким образом может привести к непредвиденной ошибке.

+0

в VC2010 работает нормально – Ming

+0

не могли бы вы показать мне, какой функцией вставки будет? –

+0

вы можете получить формат функции вставки в книгах C++ или OOP. Просто пойдите в Google. – Ming

Смежные вопросы