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;
}

我不知道为什么,但它只显示最后两个数字。有人知道为什么吗?

4

2 回答 2

1

它只显示最后两个数字,因为当您插入新数字时,您会将头部移动到下一个节点。您有两个选项可以打印整个矢量。

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 回答