2017-09-24 105 views
-3

我想做一个链表并同时排列所述链接列表,但我不能完全弄清楚如何让代码完全排序列表。链接列表排序不起作用

这里是我的课:

class PayRoll{ 
private: 
    string EmployeeName; // employee name 
    double PayRate; // employee pay rate 
    double HoursWorked; // employee hours worked 
public: 
    void setRate(double); // set rate 
    void setName(string); // set name 
    void setHours(double); // set hours worked 
    string getName(){return EmployeeName;}; 
    double getHours(){return HoursWorked;}; 
    double getRate() {return PayRate;}; 
    double getPaid(){return (PayRate*HoursWorked);}; 

};

class PayRollList{ 
    private: 
     struct ListNode { 
      PayRoll p; 
      ListNode* next; 
     }; 
     ListNode *head; 
    public: 
     PayRollList() { head = nullptr; }; 
     void insert(string, double, double); // name, rate, hours 
     void printPayChecks(); // print name and total pay for all employees 
}; 

我认为的主要问题是插入功能。数据的实现已经成功完成,所以我忽略了这一点。我无法让这部分工作。

void PayRollList::insert(string EmpName, double rate, double hours){ 
ListNode* newNode = new ListNode; 

newNode->p.setName(EmpName); 
newNode->p.setRate(rate); 
newNode->p.setHours(hours); 
newNode->next = nullptr; 

ListNode* current = this->head; 
ListNode* temp; 

if (head == nullptr){ 
    this->head = newNode; } 
else { 
    current = this->head; 
    while (current->next != nullptr){ 
     if (newNode->p.getRate() < current->p.getRate() && this->head == current){ 
      temp = current; 
      this->head = newNode; 
      newNode->next = temp; 
      return; 
     } 
     else if (newNode->p.getRate() < current->p.getRate() && this->head != current){ 
      temp = current; 
      current = current->next; 
      newNode->next = current; 
      temp->next = newNode; 
      return; 
     } 
     else if (newNode->p.getRate() < current->p.getRate()){ 
      temp = current; 
      current = current->next; 
      newNode->next = current; 
      temp->next = newNode; 
      return; 
     } 
     else current = current->next; 
    } 
    current->next = newNode; 
} 

}

任何帮助将不胜感激!

回答

0

指针指针技巧是保持向后引用。你可以使用单深度指针始终引用完成相同的 - 比较>下一个元素,但你需要特殊的情况下,插入链表的第一个元素。

void PayRollList::insert(string EmpName, double rate, double hours){ 
    ListNode* newNode = new ListNode; 

    newNode->p.setName(EmpName); 
    newNode->p.setRate(rate); 
    newNode->p.setHours(hours); 
    newNode->next = nullptr; 

    ListNode** current = &(this->head); 
    while (*current != nullptr && (*current)->p.getRate() < newNode->p.getRate()) { 
     current = &((*current)->next); 
    } 
    newNode->next = *current; 
    *current = newNode; 
} 
+0

这工作!你有没有可能解释双指针在这种情况下如何工作? –

+0

https://ibb.co/e5ZNZQ 由于电流是一个指针到指针,它指向“下一个”指针* *内的ListNode类的每个实例。 – jdizzle