2015-10-10 2 views
-1

Я знаю, что весь код не работает, но когда я впервые запускаю программу, а первая строка считывается из текстового поля, ошибки программы выходят. Основная функция - передать строку «Вставить list function "в реализации. Программа должна вставлять узел каждый раз, когда строка считывается из текстового файла. Вызов программы также вызывает функцию удаления, которая, как я знаю, еще не работает (поэтому она закомментирована). Я просто пытаюсь найти ошибку, которая создается при вызове функции insert. Основная функция имеет цикл while, который создает узел для каждой текстовой записи и передает узел один за другим для сортировки в порядке ABC.Упорядоченные ошибки со связанными списками

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

#include <string> 
using namespace std; 

struct Node 
{ 
string data; 
Node * next; 
}; 

class List 
{ 
public: 
List(); 
~List(); 
bool Insert(string); 
bool Delete(string); 
void Print(); 
bool Edit(string, string); 
private: 
Node * head; 
Node * cur; 
Node * trailer; 
}; 

Реализация:

#include <iostream> 
#include <string> 
#include <fstream> 
#include "List.h" 
using namespace std; 

List::List():head(NULL) 
{} 
List::~List() 
{} 
bool List::Insert(string data) 
{ 
Node* newNode = new Node; 

if (newNode == NULL) 
{ 
    cout << "Error: Memory Allocation Failed" << endl; 
    return false; 
} 

newNode->data = data; 
cur = head; 
trailer = NULL; 
if (head == NULL) 
{ 
    //cout << "head is Null" << endl; 
    head = newNode; 
    cout << head -> data << endl; 
    newNode->next = NULL; 
    //return true; 
} 
while (newNode->data > cur->data && cur -> next != NULL) 
{ 
    trailer = cur; 
    cur = cur->next; 

} 

if (cur->next == NULL) 
{ 
    cur->next = newNode; 
    newNode->next = NULL; 
    return true; 
} 

else 
{ 
    trailer->next = newNode; 
    newNode->next = cur; 
    return true; 
    } 

    } 


bool List::Delete(string data) 
{ 
/*Node *temp = head->next; 
while (head != NULL) 
{ 
    delete head; 
    head = temp; 
    temp = head->next; 
} 
return true;*/ 

} 
bool List::Edit(string dataDelete, string dataInsert) 
{ 
Delete(dataDelete); 
Insert(dataInsert); 
return true; 
} 
void List::Print() 
{ 
for (Node * Count = head; Count != NULL; Count = Count->next) 
{ 
    cout << Count->data << endl; 
} 
} 

ответ

0

@Deepak правильно, проблема в том, когда вы вставив первый элемент переменной head является NULL и cur устанавливается на значение head.

Чтобы исправить это, вы можете просто поместить

cur = head; 
trailer = NULL; 

состояния после

if (head == NULL) 
{ 
    //cout << "head is Null" << endl; 
    head = newNode; 
    cout << head -> data << endl; 
    newNode->next = NULL; 
    //return true; 
} 

Также будет ошибка, когда вы будете пытаться вставить элемент, который должен быть помещен в самом начале (значение, меньше любого другого значения в списке). Это произойдет, когда условие цикла

trailer = NULL; 
while (newNode->data > cur->data && cur -> next != NULL) { ... } 

ложно в первом вызове, так trailerNULL будет. Чтобы исправить это вам нужно будет проверить trailer переменную, как этот

if (trailer == NULL) { 
    newNode->next = head; 
    head = newNode; 
    return true; 
} 

В результате ваш код Insert будет выглядеть

bool List::Insert(string data) 
{ 
    Node* newNode = new Node; 

    if (newNode == NULL) 
    { 
     cout << "Error: Memory Allocation Failed" << endl; 
     return false; 
    } 

    newNode->data = data; 
    if (head == NULL) 
    { 
     head = newNode; 
     newNode->next = NULL; 
     return true; 
    } 

    cur = head; 
    trailer = NULL; 
    while (newNode->data > cur->data && cur -> next != NULL) 
    { 
     trailer = cur; 
     cur = cur->next; 
    } 

    if (trailer == NULL) { 
     newNode->next = head; 
     head = newNode; 
     return true; 
    } 

    if (cur->next == NULL) 
    { 
     cur->next = newNode; 
     newNode->next = NULL; 
     return true; 
    } 
    else 
    { 
     trailer->next = newNode; 
     newNode->next = cur; 
     return true; 
    } 
} 
+0

Спасибо, ребята. Еще один вопрос, список, который я сортировал, не был полностью отсортирован в порядке abc. тестовый список, который я использовал, это: оплатить счета, сделать стоматологическую аппту, ежедневное чтение Библии, получить оценку на ремонт автомобилей, почтовые благодарности, принять тест. Список сортировался и выводился следующим образом: ежедневное чтение Библии, оценка на машине, заметки по почте, оплата счетов, изготовление зубных апплетов, тест. –

+0

@MatthewDanielSorrell Произошла ошибка в коде, я обновил свой ответ. – NikolayKondratyev

+0

Большое спасибо! @NikolayKondratyev –

0

При вставке первого узла вы получаете сообщение об ошибке из-за

while (newNode->data > cur->data && cur -> next != NULL) 

В этот момент значение в дворняжка является NULL и вы пытаетесь получить доступ к Kur-> данные.

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