2015-03-26 3 views
0

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

Если я компилирую и запускаю этот раздел кода, он сортируется изначально, но как только я повторяю действие, я получаю отсортированный дубликат, если я запускаю еще один раз, каждый элемент появляется 3 раза.

Как я могу заставить этот код останавливать вставку дубликатов?

void sortData(Node *& head, Node * data) 
{ 
    ifstream fin("data.txt"); 
    int acc; string fname, lname; double bal; 
    while (fin >> acc >> fname >> lname >> bal) 
    { 
     data = new Node; 
     data->account = acc; 
     data->fname = fname; 
     data->lname = lname; 
     data->balance = bal; 
     data->next = NULL; 

     if (head == NULL) 
     { 
      head = data; 
     } 

     else if (data->balance <= head->balance) 
     { 
      data->next = head; 
      head = data; 
     } 

     else 
     { 
      Node * temp1 = head; 
      Node * temp2 = temp1->next; 

      while (temp2 != NULL && data->balance > temp2 ->balance) 
      { 
       temp1 = temp2 ; 
       temp2 = temp2 ->next; 
      } 

      data->next = t2; 
      temp1 ->next = data; 
     } 

    } 

    Node * temp = head; 
    while (temp != NULL) 
    { 
     cout << temp->account << " " << temp->fname << " " << temp->lname << " " << temp->balance << "\n"; 
     temp = temp->next; 
    } 

    fin.close(); 

} 

Ясность.

Программа работает с простым МЕНЮ, поэтому, когда я создаю и запускаю в первый раз, я могу сделать несколько вещей, вставить новую запись, удалить, показать все записи (где проблема), а затем выйти. Я могу повторять каждое действие столько раз, сколько возможно, ожидать Exit (очевидно).

Initial Run, а затем показать все записи в соответствии с номером счета:

1111 FName1 LName1 400,56

2222 FName2 LName2 23,45

3333 FName3 LName3 4599,91

4444 FName4 LName4 1000,5

Хорошо работает.

Но

Когда я хочу, чтобы показать все записи еще раз, я вижу это

1111 FName1 LName1 400,56

1111 FName1 LName1 400,56

2222 FName2 LName2 23,45

2222 FName2 LName2 23.45

3333 FName3 LName3 4599,91

3333 FName3 LName3 4599,91

4444 FName4 LName4 1000,5

4444 FName4 LName4 1000,5

Я не вставив в файл, просто распечатав данные в порядке возрастания.

+1

Пожалуйста, ваши основные. Я думаю, вы вызываете sortData n раз, и поэтому вы читаете данные из файла n раз, поэтому у вас будет n копий после n вызовов. Однако мне нужно, чтобы ваш главный подтвердил это. – midor

+0

Заметка без форматирования кода, здесь, на SO. 4 пробела используется для обозначения «это код». Итак, представьте себе, что 4 пробела исчезают из каждой строки, на конечном выходе. –

+0

@viktoriaAnderson вы хотите помочь? – hello

ответ

1

Вы делаете слишком много вещей в одной функции. Разделите их на более мелкие, многоразовые функции.

// Function to insert the data sorted in an order. 
void insertSortedData(Node*& head, 
         int acc, 
         std::string const& fname, 
         std::string const& lname, 
         double bal) 
{ 
    // If the list is empty, create a node and return. 
    Node* newNode = new Node(acc, fname, lname, bal) 
    if (head == NULL) 
    { 
     head = newNode; 
     return; 
    } 

    // If the value of the new node is less or equat to the value 
    // of the head node, make it the head node and return. 
    if (newNode->balance <= head->balance) 
    { 
     newNode->next = head; 
     head = newNode; 
     return; 
    } 

    // Insert new node at the right place. 
    Node * temp1 = head; 
    Node * temp2 = temp1->next; 

    while (temp2 != NULL && newNode->balance > temp2->balance) 
    { 
     temp1 = temp2 ; 
     temp2 = temp2->next; 
    } 

    newNode->next = temp2; 
    temp1->next = newNode; 
} 

// Function to read data from a file and create 
// a sorted list. 
void readDataFromFile(std::string const& file, 
         Node*& head) 
{ 
    std::ifstream fin(file); 
    int acc; 
    std::string fname; 
    std::string lname; 
    double bal; 
    while (fin >> acc >> fname >> lname >> bal) 
    { 
     insertSortedData(head, acc, fname, lname, bal); 
    } 
} 

// Functoin to print the contents of a list. 
void printList(Node* head) 
{ 
    Node* temp = head; 
    while (temp != NULL) 
    { 
     cout << temp->account << " " << temp->fname << " " << temp->lname << " " << temp->balance << "\n"; 
     temp = temp->next; 
    } 
} 

Затем, вы можете позвонить каждый по отдельности:

int main() 
{ 
    Node* head = NULL; 

    // Read data from a file. 
    readDataFromFile("data-1.txt", head); 

    // Print the data 
    printList(head); 


    // Read data from a different file. 
    readDataFromFile("data-2.txt", head); 

    // Print again. 
    printList(head); 
} 
1

Помимо того, что ваша функция делает слишком много, и даже не видя вызывающий код, я могу сказать с вашего вывода - если то, что вы показываете, на самом деле является единственным выходом ut - что вы звоните sortedData несколько раз. sortedData вставляет все записи из входного файла в порядке сортировки каждый раз, когда вызывается sortedData, независимо от того, есть они там уже или нет! Таким образом, после n вызовов у вас есть n копий элемента данных в вашем списке.

Подумайте, что вы хотите от своей функции. Сейчас ваша функция делает это на каждый вызов:

while есть несколько записей в файле ввода:

  1. Читать следующую запись из входного файла.
  2. Внести запись в список отсортированным способом.

Теперь у вас есть отсортированный список всех записей во входном файле. Вы печатаете все записи в списке.

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

Если вы хотите, чтобы отобразить все записи, единственное, что вы должны повторить является печать часть, но если вы вызываете sortedData снова, вы вместо того, чтобы повторить всю функцию и на этот раз список вы передаете не является пустым , но уже содержит каждую запись из входного файла, поэтому добавление каждой записи снова сортированным образом даст вам дубликат для каждой записи. Поэтому самое простое решение для вас для вызова функции один раз при запуске, а просто вызвать printList() функцию позже, которая просто делает печатную часть:

void printList(Node *head){//local copy of the pointer, can change this 
    while (head != NULL) 
    { 
     cout << head->account << " " << head->fname << " " << 
      head->lname << " " << head->balance << "\n"; 
     head = head->next; 
    } 
} 
Смежные вопросы