2016-01-20 110 views
-2

`你好 我剛剛在代碼塊中寫了這段代碼,在編譯和運行後,它說程序已停止工作。我找不到我做錯了什麼。我不知道問題是否與我的代碼有關,或者是與我正在使用的編譯器或其他內容有關的問題。 請幫助.exe已停止工作代碼塊cpp

Library.h:

#ifndef LIBRARY_H 
#define LIBRARY_H 
#include <iostream> 
#include <string> 
using namespace std; 
class Library 
{ 
public: 
    struct book 
    { 

     string tittle; 
     int number; 
     struct book* next; 
    }* head, *tail, *ptr; 

    Library(); 
    ~Library(); 
    book* searchName(book *, string); 
    void addNode(book *); 
    book *initNode(string s, int i); 
    void displayNode(book *ptr) const; 
    void displayList(book *ptr) const; 
protected: 
}; 

#endif 

Library.cpp

#include "Library.h" 

Library::Library() : 
     head(NULL), tail(NULL) 
{ 
} 

Library::~Library() 
{ 
    book *current, *temp; 

    current = head; 

    temp = head; 
    while (current != NULL) 
    { 
     current = current->next; 
     delete temp; 
     temp = current; 
    } 
} 

Library::book * Library::searchName(Library::book* ptr, string name) 
{ 
    while (name != ptr->tittle) 
    { 
     ptr = ptr->next; 
     if (ptr == NULL) 
      break; 
    } 
    return ptr; 
} 

void Library::addNode(book *newNode) 
{ 
    if (head == NULL) 
    { 
     head = newNode; 
     head = newNode; 
    } 
    tail->next = newNode; 
    newNode->next = NULL; 
    tail = newNode; 
} 

Library::book *Library::initNode(string s, int i) 
{ 
    book *ptr = new book; 
    if (ptr == NULL) 
     return static_cast<book *>(NULL); 
    else 
    { 
     ptr->tittle = s; 
     ptr->number = i; 
     return ptr; 
    } 
} 

void Library::displayNode(book *ptr) const 
{ 

    cout << ptr->number << ": " << ptr->tittle << endl; 
} 

void Library::displayList(book *ptr) const 
{ 
    if (!ptr) 
     cout << "Nothing to display" << endl; 
    while (ptr) 
    { 
     displayNode(ptr); 
     ptr = ptr->next; 
    } 
} 

的main.cpp

#include "Library.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    Library a; 
    Library::book *ptrr; 
    ptrr = a.initNode("s1", 1); 
    a.addNode(ptrr); 
    ptrr = a.initNode("s2", 2); 
    a.addNode(ptrr); 
    a.displayList(a.head); 
} 
+2

縮進代碼然後使用調試器....您會發現錯誤在哪裏。 – jpo38

+1

'Library :: book * Library :: initNode(string s,int i)'應該可能是一個'book'構造函數。 「圖書館」不應該知道如何構建一本書。這是'書'的工作。 – user4581301

+0

'void displayList(book * ptr)const'必須將一本書傳遞給'displayList'似乎有點奇怪。 'displayList'已經知道它的列表。當前的實現將允許用戶調用'a.displayList(b.head);'來獲取'b'列表,這只是愚蠢的。另一方面,'static void displayList(book * ptr)'是有意義的。 – user4581301

回答

0

當你調用第一個a.addNode(ptrr)maintail->next = newNode;(在Library::addNode之內),但是,如tailNULL(未分配還),它crashs ....

現在,有可能是在代碼中的其他問題,但是這是最有可能第一個,這將使程序停止工作......

請注意,代碼中的某些內容可能會被簡化。

像:

Library::book *Library::initNode(string s, int i) 
{ 
    book *ptr = new book; 
    if (ptr == NULL) 
     return static_cast<book *>(NULL); 
    else 
    { 
     ptr->tittle = s; 
     ptr->number = i; 
     return ptr; 
    } 
} 

可能僅僅是:

Library::book *Library::initNode(string s, int i) 
{ 
    book *ptr = new book; 
    if (ptr != NULL) 
    { 
     ptr->tittle = s; 
     ptr->number = i; 
    } 
    return ptr; 
} 

和:

void Library::addNode(book *newNode) 
{ 
    if (head == NULL) 
    { 
     head = newNode; 
     head = newNode; 
    } 
    tail->next = newNode; 
    newNode->next = NULL; 
    tail = newNode; 
} 

應該是:

void Library::addNode(book *newNode) 
{ 
    if (newNode != NULL) // just in case 
    { 
     if (head == NULL) 
     { 
      head = newNode; // one is enough 
     } 
     if (tail != NULL) // to fix your crash 
      tail->next = newNode; 
     newNode->next = NULL; 
     tail = newNode; 
    } 
} 

另外,請參閱user4581301註釋,析構函數代碼甚至不編譯....

+0

我看到你在'libri'周圍工作。 – user4581301

+0

@ user4581301:這是什麼意思? – jpo38

+0

'libri * current,* temp;'不是那種會編譯的東西。 '另一方面'書*電流,*溫度;',另一方面... – user4581301