PDA

Visualizza la versione completa : [C] Matrice dinamica


LuLyLuNa
28-02-2014, 12:54
Buongiorno a tutti,
ho un problema con un progetto.
Devo gestire una lista di invitati e le simpatie/antipatie tra essi.
Ho deciso di usare una matrice in cui inserire l'intero che indica l'antipatia o la simpatia tra 2 invitati (rappresentati dagli indici)
Quando creo la matrice non so ancora quanti elementi, quindi questa dovrebbe ridimensionarsi (aumentare) ad ogni inserimento di invitato.

Come faccio?

oregon
28-02-2014, 13:22
Se usi il C (non il C++) c'è la realloc per reallocare memoria ma per il suo uso devi impostare con chiarezza i tuoi dati ...

infinitejustice
01-03-2014, 01:42
Una matrice altro non è che una lista di liste. In C questo si traduce in un puntatore a puntore ad int, la cui prima dimensione è rapprsentata da puntatori ad int. Una cosa del genere, assumendo N = 5.

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv){

int i, j, n = 5, **matrix;

if(!(matrix = (int **)malloc(n*sizeof(int *))))
abort();

for(i = 0; i < n; i++){
*(matrix+i) = (int *)malloc(n*sizeof(int));
for(j = 0; j < n; j++)
*((*(matrix+i))+j) = rand()%100;
}

for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
printf("%d\t", *((*(matrix+i))+j));
printf("\n");
}

SE non sai a priori la dimensione di N, allora dovresti, nel caso, allocare una nuova matrice di dimensione N+1 e copiarvi dentro i dati, con una funzione ad hoc.

Due alternative:

1. Array fornito dalla libreria glib.
2. Una linked list di linked lists (non devi piu preoccuparti di reallocare, ma perdi la possiblità di acceder agli elementi con [][], a meno che tu non ti crei una funzione ad hoc che lo faccia).

Scara95
01-03-2014, 07:45
Una matrice altro non è che una lista di liste. In C questo si traduce in un puntatore a puntore ad int, la cui prima dimensione è rapprsentata da puntatori ad int. Una cosa del genere, assumendo N = 5.

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv){

int i, j, n = 5, **matrix;

if(!(matrix = (int **)malloc(n*sizeof(int *))))
abort();

for(i = 0; i < n; i++){
*(matrix+i) = (int *)malloc(n*sizeof(int));
for(j = 0; j < n; j++)
*((*(matrix+i))+j) = rand()%100;
}

for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
printf("%d\t", *((*(matrix+i))+j));
printf("\n");
}

SE non sai a priori la dimensione di N, allora dovresti, nel caso, allocare una nuova matrice di dimensione N+1 e copiarvi dentro i dati, con una funzione ad hoc.

Due alternative:

1. Array fornito dalla libreria glib.
2. Una linked list di linked lists (non devi piu preoccuparti di reallocare, ma perdi la possiblità di acceder agli elementi con [][], a meno che tu non ti crei una funzione ad hoc che lo faccia).
*(matrix+i)
*((*(matrix+i))+j)
Perché non usare semplicemente le parentesi:
matrix[i]
matrix[i][j]

Anche se non conosci N non serve copiare tutto (o almeno: se serve si arrangia la realloc):

realloc di matrix
realloc di matrix[j] con 0 <= j < length(matrix)
eventuale inizializzazione ultima riga e ultima colonna di matrix

Loading