2016-10-28 2 views
-1

Я пытаюсь создать разреженную матрицу в C, используя связанные списки. Мой профессор дал структуры file.h, список функций и то, что они должны были делать, и сказал нам «работать с ним». Чтобы возобновить все, мой код не работает, он перестает работать, когда я пытаюсь вставить элемент (вызывая ins_elem()) и возвращающий странный номер при вызове soma_elem_coluna() и soma_elem_linha().Sparse Matrix со связанными списками

Я поставил весь код ниже, но проблема действительно в пределах функций, указанных выше (и soma_const(), так как я не могу проверить это без вставки элемента).

Логики я использовал для создания матрицы, как на изображение ниже (с числами вместо символов) [1]

Не против странного набора текста, некоторые слова на португальском языке.

(С = колонка и L = строка)

это мой file.h:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define LINES 4 
#define COLUM 4 

typedef struct Node{ 
    int Val, L, C; 
    struct Node *down, *right; 
}Node; 

typedef struct{ 
    Node *L[LINES], *C[COLUM]; 
}matriz; 

void cria_matriz(matriz* m);      // creates matrix 
void ins_elem(matriz* m, int e, int l, int c);  // insert element e into lxc 
void soma_const(matriz* m, int e, int l, int c); // add value e to existing lxc 
int soma_elem_linha(matriz *m, int l);    // sums all the values in row l 
int soma_elem_coluna(matriz *m, int c);   // sums all the values in column c 
void imp(matriz *m);        // prints the matrix 

мой file.c

#include "file.h" 

void cria_matriz(matriz* m) 
{ 
    int i; 
    for(i=0;i<LINES;i++) //initializes headrows 
    { 
     m->L[i]->down = NULL; 
     m->L[i]->right = NULL; 
     m->L[i]->C = -1; 
     m->L[i]->L = -1; 
    } 
    for(i=0;i<COLUM;i++) //initializes headcolumns 
    { 
     m->C[i]->down = NULL; 
     m->C[i]->right = NULL; 
     m->C[i]->C = -1; 
     m->C[i]->L = -1; 
    } 
} 

void ins_elem(matriz *m, int e, int l, int c) 
{ 
    Node* auxLine; // move through row 
    Node* auxCol; // move through column 
    auxLine = &m->L[l]; 
    auxCol = &m->C[c]; 
    while(auxLine->right != NULL && auxLine->right->C < c) //find correct pos in row 
    { 
     auxLine = auxLine->right; 
    } 
    while(auxCol->down != NULL && auxCol->down->L < c) //find correct pos in column (error happens here) 
    { 
     auxCol = auxCol->down; 
    } 
    Node* novo = malloc(sizeof(Node)); 
    novo->Val = e; 
    novo->C = c; 
    novo->L = l; 
    novo->down = auxCol->down; 
    auxCol->down = novo; 
    novo->right = auxLine->right; 
    auxLine->right = novo; 
} 

void soma_const(matriz *m, int e, int l, int c) 
{ 
    Node* aux = &m->C[c]; 
    while(aux->down != NULL && aux->L < l) 
     aux = aux->down; 
    aux->Val+=e; 
} 

int soma_elem_coluna(matriz *m, int c) 
{ 
    int sum = 0; 
    Node* aux = &m->C[c]; 
    if(aux->down == NULL) 
     return 0; 
    while(aux->down != NULL) 
    { 
     aux = aux->down; 
     sum += aux->Val; 
    } 
    return sum; 
} 

int soma_elem_linha(matriz *m, int l) 
{ 
    int sum = 0; 
    Node* aux = &m->L[l]; 
    if(aux->right == NULL) 
     return 0; 
    while(aux->right != NULL) 
    { 
     aux = aux->right; 
     sum += aux->Val; 
    } 
    return sum; 
} 

void imp(matriz *m) 
{ 
    Node* aux; 
    int i, j; 
    for(i=0;i<LINES;i++) 
    { 
     aux = &m->L[i]; 
     for(j=0;j<COLUM;j++) 
     { 
      if(aux->C == j) 
      { 
       printf("%d ",aux->Val); 
       aux = aux->right; 
      } 
      else 
      { 
       printf("0 "); 
      } 
     } 
     printf("\n"); 
    } 
} 

мой main.c:

#include "file.h" 

int main() 
{ 
    struct matriz* M = (matriz*)malloc(sizeof(matriz)); 
    int i,e,c,l,result; 
    char str[20]; 
    for(i=0;i<5;i++) // this is temporary and another issue, how I make a while that 
    {     // only stops when user (a bot actually) presses enter? 
     scanf(" %s",str); 

     if(!strcmp(str,"cria_matriz")) 
     { 
      cria_matriz(M); 
     } 
     else if(!strcmp(str,"ins_elem")) 
     { 
      scanf("%d %d %d",&e,&l,&c); 
      ins_elem(M,e,l,c); 
     } 
     else if(!strcmp(str,"soma_const")) 
     { 
      scanf("%d %d %d",&e,&l,&c); 
      soma_const(M,e,l,c); 
     } 
     else if(!strcmp(str,"soma_elem_linha")) 
     { 
      scanf("%d",&l); 
      result = soma_elem_linha(M,l); 
      printf("%d\n",result); 
     } 
     else if(!strcmp(str,"soma_elem_coluna")) 
     { 
      scanf("%d",&c); 
      result = soma_elem_coluna(M,c); 
      printf("%d\n",result); 
     } 
     else if(!strcmp(str,"imp")) 
     { 
      imp(M); 
     } 
    } 
    return 0; 
} 
+0

