2016-01-20 106 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