2012-07-19 158 views
0

我遇到了这段代码的问题。我很确定它正在交换。泡沫排序链接列表C++

行:curr->Data() = nextEl.Data()使我有以下错误:

"expression must be a modifiable lvalue"

任何帮助表示赞赏。先谢谢你。 这里是我的冒泡排序算法的代码:

class Node 
{ 
private: 
    int data; 
    Node* next; 
public: 
    Node() {}; 
    void Set(int d) { data = d;}; 
    void NextNum(Node* n) { next = n;}; 
    int Data() {return data;}; 
    Node* Next() {return next;}; 
}; 

class LinkedList 
{ 
    Node *head; 
public: 
    LinkedList() {head = NULL;}; 
    virtual ~LinkedList() {}; 
    void Print(); 
    void AddToTail(int data); 
    void SortNodes(); 
}; 


void LinkedList::SortNodes() 
{ 
Node *curr = head; 
Node *nextEl = curr ->Next(); 
Node *temp = NULL; 

if(curr == NULL) 
    cout <<"There is nothing to sort..."<< endl; 
else if(curr -> Next() == NULL) 
    cout << curr -> Data() << " - " << "NULL" << endl; 
else 
{ 
    for(bool swap = true; swap;) 
    { 
     swap = false; 
     for(curr; curr != NULL; curr = curr ->Next()) 
     { 
      if(curr ->Data() > nextEl ->Data()) 
      { 
       temp = curr ->Data(); 
       curr ->Data() = nextEl ->Data();   
       nextEl ->Data() = temp; 
       swap = true; 
      } 
      nextEl = nextEl ->Next(); 
     } 
    } 
} 
curr = head; 
do 
{ 
    cout << curr -> Data() << " - "; 
    curr = curr -> Next(); 
} 
while (curr != NULL); 
cout <<"NULL"<< endl; 
} 
+1

告诉你,即使不包括你说行代码导致错误。 – 2012-07-19 22:30:22

+0

是的,这是因为我试图修复它,但是这种类型的行会在第二个嵌套for循环中的if语句中进行交换。 – philr 2012-07-19 23:24:23

+0

可能重复的[如何使用冒泡排序对链表进行排序?](http://stackoverflow.com/questions/19522121/how-to-sort-a-linked-list-using-bubble-sort) – malat 2015-02-12 15:00:40

回答

1

你做错了。您不能更改函数返回的临时变量的值。

但是你可以把它以这种方式工作..

int& Data() {return data;}; 

虽然这不是好的做法。相反,只需使用你的setter ..

curr->Set(nextEl->Data()); 
+0

我只是试过这个,它给了我错误,因为“curr”它给了我“表达式必须是可修改的左值”,对于“nextEL”它给了我“表达式必须具有类类型” – philr 2012-07-19 23:25:28

+0

您是否添加了'&'符号如图所示?无论如何,第二种形式应该仍然有效。 – vidit 2012-07-19 23:42:50

+0

是的,我做了,谢谢,我现在没有错误!但我认为我的循环是错误的...我得到一个.exe问题 – philr 2012-07-19 23:59:57

0

声明

curr->Data() = nextEl.Data(); 

行不通,你想分配的东西给一个函数的返回值。我不知道你如何定义节点,但你可能意味着类似于

curr->Data = nextEl.Data(); 

即,将某物分配给节点的成员。

+0

'curr-> Set(nextEl.Data())',显然 – 2012-07-19 22:29:06

+0

请注意,分配给如果函数返回一个引用,函数的返回值*可以*工作。这是否恰当是完全不同的问题。 – 2012-07-19 22:31:35

+0

ups,我没有看到Node的定义就在那里:)是的,你是对的Ben。 – timos 2012-07-19 22:31:48

0

变化

curr ->Data() = nextEl ->Data(); 
nextEl ->Data() = temp; 

curr->Set(nextEl ->Data()); 
nextEl->Set(temp);