2009-11-24 6 views
1

Je suis en train de faire un devoir et je suis resté coincé ici. J'essaie d'écrire une fonction list_add(). La première fonctionnalité consiste à ajouter des valeurs au tableau. La deuxième fonctionnalité pour cela est d'augmenter la taille du tableau. Donc ça fonctionne un peu comme un vecteur. Je ne sais pas si je comprends bien. Ce que j'ai essayé est de créer un nouveau tableau alloué dynamique qui est plus grand que l'ancien, puis de copier toutes les valeurs dans le nouveau tableau.Tableau dynamique alloué C++

Est-ce la bonne approche?

est ici le corps principal

int main() 
{ 
    const int N = 7; 

    //declaring dynamic array allocation 
    int* list = new int[N]; 

    int used = 0, a_val; 
    for(int i=0;i<11;i++) 
    { 
     list_add(list, used, N, i); 
    } 

    cout << endl << "Storlek: " << N << endl << endl; 
    cout << "Printar listan " << endl; 
    for(int i=0;i<used;i++) 
    { 
     cout << list[i] << ". "; 
    } 

} 

est ici la fonction

bool list_add(int *list, int& space_used, int max_size, int value) 
{ 

    if(max_size-space_used > 0) 
    { 
     *(list+(max_size-space_used-1)) = value; 
     space_used++; 
     return true; 
    } 
    else 
    { 
     cout << "Increasing size of array!" << endl; 
     int new_max_size = space_used+1; 
     delete [] list; 
     int *list_new = new int[new_max_size]; 

     for(int i=0; i<new_max_size; i++) 
     { 
      list_new[i] = i; 
      cout << list_new[i] << ". "; 
     } 
     cout << endl; 
     space_used++; 
     list = list_new; 
     return false; 
    } 
} 
+0

pourquoi votre fonction retourne un bool? –

+2

Est-ce que ce sont les devoirs? – Aaron

+0

Oui et non, c'est un devoir scolaire que j'ai trouvé sur internet. Et je le fais juste pour apprendre. – starcorn

Répondre

1

Il quatre problèmes avec la mise en œuvre de votre code:

  1. Il ne copie pas les éléments de la liste.
  2. Il n'attribue pas la valeur de new_list à la variable list dans main
  3. Il insère des valeurs de l'arrière vers l'avant, et non après la dernière valeur
  4. max_size ne sont pas mis à jour. Il est facile de manquer cela, parce que vous augmentez seulement la taille du tableau par un à chaque fois. De cette façon, il faudrait allouer chaque fois qu'une valeur est ajoutée. Si vous augmentez la nouvelle taille de plus d'un, elle sera toujours réaffectée à chaque fois.

Le premier problème peut être résolu en modifiant la boucle en list_add de sorte qu'il effectue une copie:

for (int i = 0; i < space_used; i++) { // this also changed. 
    list_new[i] = list[i]; 
    cout ... 
} 
// insert the new value (in the front?) 
list_new[max_size-space_used-1] = value;  
delete [] list;   // Delete the list afterwards instead of earlier. 

Le deuxième problème peut par fixe en renvoyant un pointeur vers la liste. Changer la fonction main à ceci:

for (int i = 0; i < 11; i++) { 
    list = list_add(list, used, N, i); 
} 

Le troisième problème peut être résolu en changeant cette ligne

list_new[max_size-space_used-1] = value; 

à

list_new[space_used++] = value; 

Vous devez également supprimer le space_used++ après.

Pour voir le quatrième problème, vous devez modifier cette ligne

int new_max_size = space_used+1; 

à

int new_max_size = space_used+3; 

Il réaffectera encore chaque fois. Il ne devrait toutefois réallouer que deux fois.


Ceci est le code complet:

#include <iostream> 
using std::cout; 
using std::endl; 

int* list_add(int *list, int& space_used, int& max_size, int value) { 
    if (max_size - space_used > 0) { 
     list[space_used++] = value; 
     return list; 
    } 
    else { 
     cout << "Increasing size of array!" << endl; 
     int new_max_size = space_used+1; 

     int *list_new = new int[new_max_size]; 

     for (int i = 0; i < space_used; i++) { 
      list_new[i] = list[i]; 
      cout << list_new[i] << ". "; 
     } 
     cout << endl; 

     list_new[space_used++] = value; 
     max_size=new_max_size; 

     delete [] list; 
     return list_new; 
    } 
} 

int main() { 
    int N = 7; 

    //declaring dynamic array allocation 
    int* list = new int[N]; 

    int used = 0, a_val; 

    for (int i = 0; i < 11; i++) { 
     list=list_add(list, used, N, i); 
    } 

    cout << endl << "Storlek: " << N << endl << endl; 
    cout << "Printar listan " << endl; 

    for (int i = 0; i < used; i++) { 
     cout << list[i] << ". "; 
    } 
} 
+0

cette solution m'a inspiré sur la façon de penser. Merci! – starcorn

0

Je me inquiéterais cette ligne:

*(list+(max_size-space_used-1)) = value; 

et celui-ci:

list_new[i] = i; 
+0

la dernière ligne je l'ai utilisé pour vérifier si j'ai effectivement copié le tableau. Il ne sera pas là quand cela fonctionne – starcorn

1

Vous avez la bonne idée, mais la mise en œuvre pourrait utiliser un peu « coude-graisse »

essayez ceci:

garder 2 int

capacité - longueur à laquelle vous allouez
taille - fin du courant de réseau

if capacity <= size: 
    make new list(size = capacity x 2) 
    memcopy old list into new list -> if you can't memcopy, copy over the data one-by-one 
    delete old list 
if capacity > size: 
    list[size] = value 
    size++ 

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

+0

cela suppose que la taille est incrémentée de manière appropriée en dehors de la boucle –

+0

Ty, je vais essayer cela. – starcorn

1

Un problème qui me saute aux yeux est que vous ne modifiez pas la valeur de votre pointeur de liste en dehors de la portée de votre fonction list_add. Vous devriez faire quelques changements comme ...

bool list_add(int *list, int& space_used, int max_size, int value) 

devient

bool list_add(int **list, int& space_used, int max_size, int value) 

et

list = list_new 

devient

*list = list_new 

Sinon, je pense que vous constaterez que lorsque vous réallouer votre liste, après retour ng de list_add votre pointeur de liste pointe toujours vers l'ancien emplacement.

-2

Il y a beaucoup à dire pour savoir comment résoudre les problèmes, mais ce n'est pas l'un d'entre eux.

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> numbers; 

    for (int i = 0; i < 11; i++) { 
     numbers.push_back(i); 
    } 

    for (int i = 0; i < numbers.size(); i++) { 
     std::cout << numbers[i] << ". "; 
    } 

    std::cout << "\n"; 
} 

MISE À JOUR: Comme indiqué ci-dessus en my other answer sa fonction contient au moins quatre bugs dans 16 lignes. C'est un bug pour chaque quatre lignes de code. Et puis il y a les problèmes avec la conception du code. Par exemple, la taille du tableau et le tableau lui-même doivent être ensemble. Vous ne pouvez pas autrement garantir que la fonction fonctionne.

Deux des problèmes dans le code (2,4) ont pu être résolus en utilisant un struct contenant le pointeur de tableau et la taille maximale de la structure de données. De cette façon, vous devez passer les deux variables ensemble.