fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tempNo {
  5.  
  6. int valor;
  7. int coluna;
  8. struct tempNo* prox;
  9.  
  10. } NO;
  11.  
  12. typedef NO* PONT;
  13.  
  14. typedef struct {
  15.  
  16. PONT* A;
  17. int linhas;
  18. int colunas;
  19.  
  20. } MATRIZ;
  21.  
  22. void inicializaMatriz(MATRIZ* m, int linnha, int coluna) {
  23.  
  24. int i;
  25.  
  26. m->linhas = linnha;
  27. m->colunas = coluna;
  28. m->A = (PONT*) malloc(linnha*sizeof(PONT));
  29.  
  30. for (i = 0; i < linnha ; i++){
  31. m->A[i] = NULL;
  32. }
  33. }
  34.  
  35.  
  36.  
  37. int atribuirValor(MATRIZ* m, int lin, int col, int valor) {
  38.  
  39. if (lin < 0 || lin >= m->linhas || col < 0 || col >= m->colunas ) return 1;
  40.  
  41. PONT ant = NULL;
  42. PONT atual = m->A[lin];
  43.  
  44. while(atual != NULL && atual->coluna < col ){
  45. ant = atual;
  46. atual = atual->prox;
  47. }
  48.  
  49. if (atual != NULL && atual->coluna == col) {
  50. if (valor == 0) {
  51. if (ant == NULL) m->A[lin] = atual->prox;
  52. else ant->prox = atual->prox;
  53. free(atual);
  54. }
  55. else atual->valor = valor;
  56.  
  57. } else if (valor != 0){
  58. PONT novo = (PONT) malloc (sizeof(NO));
  59. novo->coluna = col;
  60. novo->valor = valor;
  61. novo->prox = atual;
  62. if (ant == NULL) m->A[lin] = novo;
  63. else ant->prox = novo;
  64. }
  65. return 0;
  66.  
  67. }
  68.  
  69.  
  70. int acessarValor(MATRIZ* m, int lin , int col) {
  71.  
  72. if (lin < 0 || lin >= m->linhas || col < 0 || col >= m->colunas ) return 0;
  73.  
  74. PONT atual = m->A[lin];
  75. while (atual != NULL && atual->coluna < col )
  76. atual = atual->prox;
  77. if (atual != NULL)
  78. return atual->valor;
  79. return 0;
  80.  
  81. }
  82.  
  83. void anexarColuna(MATRIZ* m){
  84.  
  85. int linha;
  86. for (linha = 0; linha < m->linhas ; linha++){
  87.  
  88. PONT novo = malloc (sizeof(NO));
  89. novo->valor = 0;
  90. novo->prox = NULL;
  91.  
  92. if (m->A[linha] == NULL){
  93. novo->coluna = 0;
  94. m->A[linha] = novo;
  95. }
  96. else {
  97. PONT atual = m->A[linha];
  98.  
  99. while(atual->prox != NULL){
  100. atual=atual->prox;
  101. }
  102.  
  103. novo->coluna = atual->coluna + 1;
  104. atual->prox = novo;
  105. }
  106. }
  107.  
  108. m->colunas++;
  109. }
  110.  
  111.  
  112. void anexarLinha(MATRIZ* m){
  113. m->A = realloc(m->A, (++m->linhas*sizeof(PONT)));
  114. }
  115.  
  116.  
  117.  
  118. int main()
  119. {
  120.  
  121.  
  122. MATRIZ m;
  123.  
  124. inicializaMatriz(&m, 3, 3);
  125. atribuirValor(&m, 1, 1, 10);
  126.  
  127. printf("\nEm %d %d tem o valor %d (linhas:%d , colunas:%d)", 1, 1, acessarValor(&m,1,1), m.linhas, m.colunas);
  128.  
  129. anexarLinha(&m);
  130.  
  131. atribuirValor(&m, 3, 1, 15);
  132. printf("\nEm %d %d tem o valor %d (linhas:%d , colunas:%d)", 3, 1, acessarValor(&m,3,1),m.linhas, m.colunas);
  133.  
  134. anexarColuna(&m);
  135. anexarColuna(&m);
  136. anexarColuna(&m);
  137.  
  138. atribuirValor(&m, 1, 5, 20);
  139. printf("\nEm %d %d tem o valor %d (linhas:%d , colunas:%d)", 1, 5, acessarValor(&m,1,5),m.linhas, m.colunas);
  140.  
  141.  
  142. return 0;
  143. }
  144.  
  145.  
Success #stdin #stdout 0s 9416KB
stdin
Standard input is empty
stdout
Em 1 1 tem o valor 10 (linhas:3 , colunas:3)
Em 3 1 tem o valor 15 (linhas:4 , colunas:3)
Em 1 5 tem o valor 20 (linhas:4 , colunas:6)