Никто? Уже было 3 часа, и я до сих пор не могу это исправить ... –

+1

Это так непонятно, что не так с вашим кодом. Вы должны научиться использовать отладчик. Вы будете учиться в 10 раз быстрее. –

ответ

0

Ваши файлы не компилировались без предупреждений, так как с кодом было много указателей и других проблем. Я работал над кодом для очистки предупреждений, но я не в состоянии проверить логику - вы должны сделать это:

file.c

#include "file.h" 

void cria_matriz(matriz *m) 
{ 
    for (int i = 0; i < LINES; i++) // initializes headrows 
    { 
     m->L[i] = malloc(sizeof(Node)); 
     m->L[i]->down = NULL; 
     m->L[i]->right = NULL; 
     m->L[i]->C = -1; 
     m->L[i]->L = -1; 
     m->L[i]->Val = 0; 
    } 

    for (int i = 0; i < COLUM; i++) // initializes headcolumns 
    { 
     m->C[i] = malloc(sizeof(Node)); 
     m->C[i]->down = NULL; 
     m->C[i]->right = NULL; 
     m->C[i]->C = -1; 
     m->C[i]->L = -1; 
     m->C[i]->Val = 0; 
    } 
} 

void ins_elem(matriz *m, int e, int l, int c) 
{ 
    Node *auxLine = m->L[l]; // move through row 
    Node *auxCol = m->C[c]; // move through column 

    while (auxLine->right != NULL && auxLine->right->C < c) // find correct pos in row 
    { 
     auxLine = auxLine->right; 
    } 

    while (auxCol->down != NULL && auxCol->down->L < c) // find correct pos in column (error happens here) 
    { 
     auxCol = auxCol->down; 
    } 

    Node *novo = malloc(sizeof(*novo)); 
    novo->Val = e; 
    novo->C = c; 
    novo->L = l; 
    novo->down = auxCol->down; 

    auxCol->down = novo; 
    novo->right = auxLine->right; 
    auxLine->right = novo; 
} 

void soma_const(matriz *m, int e, int l, int c) 
{ 
    Node *aux = m->C[c]; 

    while (aux->down != NULL && aux->L < l) 
    { 
     aux = aux->down; 
    } 

    aux->Val += e; 
} 

int soma_elem_coluna(matriz *m, int c) 
{ 
    Node *aux = m->C[c]; 

    if (aux->down == NULL) { 
     return 0; 
    } 

    int sum = 0; 

    while (aux->down != NULL) 
    { 
     aux = aux->down; 
     sum += aux->Val; 
    } 

    return sum; 
} 

int soma_elem_linha(matriz *m, int l) 
{ 
    Node *aux = m->L[l]; 

    if (aux->right == NULL) { 
     return 0; 
    } 

    int sum = 0; 

    while (aux->right != NULL) 
    { 
     aux = aux->right; 
     sum += aux->Val; 
    } 

    return sum; 
} 

void imp(matriz *m) 
{ 
    for (int i = 0; i < LINES; i++) 
    { 
     Node *aux = m->L[i]; 

     for (int j = 0; j < COLUM; j++) 
     { 
      if (aux->C == j) 
      { 
       printf("%d ", aux->Val); 
       aux = aux->right; 
      } 
      else 
      { 
       printf("0 "); 
      } 
     } 

     printf("\n"); 
    } 
} 

main.c

#include "file.h" 

int main() 
{ 
    matriz *M = malloc(sizeof(*M)); 
    int e, c, l; 
    char str[32]; 

    for (int i = 0; i < 5; i++) // this is temporary and another issue, how I make a while that 
    {    // only stops when user (a bot actually) presses enter? 
     (void) scanf(" %s", str); 

     if (strcmp(str, "cria_matriz") == 0) 
     { 
      cria_matriz(M); 
     } 
     else if (strcmp(str, "ins_elem") == 0) 
     { 
      scanf("%d %d %d", &e, &l, &c); 
      ins_elem(M, e, l, c); 
     } 
     else if (strcmp(str, "soma_const") == 0) 
     { 
      (void) scanf("%d %d %d", &e, &l, &c); 
      soma_const(M, e, l, c); 
     } 
     else if (strcmp(str, "soma_elem_linha") == 0) 
     { 
      (void) scanf("%d", &l); 
      int result = soma_elem_linha(M, l); 
      printf("%d\n", result); 
     } 
     else if (strcmp(str, "soma_elem_coluna") == 0) 
     { 
      scanf("%d", &c); 
      int result = soma_elem_coluna(M, c); 
      printf("%d\n", result); 
     } 
     else if (strcmp(str,"imp") == 0) 
     { 
      imp(M); 
     } 
    } 

    free(M); 

    return 0; 
} 

Самая большая проблема в том, что вы держали сделать указатели на вещи, которые уже были указателями. Кроме того, вы инициализировали данные, которые вы фактически не выделили. Вы не инициализировали некоторые данные, которые вы впоследствии добавили. Наконец, strcmp() не является логическим, не используйте его как одно.

Смежные вопросы