Relocate Size of my structure in C?

0
typedef struct tempNo {

    int valor;
    int coluna;
    struct tempNo* prox; 

} NO;

typedef NO* PONT;

typedef struct {

    PONT* A;
    int linhas;
    int colunas;

} MATRIZ;

void inicializaMatriz(MATRIZ* m, int linnha, int coluna) {

    int i;

    m->linhas = linnha;
    m->colunas = coluna;
    m->A = (PONT*) malloc(linnha*sizeof(PONT));
    for (i = 0; i < linnha ; i++){
        m->A[i] = NULL;
    }   
}



int atribuirValor(MATRIZ* m, int lin, int col, int valor) {

    if (lin < 0 || lin >= m->linhas || col < 0 || col >= m->colunas ) return  1;

    PONT ant = NULL;
    PONT atual = m->A[lin];

    while(atual !=  NULL && atual->coluna < col ){

        ant = atual;
        atual = atual->prox;
    }

    if (atual != NULL && atual->coluna == col) {
        if (valor == 0) {
            if (ant == NULL) m->A[lin] = atual->prox;
            else ant->prox = atual->prox;
            free(atual);        
        }
        else  atual->valor = valor;  

    } else if (valor != 0){
        PONT novo = (PONT) malloc (sizeof(NO));
        novo->coluna = col;
        novo->valor = valor;
        novo->prox = atual;
        if (ant == NULL) m->A[lin] = novo;
        else ant->prox = novo;   
    }
    return 0; 

}


int acessarValor(MATRIZ* m, int lin , int col) {

    if (lin < 0 || lin >= m->linhas || col < 0 || col >= m->colunas ) return 0;

    PONT atual = m->A[lin];
    while (atual != NULL && atual->coluna < col )
        atual = atual->prox;
    if (atual != NULL && atual->coluna == col)
        return atual->valor; 
    return 0;

}

void anxexarColuna(MATRIZ* m){

    int i = m->colunas;
    i = i + 1;
    m->colunas = i;
}


void anexarLinha(MATRIZ* m){

    int i = m->linhas;
    i = i + 1;


}
    
asked by anonymous 16.09.2017 / 17:53

1 answer

0

Although your doubt is not very clear I chose to answer it, even to try to help in some points of logic that do not seem to me to be correct.

I begin by stating that you have several small misspellings that you must correct so that the code is as readable as possible.

Examples taken from the code:

  • anxexarColuna
  • linnha

Turning now to the implementation of the attach functions.

Attach Line

The MATRIZ stores an array of rows (in the A field), so adding a row is increasing this array.

This makes this line attach function easier because you just need a reallocation of the array of lines with the realloc and increase the value of the lines in the structure:

void anexarLinha(MATRIZ* m){
    m->A = realloc(m->A, (++m->linhas*sizeof(PONT)));
}

The realloc works in everything similar to malloc and we are guaranteed that the content of the array is preserved even if it is repositioned in memory.

Append Column

The logic behind the implementation of this is different because there is no array of columns. The columns are each of the nodes of the rows, so reallocating the array will not make sense.

Instead we should go through each line and add a new node at the end of each one, which in itself will represent a new column.

void anexarColuna(MATRIZ* m){

    int linha;
    //percorrer todas as linhas para que crie um novo nó em cada
    for (linha = 0; linha < m->linhas ; linha++){

        //criar o novo nó da linha que representa a nova coluna
        PONT novo = malloc (sizeof(NO)); 
        novo->valor = 0;
        novo->prox = NULL;

        if (m->A[linha] == NULL){ //se a linha não tem nada atribui diretamente no array
            novo->coluna = 0; //coluna 0 pois é o primeiro nó da linha
            m->A[linha] = novo;
        }
        else { //a linha já tem nós por isso adiciona ao fim
            PONT atual = m->A[linha];

            while(atual->prox != NULL){
                atual=atual->prox;
            }

            novo->coluna = atual->coluna + 1; //atribuir a coluna correta ao nó
            atual->prox = novo;
        }
    }

    m->colunas++; //aumentar o tamanho das colunas na MATRIZ
}

Example working with these attachments in Ideone

    
17.09.2017 / 19:28