C - ELIMINARE RIGA DI UNA MATRICE

di il
5 risposte

C - ELIMINARE RIGA DI UNA MATRICE

Salve. Come si evince dal titolo, vorrei proporvi un codice che ho scritto e che sembra essere funzionante, ma ho alcuni dubbi. Intanto posto il codice:
/*ELIMINAZIONE ULTIMA RIGA */
#include <stdio.h>
#include <stdlib.h>

int main() {
    int **mat,i,j,r,c; //dichiarazione variabili
    
    
    printf("\nInserire dimensione righe matrice: "); // inserimento righe
    scanf("%d",&r);
    printf("\nInserire dimensione colonne matrice: "); // inserimento colonne
    scanf("%d",&c);
   
   
   /*ALLOCAZIONE DINAMICA*/
    mat=(int**)malloc(sizeof(int *)*r); //alloco memoria per le righe
    for(j=0;j<c;j++){
        mat[j]=(int*)malloc(sizeof(int)*c); //alloco memoria per le colonne
    }
    
    /*INSERIMENTO E STAMPA DELLA MATRICE COMPLETA*/
    for(i=0;i<r;i++){
        for(j=0;j<c;j++){
            printf("\nInserire elemento [%d][%d]", i+1,j+1);
            scanf("%d",&mat[i][j]);
        }
    }
    for(i=0;i<r;i++){
        printf("\n");
        for(j=0;j<c;j++){
            printf("%5d", mat[i][j]);
        }
    }
    
    
    /*ELIMINO L'ULTIMA RIGA - Pongo tutti gli elementi dell'ultima riga pari a 0, dopodichè riduco la dimensione delle righe di un'unita e dealloco dalla memoria l'ultima riga (passaggio dubbio)*/
    for(i=r-1,j=0;j<c;j++){
        mat[i][j]=0;
    }
    r--;
    free(mat[r]);
    /*STAMPO LA MATRICE SENZA L'ULTIMA RIGA*/
    printf("\n\n\nMatrice senza ultima riga:\n\n");
    for(i=0;i<r;i++){
        printf("\n");
        for ( j = 0; j <c ; j++) {
            printf("%5d",mat[i][j]);
        }
    }
}
Il codice è così strutturato:
- Dichiarazione della matrice come doppio puntatore ad int (voglio allocarla dinamicamente) e dichiarazione delle variabili r,c(righe,colonne) e degli indici i,j(scorrono gli elementi della matrice);
-Inserisco la dimensione delle righe e delle colonne e le salvo rispettivamente con 2 scanf;
-Alloco dinamicamente la matrice, allocando prima un array da "r" puntatori ad int e per ogni puntatore gli alloco un array di int di lunghezza "c";
-Stampo la matrice iniziale (completa);
-Inizio il processo di eliminazione della riga (l'ultima in questo caso) e dopo vado a deallocare la riga eliminata dalla memoria.
-Stampa della matrice rielaborata;

Il tutto funziona, ma ho un dubbio: ha senso deallocare l'ultima riga (o qualsiasi riga eliminata)? E va bene la sitassi
free(mat[r])
per deallocare la singola riga?

Grazie anticipatamente risolverà questi miei dubbi.

5 Risposte

  • Re: C - ELIMINARE RIGA DI UNA MATRICE

    Puoi deallocare la singola riga allocata in precedenza ma devi fare attenzione e impostare il relativo puntatore a NULL dopo la free

    free(mat[r]);
    mat[r]=NULL;

    Quando gestirai la matrice, devi fare attenzione alle righe il cui puntatore è NULL perché non punteranno ad un'area di memoria.

    Ovviamente avrai dei "buchi" nel senso che le altre righe non si ricompattano.

    Questa cosa potrebbe servire o no ... dipende dai casi.
  • Re: C - ELIMINARE RIGA DI UNA MATRICE

    Ciao Oregon e grazie come sempre per la celere ed efficace risposta.
    Io pensavo di utilizzare la funzione
    free(mat[r])
    per eliminare definitivamente la riga poichè (e ti prego correggimi se sto dicendo un'idiozia) se non facessi questo, potrei solo "eliminarla visivamente", ovvero escluderla dalla fase di stampa della matrice, ma comunque in memoria questa riga continuerà ad essere presente, sebbene potrei settare a 0 tutti i suoi elementi.
    Inoltre, per evitare di avere "buchi" nella matrice, mi conviene di spostare sempre la riga scelta per essere eliminata nell'ultima posizione e poi procedere con l'eliminazione, in modo da ricompattare la matrice prima ancora che il processo inizi.
  • Re: C - ELIMINARE RIGA DI UNA MATRICE

    Compattare la matrice potrebbe essere un lavoro pesante per il programma e impegnare la CPU.

    È una cosa necessaria?

    In questo caso prima dovresti spostare i dati delle righe e poi fare la free dell'ultimo riga
  • Re: C - ELIMINARE RIGA DI UNA MATRICE

    Attenzione a questa parte di codice:
    
    /*ALLOCAZIONE DINAMICA*/
    mat=(int**)malloc(sizeof(int *)*r); //alloco memoria per le righe
    for(j=0;j<c;j++){
        mat[j]=(int*)malloc(sizeof(int)*c); //alloco memoria per le colonne
    }
    
    Hai correttamente allocato r righe, il ciclo for dovrebbe andare da 0 a r, non da 0 a c.
  • Re: C - ELIMINARE RIGA DI UNA MATRICE

    SpiritoLibero ha scritto:


    Attenzione a questa parte di codice:
    
    /*ALLOCAZIONE DINAMICA*/
    mat=(int**)malloc(sizeof(int *)*r); //alloco memoria per le righe
    for(j=0;j<c;j++){
        mat[j]=(int*)malloc(sizeof(int)*c); //alloco memoria per le colonne
    }
    
    Hai correttamente allocato r righe, il ciclo for dovrebbe andare da 0 a r, non da 0 a c.
    Confermo l'errore evidenziato da SpiritoLibero, se non correggi il codice, immettendo la dimensione delle colonne minore delle righe avrai un errore.
    aggiungo che se deallochi la memoria con
    
        r--;
        free(mat[r]);
    
    le righe:
    
       /*ELIMINO L'ULTIMA RIGA - Pongo tutti gli elementi dell'ultima riga pari a 0, dopodichè riduco la dimensione delle righe di un'unita e dealloco dalla memoria l'ultima riga (passaggio dubbio)*/
        for(i=r-1,j=0;j<c;j++){
            mat[i][j]=0;
        }
    
    sono inutili, oppure servono solo per qualche test.
Devi accedere o registrarti per scrivere nel forum
5 risposte