📄 sparse.c
字号:
/* sparse.c 030590 */#include <stdlib.h>//#ifndef WINDOWS//#include <stdio.h>//#else#include "pfwstdio.h"//#endif#include <math.h>#include <string.h>#include "constant.h"#include "param.h"#include "sparse.h"/* ------- Global Variables ------ */BOOLEAN InputError;/* ===================== ErrorHalt ================================ */#ifdef ANSIPROTOvoid ErrorHalt(char *Msg)#elsevoid ErrorHalt(Msg)char *Msg;#endif{ fCustomPrint(stderr,"ERROR: %s\n",Msg); InputError=TRUE; /* stopExecute(ERROREXIT) */}/* ============================== TransposeMatrix ==================== */#ifdef ANSIPROTO void TransposeMatrix(SparseMatrix *Matrix)#else void TransposeMatrix(Matrix) SparseMatrix *Matrix;#endif { INDEX I,RowI,ColJ,N0; SparseMatrixElement **TempHead; /* array[1..maxN] */ SparseMatrixElement *Ptr1,*PtrR,*PtrC; /* BEGIN */#ifdef WINDOWS TempHead = new SparseMatrixElement*[Matrix->n1+1];#else TempHead = (SparseMatrixElement **) calloc(Matrix->n1+1,sizeof(SparseMatrixElement *));#endif for (I=1; I<=Matrix->n1; I++) { TempHead[I] = Matrix->RowHead[I]; Ptr1 = Matrix->RowHead[I]; while (Ptr1 != NULL) { /* WITH Ptr1^ DO BEGIN */ PtrR = Ptr1->RowNext; PtrC = Ptr1->ColNext; Ptr1->RowNext = PtrC; Ptr1->ColNext = PtrR; RowI = Ptr1->Row; ColJ = Ptr1->Col; Ptr1->Row = ColJ; Ptr1->Col = RowI; Ptr1 = PtrR; } } for (I=1; I<=Matrix->n2; I++) Matrix->RowHead[I] = Matrix->ColHead[I]; for (I=1; I<=Matrix->n2; I++) Matrix->ColHead[I] = TempHead[I]; N0 = Matrix->n1; Matrix->n1 = Matrix->n2; Matrix->n2 = N0;#ifdef WINDOWS delete[] TempHead;#else free(TempHead);#endif }/* ===================== AllocatePermutation ========================= */#ifdef ANSIPROTOstruct IntegerVector * AllocatePermutation(INDEX Size)#elsestruct IntegerVector * AllocatePermutation(Size)INDEX Size;#endif{ struct IntegerVector * Vector; int i; /* BEGIN */#ifdef WINDOWS Vector = new IntegerVector; Vector->p = new INDEX[Size+1];#else Vector = (IntegerVector *) malloc(sizeof(IntegerVector)); if (Vector == NULL) {ErrorHalt("Insufficient memory to allocate integer vector"); stopExecute(ERROREXIT);} Vector->p = (INDEX *) calloc((Size+1),sizeof(INDEX)); if (Vector->p == NULL) {ErrorHalt("Insufficient memory to allocate permutation vector"); stopExecute(ERROREXIT);}#endif Vector->N = Size; for(i=0;i<Size+1;i++) Vector->p[i]=0; return(Vector);}/* ===================== SortRowsColumns ======================= */#ifdef ANSIPROTOvoid SortRowsColumns(SparseMatrix *Matrix)#elsevoid SortRowsColumns(Matrix)SparseMatrix *Matrix;#endif{ SparseMatrixElement *TempP1; SparseMatrixElement *TempP2; int I; /* BEGIN */ for (I=1; I<=Matrix->n2; I++) Matrix->ColHead[I] = NULL; I = Matrix->n1; while (I>0) { TempP1 = Matrix->RowHead[I]; while (TempP1 != NULL) { TempP2 = TempP1->RowNext; TempP1->ColNext = Matrix->ColHead[TempP1->Col]; Matrix->ColHead[TempP1->Col] = TempP1; TempP1 = TempP2; } /* END WHILE */ I--; } /* END WHILE */ for (I=1; I<=Matrix->n1; I++) Matrix->RowHead[I] = NULL; I = Matrix->n2; while (I > 0) { TempP1 = Matrix->ColHead[I]; while (TempP1 != NULL) { TempP2 = TempP1->ColNext; TempP1->RowNext = Matrix->RowHead[TempP1->Row]; Matrix->RowHead[TempP1->Row] = TempP1; TempP1 = TempP2; } /* END WHILE */ I--; } /* END WHILE */} /* END RowSort *//* ============================ NearZero ===========================*/#ifdef ANSIPROTOBOOLEAN NearZero(ELEMENTVALUETYPE Value)#elseBOOLEAN NearZero(Value)ELEMENTVALUETYPE Value;#endif{ return(fabs(Value) < SINGULARITYZERO);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -