Как исправить сохранение матрицы в связанный список - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу добавить матрицу в связанный список, например: exemple Но мой код не может сохранить матрицу, и при печати matix, Все это 0

Мой код:

void construcMat(matrice_creuse *m, int t[N][M], size_t Nlign, size_t Ncol) {
    m->Ncolonnes = Ncol;
    m->Nlignes = Nlign;
    m->liste = malloc(Nlign * sizeof(liste_ligne));
    for(size_t i = 0; i < Nlign; i++) {
        m->liste[i] = NULL;
        element* dernier = m->liste[i];
        for (size_t j = 0; j < Ncol; j++) {
            if (t[i][j] != 0) { 
                element* e = malloc(sizeof(element)); 
                e->col = j;
                e->val = t[i][j];
                e->suiv = NULL;
                if (dernier != NULL) 
                    dernier->suiv  = e; 
                else // Sinon
                    dernier = e; 
                dernier = dernier->suiv; 
            }
        }
    }
}

основной код:

int mat[4][5] = {{0, 1, 0, 2, 0}, {0, 0, 0, 5, 4}, {1, 0, 0, 0, 5}, {0, 0, 0, 0, 0}};
    matrice_creuse m1;
    construcMat(&m1, mat, 4, 5);

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

dernier - это еще один указатель, изначально он указывает на то же место, куда указывает m->liste[i].

С нижней строкой вы заставляете dernier указывать на другое местоположение, и m->liste[i] не указывает на новое местоположение.

dernier = e;

Иметь dernier в качестве указателя на указатель.

void construcMat(matrice_creuse *m, int t[N][M], size_t Nlign, size_t Ncol) {
    m->Ncolonnes = Ncol;
    m->Nlignes = Nlign;
    m->liste = malloc(Nlign * sizeof(liste_ligne));
    for(size_t i = 0; i < Nlign; i++) {
        m->liste[i] = NULL;
        element** dernier = &m->liste[i];
        for (size_t j = 0; j < Ncol; j++) {
            if (t[i][j] != 0) { 
                element* e = malloc(sizeof(element)); 
                e->col = j;
                e->val = t[i][j];
                e->suiv = NULL;
                if ((*dernier) != NULL) 
                    (*dernier)->suiv  = e; 
                else // Sinon
                    (*dernier) = e; 
                dernier = &(*dernier)->suiv; 
            }
        }
    }
}

Обновление: Без использования указателя на указатель.

void construcMat(matrice_creuse *m, int t[N][M], size_t Nlign, size_t Ncol) {
    m->Ncolonnes = Ncol;
    m->Nlignes = Nlign;
    m->liste = malloc(Nlign * sizeof(liste_ligne));
    for(size_t i = 0; i < Nlign; i++) {
        m->liste[i] = NULL;
        element* dernier = m->liste[i];
        for (size_t j = 0; j < Ncol; j++) {
            if (t[i][j] != 0) { 
                element* e = malloc(sizeof(element)); 
                e->col = j;
                e->val = t[i][j];
                e->suiv = NULL;
                if (dernier != NULL) {
                    dernier->suiv  = e;
                    dernier = dernier->suiv;
                 }                  
                else {// Sinon
                    dernier = e; 
                    m->liste[i] = dernier;
                 }
            }
        }
    }
}
1 голос
/ 08 апреля 2019

Вы все еще должны поместить список в m->liste[i]. Вы можете сделать это с помощью двойного указателя; см. ниже:

void construcMat(matrice_creuse *m, int t[N][M], size_t Nlign, size_t Ncol) {
    m->Ncolonnes = Ncol;
    m->Nlignes = Nlign;
    m->liste = malloc(Nlign * sizeof(liste_ligne));
    for(size_t i = 0; i < Nlign; i++) {
        m->liste[i] = NULL;
        element **dernier = &m->liste[i];       // use a double indirection
        for (size_t j = 0; j < Ncol; j++) {
            if (t[i][j] != 0) { 
                element* e = malloc(sizeof(element)); 
                e->col = j;
                e->val = t[i][j];
                e->suiv = NULL;

                *dernier= e;        // assign it..
                dernier= &e->suiv;  //..and advance
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...