2010-09-06 13 views
6

Come posso spostare gli elementi di un array all'elemento successivoArray spostando al successivo elemento

eg: x[5] = { 5, 4, 3, 2, 1 }; // initial values 
    x[0] = 6; // new values to be shifted 
    x[5] = { 6, 5, 4, 3, 2 }; // shifted array, it need to be shifted, 
           // not just increment the values. 

Questo quello che ho fatto finora. È sbagliato, ecco perché ho bisogno di aiuto qui. Grazie in anticipo.

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x[5] = { 5, 4, 3, 2, 1 }; 

    int array_size = sizeof(x)/sizeof(x[0]); 

    x[0] = 6; 

    int m = 1; 

    for(int j = 0; j < array_size; j++) { 
    x[m+j] = x[j]; 
    cout << x[j] << endl; 
    } 

    return 0; 
} 
+0

iniziare questa copia in ordine di dall'indice fine della matrice piuttosto che l'avvio, perché quando si inizia a copiare l'elemento dall'inizio si perderanno l'elemento successivo. Quindi cambia il ciclo for –

+0

Nota: "off by one": x [m + j] = x [j]; proverò a sovrascrivere l'elemento con l'indice "array_size" che è fuori misura l'array - è un comportamento indefinito. – sharptooth

risposta

8
#include <iostream> 

int main() { 

    int x[5] = { 5, 4, 3, 2, 1 }; 

    int array_size = sizeof (x)/sizeof (x[0]); 

    for (int j = array_size - 1; j > 0; j--) { 

     x[j] = x[j - 1]; 
    } 

    x[0] = 6; 

    for (int j = 0; j < array_size; j++) { 

     std::cout << x[j]; 
    } 

    return 0; 
} 
+0

Grazie mille. – Azam

+0

Questo non rischia intenzionalmente di produrre un errore di segmentazione? – imkendal

4

Prima di tutto, si dovrebbe spostare i vecchi valori nella matrice prima di scrivere il nuovo valore. Ma invece di un ciclo, è meglio usare memmove(). O ancora meglio con std::vector invece di un array: gestisce tutti questi problemi di basso livello, incluso il ridimensionamento automatico della matrice quando necessario.

+0

+1 per 'memmove' –

+0

Ma immagino che questo sia compito, quindi sono necessari loop e manipolazione dell'indice. –

8

Per "spostare verso destra" si deve scorrere dalla fine di matrice:

for(int j = array_size - 2; j >= 0; j--) { 
    x[m+j] = x[j]; 
    cout << x[j] << endl; 
} 

altrimenti basta sovrascrivere tutti gli elementi con l'elemento 0a.

Nota array_size - 2 - in caso contrario si ha "spento di uno" cercando di accedere all'elemento oltre la fine dell'array e si tratta di un comportamento non definito.

+1

+1 buona cattura, perse da tutti gli altri (incluso me stesso :-) –

+0

non funziona. l'output diventa 2,3,4,6 – Azam

+1

@azam: ho solo indicato il problema principale nel codice.Devi comunque inserire il valore nell'elemento [0] te stesso e dovrai eseguire un'iterazione sull'array per la seconda volta per ottenere l'output. – sharptooth

1

Nel caso generale in cui è necessario spostare gli elementi m (dove 0 <= m <n): iniziare dalla fine dell'array. Se si inizia all'inizio (indice 0), si sovrascrive e quindi si sposta quel valore sottoposto a override.

Anche lo studio del codice sorgente di std::memmove può essere istruttivo.

+0

Penso che questa soluzione e quella che usa la rotazione siano migliori di quelle che usiamo per il ciclo. Utilizzare le routine di libreria è sempre meglio che scrivere il proprio codice. –

0

È possibile iniziare dalla fine dell'array. Si copia l'elemento

  • in 2a ultima posizione fino all'ultimo posizione,
  • elemento in 3 ° ultima posizione al 2 ° ultima posizione,
  • ....
  • elemento in prima posizione (indice 0) alla seconda posizione e infine
  • copia il nuovo numero nella prima posizione . .

.

for(j = array_size-1; j >0; j--) { 
x[j] = x[j-1]; 
} 
x[0] = 6; 
14
#include<algorithm> 

// ... 
std::rotate(x, x+4, x+5); 
x[0] = 6; 
+0

scusate. non voglio usare algo. – Azam

+5

+1 Da parte mia per aver effettivamente fornito una soluzione C++. – fredoverflow

0
#include <iostream> 

    using namespace std; 

    int main() 
    { 
     int x[5] = { 5, 4, 3, 2, 1 }; 

     int array_size = sizeof(x)/sizeof(x[0]); 

     int m = 1; 

     for(int j = array_size-1; j > 0; j--) { 
      x[j] = x[j-m]; 
      cout << x[j] << endl; 
     } 

     x[0] = 6; 
     return 0; 
    } 
+0

l'output è 2,3,4,5 – Azam

Problemi correlati