2016-03-16 1 views
0
#include "node.h" 
#include <iostream> 

// List class 
class List 
{ 
    node *head; // head is an object that stores the address of the first node 
    public: 
    // constructor that initializes every list to null 
    List() 
    { 
     head = NULL; 
    } 
    // prtototype of the list member functions 
    void Print(); 
    void Insert(float sal, int en); 
    void Delete(float sal, int en); 
}; 

//linklist.h вышеC++ связанный список проблем

#include "linklist.h" 
#include <iostream> 

using std::cout; 
using std::cin; 
using std::endl; 


/** 
* Append a node to the linked list 
*/ 
void List::Insert(float sal, int en) 
{ 

    // Create a new node 
    node* newNode = new node(); 
    newNode->SetData(sal, en); 
    newNode->setNext(NULL); 

    // Create a temp pointer 
    node *tmp = head; 

    if (tmp != NULL) 
    { 
     // Nodes already present in the list 
     // Parse to end of list 
     /*while (tmp->Next() != NULL) 
     { 
      tmp = tmp->Next(); 
     }*/ 

     // Point the last node to the new node 
     tmp->setNext(head); 
    } 
    else 
    { 
     // First node in the list 
     head = newNode; 
    } 
} 

/** 
* Delete a node from the list 
*/ 
void List::Delete(float salary, int data) 
{ 
    // Create a temp pointer 
    node *tmp = head; 

    // No nodes 
    if (tmp == NULL) 
    return; 

    // Last node of the list 
    if (tmp->Next() == NULL) 
    { 
     delete tmp; 
     head = NULL; 
    } 
    else 
    { 
     // Parse thru the nodes 
     node *prev; 
     do 
     { 
      if (tmp->Epnum() == data && tmp->Salary()== salary) 
       break; 
      prev = tmp; 
      tmp = tmp->Next(); 
     } while (tmp != NULL); 

     // Adjust the pointers 
     prev->setNext(tmp->Next()); 

     // Delete the current node 
     delete tmp; 
    } 
} 

/** 
* Print the contents of the list 
*/ 
void List::Print() 
{ 
    // Temp pointer 
    node *tmp = head; 

    // No nodes 
    if (tmp == NULL) 
    { 
     cout << "EMPTY" << endl; 
     return; 
    } 

    // One node in the list 
    if (tmp->Next() == NULL) 
    { 
     cout << tmp->Salary() + tmp->Epnum(); 
     cout << " --> "; 
     cout << "NULL" << endl; 
    } 
    else 
    { 
     // Parse and print the list 
     do 
     { 
      cout << tmp->Epnum(); 
      cout << " --> "; 
      tmp = tmp->Next(); 
     } 
     while (tmp != NULL); 

     cout << "NULL" << endl; 
    } 
} 

//linlist.cpp выше

#include <iostream> 
#include <cstdlib> 
#include "linklist.h" 

using namespace std; 

void menu(List &); 

int main() 
{ 
    // New list 
    List list; 
    menu(list); 
    return 0; 
} 
void menu(List &list) 
{ char choice; 
    int item; 
    float salary; 
    do{ 
     system("CLS"); // use #include <cstdlib> 
     cout << "\t\t\tMain Menu\n\n"; 
     cout << "\tInsert{A}\n"; 
     cout << "\tDelete\n"; 
     cout << "\tPrint{P}\n"; 
     cout << "\tExit\n"; 
     cout << "\t\t What? ";cin >>choice; 
     choice = toupper(choice); 
     cin.ignore(); 
     switch (choice) 
     { case 'A': 
      cout << "Enter Employee numbers to insert and salary : "; cin >> item; cin>>salary; 
      list.Insert(salary, item); 
      cout << item<< " Inserted \n"; cin.get(); 
      break; 
      /*case 'D': 
      cout << "Enter Item to Delete : "; cin >> item; 
      list.Delete(item); 
      cout << item<< " Deleted\n";cin.get(); 
      break;*/ 
      case 'P': 
      list.Print();cin.get(); 
      break; 
     } 
    }while (choice != 'E'); 
} 

//main.cpp выше

//node.h 
//#ifndef NODE_H 
#define NODE_H 

//node class 
class node { 
    int epnum; 
    float salary; 
    node* next; 

    public: 
    node() 
    {} //null constructor 

    //stores argument passed in func. 
    void SetData(float _salary, int _epnum){ 
     salary = _salary; 
     epnum = _epnum; 
    } 
    //stores in next the address of the next node 
    void setNext (node* anext){ 
     next = anext; 
    } 
    //returns epnum stored 
    int Epnum(){ 
     return epnum; 
    } 
    float Salary(){ 
     return salary;} 
    //returns addres of next node 
    node* Next(){ 
     return next; 
    } 
}; 

