2016-04-10 3 views
0

Я писал код для проекта связанного списка с использованием C++. это мой код до сих порСвязанный список и конструктор

Заголовочный файл:

#include <iostream> 
#include <string> 
using namespace std; 
struct song1 
{ 
    string song; 
    string title; 
    song1* next; 
}; 
class song_list 
{ 
protected: 
    song1* head; 
    int length; 
public: 
    song_list(); 
    bool insertSong (song1* newSong, int track); 
    //bool removeSong (int track); 
    void printSong(); 
    ~song_list(); 
}; 
song_list::song_list() 
{ 
    head->song = "No data"; 
    head->title = "No data"; 
    head->next = NULL; 
    length = 0; 
} 
bool song_list::insertSong (song1* newSong, int track) 
{ 
    int count=0; 
    if ((track<=0) || (track>length+1)) 
    { 
     cerr<<"\nThe given track is out of range"; 
     return false; 
    } 
    if (head->next == NULL) 
    { 
     head->next= newSong; 
     length++; 
     return true; 
    } 
    count =0; 
    song1* p = head; 
    song1* q = head; 
    while (q) 
    { 
     if (count==track) 
     { 
      p->next = newSong; 
      newSong-> next = q; 
      length++; 
      return true; 
     } 
     p=q; 
     q=p->next; 
     count++; 
    } 
    if (count==track) 
    { 
     p->next = newSong; 
     newSong-> next = q; 
     length++; 
     return true; 
    } 
    cerr<<"Song was not added in the list"; 
    return false; 
} 
void song_list::printSong() 
{ 
    int count = 0; 
    song1* p=head; 
    song1* q=head; 
    cout<<"\n------------------\n"; 
    cout<<"Song playlist\n"; 
    while (q) 
    { 
     p = q; 
     cout<<"\n------------------\n"; 
     cout<<"\tPosition "<<count<<endl; 
     cout<<"\tsong "<<p->title<<endl; 
     cout<<"\tArtist "<<p->song<<endl; 
     q= p->next; 
     count++; 
    } 
} 
song_list::~song_list() 
{ 
    song1* p= head; 
    song1* q=head; 
    while (q) 
    { 
     p = q; 
     q = p->next; 
     if (q) delete p; 
    } 
} 

Главный файл:

#include <iostream> 
#include <string> 
#include "LinkedListh.h" 
using namespace std; 
int main() 
{ 
    int choice,repeat,trc; 
    song1* info; 
    song_list func; 
    do 
    { 
    cout<<"1. Add song "<<endl; 
    cout<<"2. Delete song "<<endl; 
    cout<<"3. Show song "<<endl; 
    cout<<"4. Search song "<<endl; 
    cin>>choice; 
    switch (choice) 
    { 
    case 1: 
      cout<<endl<<"Artist: "; 
      getline (cin,info->song); 
      //getline (cin,info->song); 
      cout<<endl<<"Song Title: "; 
      getline (cin,info->title); 
      cout<<"Song number: "<<endl;//ask the user to put the song number 
      //if artist doesnt exist the user should put 1. 
      //else user should put what number the song is. 
      cin>>trc; 
      func.insertSong(info,trc); 
     break; 
    case 3: 
     func.printSong(); 
     break; 
    } 
    cout<<"Repeat? 1.Yes 2.No"<<endl; 
    cin>>repeat; 
    }while (repeat == 1); 
    return 0; 
} 

код может быть построен успешно, но когда я запустить программу, показать «перестал работать "сообщение. Я выясню, что ошибка в моем конструкторе. Это правильный способ инициализации строки? потому что, если я стираю конструктор, вышло сообщение о том, что сначала нужно инициализировать песню и название. Я по-прежнему новичок в C++, поэтому я постепенно изучаю связанный список. Кстати, правильно ли я делаю связанный список ?. Благодаря!

ответ

1

Информация - это неназначенный указатель, когда вы пытаетесь заполнить свой член песни.

song1* info; 


getline (cin,info->song); 

Вам необходимо на самом деле выделить память для указателя, прежде чем пытаться разыменовать его.

Или, может быть, вы просто означало:

song1 info; 

, а затем просто изменить -> к . как в info.song.

Тем не менее, у вас почти наверняка есть и другие проблемы.

+0

'' song_list' член head' имеет подобную проблему – makadev

+0

я пытался выделить память SONG1 с помощью конструктора. но я не уверен, правильно ли я делаю это. –

+0

конструктор вызывается, когда вы говорите «новое ClassName()» или что-то подобное. song1 * info = new song1(); вызовет конструктор для памяти allcoate. Хотя, умные указатели обычно предпочитают делать allcoation yourlsef (std :: make_unique ();) – xaxxon

0

вы не можете прикреплять данные к переменной head-> song, прежде чем вы не выделите память.

Компилятор не создает ошибки при построении, эта ошибка дает во время выполнения.

song_list::song_list() 
{ 
    head = new song1; // you have forgetten this line 
    head->song = "No data"; 
    head->title = "No data"; 
    head->next = NULL; 
    length = 0; 
} 

и song1 * информация такая же. вам необходимо выделить память

0

Как уже упоминалось, вам необходимо выделить память с помощью оператора new. Как бы то ни было, у вас есть указатель, который указывает только на его тип. Замечание о дизайне: было бы лучше использовать ваш struct в классе? Таким образом, в основном вы имеете дело только с классом и его членами. Пусть ваш класс построит список.

+0

будет проще? извините, я только начал изучать структуру данных несколько дней назад ... хотя я использую C++ раньше, но этот класс thingy - это совершенно новая вещь для меня :) –

+0

Я тоже это изучаю. Я пытался сказать, что ваша структура должна быть построена классом списка. У меня есть аналогичный пост здесь: http://codereview.stackexchange.com/a/125323/73806 –

0

У вас отсутствует проверка ошибок. Нужно оптимизировать или изменить дизайн класса song_list. Без проблем, оставайся круто, Как только ты начал учиться сейчас. Престижность для ваших усилий.

Вобще выделить память для головы, используя конструктор song_list

путем изменения кода

song_list::song_list() 
{ 
    head = new song1; 
    head->song = "No data"; 
    head->title = "No data"; 
    head->next = NULL; 
    length = 0; 
} 

Затем попытайтесь выделить память для информации об основной функции

int main() 
{ 
    int choice,repeat,trc; 
    song1* info; 
    song_list func; 
    info = new info; 

. ......

Существует утечка памяти здесь

song_list::~song_list() 
{ 
    song1* p= head; 
    song1* q=head; 
    while (q) 
    { 
     p = q; 
     q = p->next; 
     if (q) delete p; // what happens for the last element if you check lastnode->next (would be null). the memory is lost. 
    } 
} 
Смежные вопросы