1

私はこの構造体を持っています:

struct Node {
  int number;
  Node *next;
};

このクラスは、要素を挿入してベクトルを表示します。

// Classe DynamicVector :
//  e' la classe che consente di inserire elementi
//  e visualizzare il vettore di strutture
class DynamicVector
{

  public:
    DynamicVector();
    void InsertNumber(int number);
    void ShowVector();

  protected:
    Node *p;

};

これは実装です:

DynamicVector::DynamicVector() {
  this->p = NULL;
}

void DynamicVector::InsertNumber(int number) {
  Node *temporary = new Node;

  // Possiamo avere due possibili casi:
  //  non e' stato ancora inserito nessun elemento
  // ...
  if (this->p == NULL) {
    temporary->number = number;
    temporary->next   = NULL;

    this->p = temporary;
    // ...
    //  oppure dobbiamo aggiungerne uno alla fine
    //  In questo caso meglio dire, lo "accodiamo"
  } else {
    // Sfogliamo le strutture fino a giungere
    // all' ultima creata
    while (this->p->next != NULL) {
      this->p = this->p->next;
    }

    temporary->number = number;
    temporary->next   = NULL;

    // In questo passaggio copiamo la struttura
    // temporanea "temporary" nell' ultima struttura "p"
    this->p->next = temporary;
  }
}

void DynamicVector::ShowVector() {
  while (this->p != NULL) {
    std::cout << this->p->number << std::endl;
    this->p = this->p->next;
  }
}

主な機能で私はこれを書いた:

#include <iostream>
#include <conio.h>

#include "dynamic_vector.h"

int main() {
  DynamicVector *vector = new DynamicVector();

  vector->InsertNumber(5);
  vector->InsertNumber(3);
  vector->InsertNumber(6);
  vector->InsertNumber(22);
  vector->ShowVector();

  delete vector;

  getch();
  return 0;
}

理由はわかりませんが、最後の2つの数字しか表示されません。誰かが理由を知っていますか?

4

2 に答える 2

1

新しい番号を挿入するときに頭を次のノードに移動しているため、最後の 2 つの番号のみが表示されます。ベクトル全体を印刷するには、2 つのオプションがあります。

if (this->p == NULL) {
  temporary->number = number;
  temporary->next   = NULL;

  this->p = temporary;
  // ...
  //  oppure dobbiamo aggiungerne uno alla fine
  //  In questo caso meglio dire, lo "accodiamo"
} else {
  // Sfogliamo le strutture fino a giungere
  // all' ultima creata
  Node* temp2 = this->p;
  while (temp2->next != NULL) {
    temp2 = temp2->next;
  }

  temporary->number = number;
  temporary->next   = NULL;

  // In questo passaggio copiamo la struttura
  // temporanea "temporary" nell' ultima struttura "p"
  temp2->next = temporary;
}

または main() で、ベクトルの最初のノードの場所を保存し、それを印刷に使用します

DynamicVector *vector = new DynamicVector();
DynamicVector *vector2 = vector;
...
vector2->ShowVector();
于 2012-12-10T18:43:07.483 に答える
0
while (this->p->next != NULL) {
   this->p = this->p->next;
}

このコードでは、既存のノードをすべてスキップすると、このノードではそれらが失われます。つまり、p が NULL でないときに呼び出してから、p を NULL にリセットします。コードは意味がありません。p = NULL に等しいです。

これを変更するか、

vector->InsertNumber(5)->InsertNumber(3)->InsertNumber(6)->InsertNumber(22);

(InsertNumber から "this" を返す必要があります);

または、両方を行うこともできます。

于 2012-12-10T18:42:51.093 に答える