//node.h выше

Мне нужно создать связанный список, который вставляет узел в начале списка в качестве программы и, конечно же, распечатывает его. По какой-то причине я не могу вставить узел в начале списка, и я запускаю цикл infinte при попытке распечатать его. Он что-то делает, но я точно не знаю. Пожалуйста помоги.

ответ

0

В вашем методе вставки, если у вас есть 1 элемент, уже присутствующий tmp установлен в head, тогда tmp->setNext(head); создаст ссылку на себя. Это является причиной бесконечного цикла в вашем методе печати. Вместо этого попробуйте использовать следующий код вставки.

void List::Insert(float sal, int en) 
{ 
    // Create a new node 
    node* newNode = new node(); 
    newNode->SetData(sal, en); 
    newNode->setNext(head); 
    head = newNode; 
} 

Я также хотел бы отметить, что в вашем методе печати нет углового случая для списка с 1 элементом. Ваш цикл отлично справится с этим случаем. Вы получите тот же результат, если вы опустите Один узел в списке филиал.

void List::Print() 
{ 
    // Temp pointer 
    node *tmp = head; 

    // No nodes 
    if (tmp == NULL) 
    { 
     cout << "EMPTY" << endl; 
     return; 
    } 

    // Parse and print the list 
    do 
    { 
     cout << tmp->Epnum(); 
     cout << " --> "; 
     tmp = tmp->Next(); 
    } 
    while (tmp != NULL); 

    cout << "NULL" << endl; 
} 
0

В List::Insert, у вас есть:

node *tmp = head; 

следуют

tmp->next = head; 

Следовательно, у вас есть круглое звено в объекте. Его next указывает на себя. Это приводит к бесконечному циклу в функции печати.

Что вам нужно, это очень просто:

void List::Insert(float sal, int en) 
{ 
    // Create a new node 
    node* newNode = new node(); 
    newNode->SetData(sal, en); 
    newNode->setNext(head); 
    head = newNode; 
} 
+0

избили меня, lolol – tcc88

0
void List::Insert(float sal, int en) 
{ 

    // Create a new node 
    node* newNode = new node(); 
    newNode->SetData(sal, en); 
    newNode->setNext(NULL); 

    //set the newNode next to point to head 
    newNode->setNext(head); 
    //set the new head as the newNode 
    head = newNode; 


    // Create a temp pointer 
    //node *tmp = head; 

    /*if (tmp != NULL) 
    { 
     // Nodes already present in the list 
     // Parse to end of list 
     /*while (tmp->Next() != NULL) 
     { 
      tmp = tmp->Next(); 
     } 

     // Point the last node to the new node 
     tmp->setNext(head); 
    } 
    else 
    { 
     // First node in the list 
     head = newNode; 
    }*/ 
} 

/** 
* Delete a node from the list 
*/ 
void List::Delete(float salary, int data) 
{ 
    // Create a temp pointer 
    node *tmp = head; 

    // No nodes 
    if (tmp == NULL) 
    return; 

    // Last node of the list 
    if (tmp->Next() == NULL) 
    { 
     delete tmp; 
     head = NULL; 
    } 
    else 
    { 
     // Parse thru the nodes 
     node *prev; 
     do 
     { 
      if (tmp->Epnum() == data && tmp->Salary()== salary) 
       break; 
      prev = tmp; 
      tmp = tmp->Next(); 
     } while (tmp != NULL); 

     // Adjust the pointers 
     prev->setNext(tmp->Next()); 

     // Delete the current node 
     delete tmp; 
    } 
} 

/** 
* Print the contents of the list 
*/ 
void List::Print() 
{ 
    // Temp pointer 
    node *tmp = head; 

    // No nodes 
    if (tmp == NULL) 
    { 
     cout << "EMPTY" << endl; 
     return; 
    } 

    // One node in the list 
    if (tmp->Next() == NULL) 
    { 
     cout << tmp->Salary() + tmp->Epnum(); 
     cout << " --> "; 
     cout << "NULL" << endl; 
    } 
    else 
    { 
     // Parse and print the list 
     do 
     { 
      cout << tmp->Epnum(); 
      cout << " --> "; 
      tmp = tmp->Next(); 
     } 
     while (tmp != NULL); 

     cout << "NULL" << endl; 
    } 
} 

NVM я был усталым, когда я был сочинительством этого кода и просто понял, что я сделал неправильно.

+0

Ну, теперь моя функция удаления не работает. Он работает только в том случае, если его последний узел, но не для первого узла или среднего, я верю – tcc88

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

  • Нет связанных вопросов^_^