如何将保存矩阵固定到链接列表

时间:2019-04-08 09:10:40

标签: c linked-list

我想将矩阵添加到链接列表中,例如: 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 个答案:

答案 0 :(得分:1)

您仍然必须将列表放在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
            }
        }
    }
}

答案 1 :(得分:1)

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;
                 }
            }
        }
    }
}