因此,我必须编写一个适用于稀疏矩阵的程序,我有很多头指针和指针数组。
构建此代码时,它不会返回任何错误,但是当我实际使用该程序时,它说堆已损坏。我不知道该怎么办
P.S对于难以理解的注释感到抱歉,我的母语是塞尔维亚语,所以我只用它来注释大学项目的代码。
#include <stdio.h>
#include <stdlib.h>
#define maxR 10
#define maxC 10
#define maxE 10
typedef struct node
{
int val;
int row;
int col;
struct node *nextD;
struct node *nextR;
} element;
typedef struct matrix
{
element *row[maxR];
element *col[maxC];
}matrix;
int main() {
int Row; //redni broj reda
int Col;//redni broj kolone
int Val; //vrednost
int e;// broj nepodrazumevanih elemenata
int r; //broj redova
int c; // broj kolona
int i; // brojac redova
int j; //brojac kolona
int userInput; //korisnikov izbor u meniju
int podrazumevani;
int x, y;
int X;
int n_of_elements = 0; //broj nepodrazumevanih elemenata u listi
element* novi;
element *trenutni;
trenutni = NULL;
matrix* M = malloc(sizeof(matrix));
for (i = 0; i < maxR; i++)
{
M->row[i] = NULL;
}
for (i = 0; i < maxR; i++)
{
if (M->row[i] == NULL)
{
printf("NULLR\n");
};
}
for (j = 0; j < maxC; j++)
{
M->col[j] = NULL;
}
while (1)
{
printf(
"1. Ucitavanje matrice sa nepodrazumevanim vrednostima\n"
"2. Postavljanje podrazumevanih vrednosti\n" //ucitavanje sa ulaza
"3. Dohvatanje zadatog elementa\n" //prolazenje kroz listu i ispisivanje na ekran Note to self: u zavisnosti da li je efikasnije ici po kolonama ili redovima
"4. Postaviti vrednost zadatom elementu\n" //ucitavanje koordinata elemenata i prolazak kroz listu, menjanje vrednosti elementa
"5. Ispisivanje broja nepodrazumevanih elemenata\n" // prolazi se kroz matricu i inkrementira brojac ako je element razlicit od nule
"6. Ispis cele matrice\n"
"7. Brisanje matrice\n" // radi se pomocu free funkcije
"0. Izlaz iz programa\n");
scanf_s("%d", &userInput);
switch (userInput)
{
case 0:
exit(1);
case 1:
printf("Unesite broj redova matrice: \n");
scanf_s("%d", &r);
if ((r > maxR) || (r < 0))
{
printf("Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, pokusajte ponovo: \n");
scanf_s("%d", &r);
}
printf("Unesite broj kolona matrice: \n");
scanf_s("%d", &c);
if ((c > maxC) || (c < 0))
{
printf("Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, pokusajte ponovo: \n");
scanf_s("%d", &c);
}
printf("Unesite broj nepodrazumevanih elemnata matrice: \n");
scanf_s("%d", &e);
if ((e > maxE) || (e < 0) || (e > (0.1*r*c)))
{
printf(
"Uneli ste veci broj od maksimuma (10) ili ste uneli negativan, "
"ili veci broj nego sto je uslovljen unetim r i c vrednostima, 10 procenata od r*c, pokusajte ponovo: \n"
);
scanf_s("%d", &e);
}
for (int x = 0; x < e; x++) //petlja koja kontrolise broj cvorova
{
printf("Unesite redni broj vrste: \n");
scanf_s("%d", &Row);
printf("Unesite redni broj kolone: \n");
scanf_s("%d", &Col);
printf("Unesite element matrice veci od nule: \n");
scanf_s("%d", &Val);
novi = malloc(sizeof(novi));
novi->row = Row;
novi->col = Col;
novi->val = Val;
novi->nextR = NULL;
novi->nextD = NULL;
//kreiranje R niza
for (i = 0; i < r; i++)
{
if (i == (Row - 1)) //ako se indeks niza poklapa sa unetom vrednoscu onda se prelazi na upis
{
//element* trenutni = novi;
if (M->row[i] == NULL)
{
M->row[i] = novi;
}
else
trenutni->nextR = novi;
trenutni = novi;
}
// lista ce morati da se sortira po rastucoj vrednosti u Col
}
/*for (j = 0; j < c; j++)
{
if (j == Col - 1)
{
}
}
*/
}
for (i = 0; i < r; i++)
{
if (M->row[i] != NULL)
{
element* temp = NULL;
temp = M->row[i];
while (temp)
{
printf("%d->", temp->val);
temp = temp->nextR;
}
}
else printf("NULL\n");
}
break;
case 2:
printf("Unesite podrazumevani element, pozeljno 0: \n");
scanf_s("%d", &podrazumevani);
break;
case 3:
printf("Unesite koordinate elementa koji zelite da prikazete na ekranu (x za vrstu, y za kolonu): \n");
scanf_s("%d", &x);
scanf_s("%d", &y);
break;
case 4:
printf("Unesite koordinate i vrednost elementa koji zelite da azurirate prikazete na ekranu (x za vrstu, y za kolonu): \n");
scanf_s("%d", &x);
scanf_s("%d", &y);
scanf_s("%d", &X);
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}
}