2015-01-16 3 views
-3

Я пытаюсь инициализировать мои два дважды связанных списков пустым, но моя программа рушится. Программа разделяет четные и нечетные целые числа из текстового файла. Я считаю, что проблема заключается в функции InitializeList, но я пробовал несколько разных вещей безрезультатно. Мне нужно их инициализировать до:Инициализация двух дважды связанных списков C++

Odds->top = NULL; 
Odds->length = 0; 

Evens->top = NULL; 
Evens->length = 0; 

Может ли кто-нибудь указать, что я делаю неправильно?

Код:

#include <iostream> 
#include <fstream> 
#include <cstddef> 
#include <stdlib.h> 
using namespace std; 

struct node{ 
    int integer; 
    node *next; 
    node *prev; 
}; 
struct list{ 
    int length; 
    node *top; 
}; 
bool EmptyList(list* head) 
{ 
    bool empty; 

    if(head == NULL) 
     empty = true; 
    else 
     empty = false; 

    return empty; 
} 

list* InitializeList(list* A_list) 
{ 
    A_list->top = NULL; 
    A_list->length = 0; 
    return A_list; 
} 
bool OrderedListInsertion(list* &A_list, int number, int &counter) 
{ 
    bool repeat, 
     success; 
    node *newOdd; 
    node *newEven; 
    node *EvenHead; 
    node *oddHead; 



    if((number % 2) == 0) 
    { 
     A_list = new list; 
     newEven = new (nothrow) node; 
     A_list->top = newEven; 
     if(counter == 0) 
     { 
      if(newEven == NULL) 
      { 
       cout << "ERROR. Memory allocation failed!" << endl; 
       success = false; 
      } 
      else 
      { 
       newEven->integer = number; 
       newEven->next = NULL; 
       newEven->prev = NULL; 
       EvenHead = newEven; 
       success = true; 
      } 
     } 
     else 
     { 
      if(newEven == NULL) 
      { 
       cout << "ERROR. Memory allocation failed!" << endl; 
       success = false; 
      } 
      else 
      { 
       newEven->integer = number; 
       newEven->prev = EvenHead; 
       newEven->next = NULL; 
       EvenHead = newEven; 
       success = true; 
      } 
     } 
    } 
    if((number % 2) != 0) 
    { 
     A_list = new list; 
     if(counter == 0) 
     { 
      newOdd = new (nothrow) node; 
      if(newOdd == NULL) 
      { 
       cout << "ERROR. Memory allocation failed!" << endl; 
       success = false; 
      } 
      else 
      { 
       newOdd->integer = number; 
       newOdd->prev = NULL; 
       oddHead = newOdd; 
       newOdd->next = NULL; 
       success = true; 
      } 
     } 
     else 
     { 
      newOdd = new (nothrow) node; 
      if(newOdd == NULL) 
      { 
       cout << "ERROR. Memory allocation failed!" << endl; 
       success = false; 
      } 
      else 
      { 
       newOdd->integer = number; 
       newOdd->prev = newOdd; 
       success = true; 
      } 
     } 
    } 
    return success; 

} 
int ReadFirst(list* &Odds, list* &Evens) 
{ 
    string file1 = "Int1.txt"; 
    ifstream ReadInts; 
    int number; 
    int x = 0, 
     y = 0; 
    bool success; 

    ReadInts.open(file1.c_str()); 
    ReadInts >> number; 
    do 
    { 
     if((number % 2) == 0) 
     { 
      success = OrderedListInsertion(Evens, number, x); 
      if(success) 
      { 
       x++; 
       cout << "Even processed." << endl; 
      } 
      else 
       return 1; 
     } 
     if((number % 2) != 0) 
     { 
      success = OrderedListInsertion(Odds, number, y); 
      if(success) 
      { 
       y++; 
       cout << "Odd processed." << endl; 
      } 
      else 
       return 1; 
     } 
     ReadInts >> number; 
    }while(ReadInts); 

    ReadInts.close(); 

} 
int main() 
{ 
    list* Odds; 
    list* Evens; 

    Odds = InitializeList(Odds); 
    Evens = InitializeList(Evens); 
    ReadFirst(Odds, Evens); 

    return 0; 
} 
+0

Программа компилирует, но не отображает ничего, когда она запускается. – joe

ответ

0

Ваш Odds и Evens переменные являются лишь указателями. Но на что они указывают?

Вам необходимо выделить некоторую память или сделать что-то еще, чтобы они указывали на действительную память. Как бы то ни было, вы передаете их InitializeList(), который устанавливает свойства, которые даже не существуют.

Поскольку вы даже не инициализируете эти указатели, то не знаете, какое значение у них есть, а это значит, что нет никакой информации о том, на какую память они указывают.

Что-то вроде следующего (непроверенного) будет иметь больше смысла.

list Odds; 
list Evens; 

InitializeList(&Odds); 
InitializeList(&Evens); 
ReadFirst(&Odds, &Evens); 

Здесь не указатели. Это полные объекты. И тогда вы просто передаете указатели на эти объекты другим функциям.

+0

Спасибо за помощь. – joe

+0

Не забудьте сделать ответ, который наиболее полезен в качестве ответа. –

0

Ваш InitializeList() не initilize в A_list, поэтому если A_list имеет нулевое значение, то вы не можете ссылаться на него, как A_list->top

list* InitializeList(list* A_list) 
{ 
    A_list->top = NULL; 
    A_list->length = 0; 
    return A_list; 
} 

Посмотрите, как вы это называете:

list* Odds 

Odds = InitializeList(Odds); 

Odds является просто не указав ничего, поэтому вы получите сообщение об ошибке InitializeList()

К ini tialize list, вы должны сделать

list* Odds = new list 
+0

Это исправлено, спасибо! – joe

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