1

単独でリンクされたリストが空かどうかを判断するための最良かつ最も簡単な方法を見つけようとしています。

ブールメソッドを作成する必要がありますか?

ありがとう

読み取り方法

void List::Read(istream& r) {

char c[13];
r >> c;
r >> numberOfInts;

Node *node = new Node();

for(int i = 0; i < numberOfInts; i++)
{
    r >> node->data;
    cout << node->data << endl;
    node->next = new Node;
    //node = node->next;

    head = node;
}
}
else
{
    if(node->data > head->data)
    {
        head->next;
    }
    else if(node->data < head->data)
    {
        Node* tempNode;
        tempNode = head;
        head->data = node->data;
        node->data = tempNode->data;
    }
}
system("pause");

}

ヘッダーファイル

class Node
{
public:
    Node() {}
    Node(int d, Node* q = 0) : data(d), next(q) {} //constructor with parameters data and next
    int data; //holds data in node
    Node* next;//pointer to next node
};

class List
{
public:
    void Read(istream&);
    void Write(ostream&);

    void setReadSort(bool);
    void sortOwn();
    void insertionSort(Node*);
    bool isEmpty();

    bool _sortRead;
    int numberOfInts;

    List(void);
    ~List(void);
protected:
    Node *head;
    Node current;
};
4

3 に答える 3

2

これは完全に実装に依存します。ただし、これは通常、最初のノードが存在するかどうか、コンテンツがあるかどうかなどを確認することで、非常に迅速に行うことができます。

于 2011-04-27T16:19:32.323 に答える
0

私はこれをテストしませんでしたが、動作するはずです。

[編集]常に存在する頭を考慮してプログラムを変更しました。

[編集]構造体ではなく、クラスを説明するようにプログラムを変更しました

bool isEmpty(){return (this->head == NULL)};

これにより、より適切な結果が得られます

もう1つ、system( "pause");を使用していることがわかります。これが宿題であることは知っていますが、それは非常に悪い習慣です。より良い方法は、最初にstdinのバッファーをクリアし(必要な場合)、次に文字を無視することです。例は次のとおりです。

cin >> somenumber; // Extract a number (assuming its safe)
cin.ignore(1, 10); // Ignore 1 character, or a newline, whichever comes first
                   // ^ this clears the buffer, it does NOT wait for input since
                   // the formatted extraction left a character in the buffer ('\n')
cin.ignore();      // Essentially the same as above, but since there is nothing in
                   // the buffer, it reads a single character from stdin
于 2011-04-27T16:33:29.927 に答える
0

はい。その理由は、イテレータを使用して要素を挿入する場合があるためです。イテレータで要素の数を処理するのは非常に不快 (または不可能) です。これが、多くの STL 実装が関数に対して線形時間を持っている理由size_t size(void)です。bool empty(void)リストが空で、一定の時間を持っているかどうかを確認する効果的な方法です。

注意: STL を使用する場合は、bool empty(void)に対して使用することをお勧めしますsize_t size(void)。詳細: Meyers: 効果的な STL .

関数は単純です:

bool empty( void ) const
{
  return ( this->begin() == this->end() );
}

あなたの場合:

bool empty( void ) const
{
  return ( this->head == 0 );
}
于 2011-04-27T16:20:16.713 に答える