/* Vetores esparsos double norma (celula * v); */ #include typedef struct cel { int ind; /* ordenado pelo índice */ double val; struct cel * prox; } celula; double norma (celula *v) { double total = 0.0; celula *p = v; while (p != NULL){ total = total + p->val * p->val; p = p->prox; } return(sqrt(total)); } /* Supõe que têm a mesma dimensão. celula * soma (celula * v1, celula * v2); */ celula * soma (celula *v1, celula *v2) { celula *s = NULL, *sfim = NULL; celula *p1 = v1, *p2 = v2; while (p1 != NULL && p2 != NULL){ if (p1->ind < p2->ind){ /* insere p1 no fim da lista s */ if (s != NULL){ sfim->prox = malloc(sizeof(celula)); sfim = sfim->prox; sfim->ind = p1->ind; sfim->val = p1->val; } else{ s = sfim = malloc(sizeof(celula)); s->ind = p1->ind; s->val = p1->val; } p1 = p1->prox; } else if (p2->ind < p1->ind){ /* mesma coisa para p2 */ if (s != NULL){ sfim->prox = malloc(sizeof(celula)); sfim = sfim->prox; sfim->ind = p2->ind; sfim->val = p2->val; } else{ s = sfim = malloc(sizeof(celula)); s->ind = p2->ind; s->val = p2->val; } p2 = p2->prox; } else if (abs(p1->val + p2->val) > EPSILON){ /* erro de precisão */ if (s != NULL){ sfim->prox = malloc(sizeof(celula)); sfim = sfim->prox; sfim->ind = p1->ind; sfim->val = p1->val +p2->val; } else{ s = sfim = malloc(sizeof(celula)); s->ind = p1->ind; s->val = p1->val + p2->val; } p1 = p1->prox; p2 = p2->prox; } } if (sfim != NULL) sfim->prox = NULL; /* neste ponto um dos vetores acabou */ while (p1 != NULL){ if (s != NULL){ sfim->prox = malloc(sizeof(celula)); sfim = sfim->prox; sfim->ind = p1->ind; sfim->val = p1->val; } else{ s = sfim = malloc(sizeof(celula)); s->ind = p1->ind; s->val = p1->val; } p1 = p1->prox; } while (p2 != NULL){ if (s != NULL){ sfim->prox = malloc(sizeof(celula)); sfim = sfim->prox; sfim->ind = p2->ind; sfim->val = p2->val; } else{ s = sfim = malloc(sizeof(celula)); s->ind = p2->ind; s->val = p2->val; } p2 = p2->prox; } if (sfim != NULL) sfim->prox = NULL; return s; }