添加函数初始化矩阵时读取矩阵时出错

时间:2019-04-23 14:45:47

标签: c linked-list

我的函数将矩阵从多维数组转移到链接列表,但是当我添加一个新函数来创建矩阵并显示错误而不是第一行时

主要功能

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

新功能:

matrice_creuse* creeMat(size_t Nligne, size_t Ncol) {
    matrice_creuse *m = malloc(sizeof(matrice_creuse));
    if (m == NULL) {
        printf("error");
        return NULL;
    }
    m->Ncolonnes = Ncol;
    m->Nlignes = Nligne;
    m->liste = malloc(Nligne * sizeof(liste_ligne));
    if (m->liste == NULL) {
        printf("error");
        return NULL;
    }
    for (int i = 0; i < Nligne ; ++i) {
        m->liste[i] = NULL;
    }
    return m;
}

但是当将新函数添加到construcMat中时,函数contrucMat不会返回具有矩阵t [N] [M]的赋值器的新矩阵,contrucMat返回参数矩阵m为空

1 个答案:

答案 0 :(得分:2)

  

函数contrucMat不返回具有矩阵t [N] [M]的赋值器的新矩阵,contrucMat返回参数矩阵m Null

如果你的意思是

matrice_creuse *m = NULL;
...
construcMat(m, ..);

m 仍然为NULL,这是正常的,当您在 construcMat 中设置 m 时,您设置了局部变量,因此对上面代码中的呼叫者

一种解决方案是不要在 construcMat 的参数中给出 m ,因为这没有用,但要返回它:

matrice_creuse *m = construcMat(..);

使用

matrice_creuse * construcMat(int t[N][M], size_t Nligne, size_t Ncol) {
    matrice_creuse * m = creeMat(Nligne, Ncol);
    ...
    return m;
}

否则将配置文件更改为使用 in-out 变量:

void construcMat(matrice_creuse ** m, int t[N][M], size_t Nligne, size_t Ncol) {
    *m = creeMat(Nligne, Ncol);
    (*m)->Ncolonnes = Ncol;
    (*m)->Nlignes = Nligne;
    (*m)->liste = malloc(Nligne * sizeof(liste_ligne));

    liste_ligne * lignes = (*m)->liste;

    for (size_t i = 0; i < Nligne; i++) {
        lignes[i] = NULL;
        liste_ligne * dernier = lignes[i];
        for (size_t j = 0; j < Ncol; j++) {
            if (t[i][j] != 0) { 
                element *e = creeEle(j, t[i][j]);
                if (dernier != NULL) {
                    dernier->suiv = e;
                    dernier = dernier->suiv;
                } else {
                    dernier = e; 
                    lignes[i] = dernier;
                }
}}}}

,呼叫更改为:

matrice_creuse *m = NULL;
...
construcMat(&m, ..);

警告您在liste_ligne dernier = m->liste[i];行中错过了“ *”,我已在上面的代码中进行了纠正