我想将矩阵添加到链接列表中,例如:
但是我的代码无法保存矩阵,并且在打印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);
答案 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;
}
}
}
}
}