使用Struct的动态矢量

时间:2012-12-10 18:30:58

标签: c++ dynamic vector struct

我有这个结构:

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 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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”);

或者你可以做到这两点。