0

我正在尝试以 {1,2,3,4,etc} 格式选择我的链。您可以在下面找到包含节点布局的头文件。我只是对如何循环浏览我的列表以打印出项目感到困惑。

任何指导将不胜感激!

设置.h

using namespace std;

#include <iostream>

class Set
{
  private:

    struct Node
    {
      int Item;      // User data item
      Node * Succ;   // Link to the node's successor
    };

    unsigned Num;    // Current count of items in the set
    Node * Head;     // Link to the head of the chain

  public:

    // Return information about the set
    //
    bool is_empty() const { return Num == 0; }
    unsigned size() const { return Num; }

    // Initialize the set to empty
    //
    Set();

    // Insert a specified item into the set, if possible
    //
    bool insert( int );

    // Display the set
    //
    void display( ostream& ) const;

};
4

6 回答 6

3

这里有两个建议: 1)先排序列表,然后打印所有节点;2)为数据创建另一个列表(索引)并对这些链接进行排序(这些节点中不需要数据)。

首先排序列表

一种常用的技术是按照您希望它们打印的顺序对节点进行排序。这应该涉及更改链接字段。
接下来,从头节点开始,打印列表中的每个节点(或列表中每个节点的数据)。

使用索引列表

创建另一个没有数据字段的链表。此列表中的链接指向原始列表中的数据字段。按照您希望打印节点的顺序对新列表进行排序。
该技术保留了第一个列表的创建顺序并允许不同的排序方案。

更改链接

由于您正在编写自己的链接列表,因此链接的更改留作练习,因为我没有得到报酬来编写您的代码。SO以及网络上有很多用于排序和遍历链表的示例。

于 2012-11-15T02:02:17.180 回答
1

你只想做这样的事情:

void Set::display(ostream &out) const {
    for(int i=0; i<Num; i++) {
        out << Pool[i] << " ";
    }
    out << endl;
}

Anostream行为正常cout

于 2012-10-31T17:57:46.217 回答
1

很难回答你的问题。如果要将数组打印到屏幕上,则应考虑编写display()如下代码:

#include <iostream>
#include <iterator>
void Set::display() const {
   ostream_iterator<int> out_it (cout," ");
   copy(Pool,Pool+Num,out_it);   
   cout << endl;
}

或者如果你想写信 (正如@alestanis在回答ostream&中指出的那样)

#include <iostream>
#include <iterator>
void Set::display(ostream &out) const {
   ostream_iterator<int> out_it (out," ");
   copy(Pool,Pool+Num,out_it);   
   out << endl;
}
于 2012-10-31T18:01:08.820 回答
1

没有测试,我会做这样的事情。(假设最后一个节点已Succ设置为NULL,正如我建议的那样。)

void LoopList(struct Node *head)
{
    for (struct Node *p = head; p != null; p = p->Succ)
    {
        // Do whatever with this node
        Print(p);
    }
}
于 2012-11-15T01:59:35.930 回答
0

我想我想多了。无论如何,这就是我最终要做的。现在我只需要为逗号添加一些格式,我已经设置好了。

Node * Temp;
Temp = new (nothrow) Node;
Temp = Head;
out << "{";
while(Temp->Succ)
{
      out << Temp->Item;
      Temp = Temp->Succ;
}
out << '}' << endl;
于 2012-11-15T02:45:55.103 回答
-2

假设你的列表是循环的,你可以使用这个:

struct Node *n = begin;

if (n != NULL) {
    //do something on it
    ...
    for (n = begin->Succ; n != begin; n = n->Succ) {
    }
}

或者

struct Node *n = begin;
if (n != NULL) {        
    do {        
        //do something
        ...
        n = n->Succ;
    } while (n != begin)
}
于 2012-11-15T02:01:38.860 回答