Domanda Risolto da liste a matrici in C

sara20

Utente Silver
6 Febbraio 2020
116
29
1
54
Ultima modifica:
Buon pomeriggi, è possibile trasformare una lista in matrice, cioè ho una lista del genere:
Codice:
(5,0,3)
(5,1,9)
(5,2,0)
(5,3,0)
(5,4,0)
(4,0,6)
(4,1,3)
(4,2,3)
(4,3,3)
(4,4,3)
(3,0,9)
(3,1,9)
(3,2,0)
(3,3,0)
(3,4,4)
(2,0,2)
(2,1,9)
(2,2,3)
(2,3,3)
(2,4,7)
(1,0,8)
(1,1,8)
(1,2,5)
(1,3,0)
(1,4,7)
(0,0,8)
(0,1,3)
(0,2,3)
(0,3,3)
(0,4,8)
devo trasformarla in matrice, ho provato cosi ma non mi funziona:
C:
void aggiornaMatrice(int **matrice, int n, int m){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      if(matrice[i][j] %2 != 0)
          matrice[i][j] = 0;
    }
  }
}
 
Non ho ben capito cosa vuoi ottenere.

Innanzitutto cosa intendi per lista? Un file di testo, un array, una linked list?

Dopo che hai chiarito quale sia il tuo input, devi specificare anche quale vuoi che sia l'output.
 
  • Mi piace
Reazioni: sara20
Ultima modifica:
Non ho ben capito cosa vuoi ottenere.

Innanzitutto cosa intendi per lista? Un file di testo, un array, una linked list?

Dopo che hai chiarito quale sia il tuo input, devi specificare anche quale vuoi che sia l'output.
okay intendo una linked list in pratica ho un file con una matrice poi per mia comodità l'ho trasformato in una lista in tal modo l'ho ordinato e ora mi serve ritrasformarlo in matrice quindi ho tipo:
(1,9,3)
(5,8,7)
ciò che voglio ottenere è:
1 3 5
7 8 9
Ti do il codice:
C:
void aggiornaMatrice(int **matrice, int n, int m){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      if(matrice[i][j] %2 != 0)
          matrice[i][j] = 0;
    }
  }
}
 
Potresti postare il file con la matrice e la funzione che utilizzi per leggerlo? Se hai veramente una linked list, posta anche le funzioni a riguardo.

A intuito, secondo me hai un array creato con malloc e stai cercando di fare una cosa di questo tipo
C:
void aggiornaMatrice(int *matrice, int n, int m){
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {
      if(matrice[i * n + j] % 2 != 0)
        matrice[i * n + j] = 0;
    }
  }
}
 
  • Mi piace
Reazioni: sara20
Ultima modifica:
Potresti postare il file con la matrice e la funzione che utilizzi per leggerlo? Se hai veramente una linked list, posta anche le funzioni a riguardo.

A intuito, secondo me hai un array creato con malloc e stai cercando di fare una cosa di questo tipo
C:
void aggiornaMatrice(int *matrice, int n, int m){
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {
      if(matrice[i * n + j] % 2 != 0)
        matrice[i * n + j] = 0;
    }
  }
}
Il codice tutto è sopra questo è il file che uso
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nodo.h"

int main(){
  FILE *fp;

  fp = fopen("in.txt", "r");
    if(!fp) {
        perror("Errore");
        exit(0);
      
    }

  leggiFile(fp);

  fclose(fp);
  
}
Codice:
#ifndef nodo_h
#define nodo_h

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

struct nodo{
  int n1;
  int n2;
  int n3;
  struct nodo *next;
};

int **allocaMatrice(int n, int m);
void stampaMatrice(int **matrice, int n, int m);
void leggiFile(FILE *fp);
void scriviFile(FILE *fp, int **matrice, int n, int m);
struct nodo *eliminaNodi(struct nodo *lista);
void stampaLista(struct nodo *lista);
struct nodo *creaNodo(int n1, int n2, int n3);
struct nodo *inserisciInCoda(struct nodo *lista, int n1, int n2, int n3);
struct nodo *creaLista(struct nodo *lista, int **matrice, int n, int m);
void delete_r (int **matrice, int x, int *a, int b);
void aggiornaMatrice(int **matrice, int n, int m);
int somma_riga(int riga);
void scambia_righe(int prima, int seconda);
struct nodo * ordinaLista(struct nodo * lista);
void aggiornaMatrice1(int **matrice, int n, int m);
#endif /* nodo_h */

C:
void aggiornaMatrice(int **matrice, int n, int m){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      if(matrice[i][j] %2 != 0)
          matrice[i][j] = 0;
    }
  }
}
 

Allegati

  • in.txt
    164 bytes · Visualizzazioni: 5
Ok, quindi in input hai una lista di m elementi ed ogni elemento ha n=3 interi.

In output vuoi una matrice m per n dove ogni riga contiene i 3 interi dell'elemento della lista corrispondente.

Quindi la funziona aggiornaMatrice ha bisogno anche della lista come argomento:

C:
void aggiornaMatrice(struct nodo *lista, int *matrice, int n, int m){
    struct nodo *elemento = lista;
    for(int j = 0; j < m; j++) {
        matrice[n*j + 0] = elemento->n1;
        matrice[n*j + 1] = elemento->n2;
        matrice[n*j + 2] = elemento->n3;
        elemento = elemento->next;
    }
}

Spero di esserti stato di aiuto.
 
  • Mi piace
Reazioni: sara20
Ok, quindi in input hai una lista di m elementi ed ogni elemento ha n=3 interi.

In output vuoi una matrice m per n dove ogni riga contiene i 3 interi dell'elemento della lista corrispondente.

Quindi la funziona aggiornaMatrice ha bisogno anche della lista come argomento:

C:
void aggiornaMatrice(struct nodo *lista, int *matrice, int n, int m){
    struct nodo *elemento = lista;
    for(int j = 0; j < m; j++) {
        matrice[n*j + 0] = elemento->n1;
        matrice[n*j + 1] = elemento->n2;
        matrice[n*j + 2] = elemento->n3;
        elemento = elemento->next;
    }
}

Spero di esserti stato di aiuto.
siiiii, grazie milleeee :))
 
  • Mi piace
Reazioni: driverfury
mah, sembra uan semplice matrice bidimensionale.

Leggi la riga dal file, ricava i 3 numeri a,b, e c
poi
Codice:
matrice[a][b] = c;

La matrice o la crei statica con un limite, o la allochi a priori magari leggendo le linee del file, o la ingrandisci con realloc ad ogni riga letta