int main(int argc, char *argv[]) { int i, element; node *myList, *copyList1, *copyList2, *sortedList; i = 0; while(i < 10) { scanf("%d", &element); myList = add(myList, element); copyList1 = myCopy(myList); copyList2 = myCopy(myList); sortedList = quickSortMain(copyList1); freeList(sortedList); treeMain(copyList2); freeList(sortedList); i = i + 1; } freeList(myList); freeList(copyList1); freeList(copyList2); return 0; /*node *list = add(add(add(add(add(NULL, 3), 6), 9), 2), 0); list = quickSortMain(list); freeList(list); list = add(add(add(add(add(NULL, 3), 6), 9), 2), 0); treeMain(list); freeList(list); return EXIT_SUCCESS;*/ }
void Decode_mime_string(char *txt, unsigned int max_size) { // decode string containing 0 or more MIME-encoded parts; no newlines // overwrite input, but it should be at most max_size // decoded string will be smaller (at most equal) // charset conversion can make it bigger int i; char charset[40]; // charset name char enc[76]; // encoded text regmatch_t pm[10]; // buffer for matching substrings // try to decode Qouted-Printable parts while (!regexec(&r_qp, txt, 10, pm, 0)) { i=pm[2].rm_eo - pm[2].rm_so + 1; myCopy(charset, txt+pm[2].rm_so, (i>40)?40:i); i=pm[3].rm_eo - pm[3].rm_so + 1; myCopy(enc, txt+pm[3].rm_so, (i>76)?76:i); Decode_QuotedPrint(enc,charset); replaceStr(txt,pm[1].rm_so,pm[1].rm_eo-1,enc); } // try to decode Base64 parts while (!regexec(&r_base64, txt, 10, pm, 0)) { i=pm[2].rm_eo - pm[2].rm_so + 1; myCopy(charset, txt+pm[2].rm_so, (i>40)?40:i); i=pm[3].rm_eo - pm[3].rm_so + 1; myCopy(enc, txt+pm[3].rm_so, (i>76)?76:i); Decode_base64(enc,charset); replaceStr(txt,pm[1].rm_so,pm[1].rm_eo-1,enc); } }
void removeRepeat(char*s) { //原址去掉空格 int i = 0,count=0,start,end,len; for (i = 0; s[i] != '\0'; i++) { if (s[i] == ' ') { count = 0; start = i; end = start+1; len = strlen(s); while (s[end] == ' ') { count++; end++; } //end = start; //memcpy(s + start+1, s + end, (len - end)*sizeof(char)); myCopy(s + start+1, s + end, (len - end)*sizeof(char)); s[len - count] = '\0'; } } //return s; }
int main(int argc, char **argv) { char *line; char *lineArr[1024]; int len; int max; int i = 0; int lineNum = 0; line = malloc(sizeof(char) * MAXLINE); max = 0; while ((len = myGetline(line, max == 0 ? MAXLINE : max)) > 0 && i < 1024 - 1){ if (len > max){ max = len; } if (len > MAXLIMIT){ lineArr[i] = realloc(lineArr[i], max); myCopy(lineArr[i], line); i++; } } lineNum = i; for (i = 0; i < lineNum; i++){ printf("%s\n", lineArr[i]); } for (i = 0; i < lineNum; i++){ free(lineArr[i]); } free(line); return 0; }
node* myCopy(node* src) { if(src == NULL) { return NULL; } return concatList(add(NULL, src->data), myCopy(src->next)); }
void replaceStr(char *input, int so, int eo, char *repl) { // replace part of input from index so to eo with repl // repl should be smaller than eo-so+1! // max. length of remainder of input is 256! char tmp[256]; int l; myCopy(tmp,input+eo+1,256); // put remainder of input to tmp l=strlen(repl); strncpy(input+so,repl,l); // put repl to right place (no \0 after) strcpy(input+so+l,tmp); // it should fit }
void Decode_QuotedPrint(char *encoded, char *charset) { // decode quoted-printable encoded-word // copy result to input -- its length will be smaller or equal, so it's safe regmatch_t pm[10]; // buffer for matching substrings char hex[4]; char *tmp; int ihex; // change underscore to space [RFC-1522 4.2.(2)] for (tmp=encoded; *tmp!='\0'; tmp++) if (*tmp=='_') *tmp=' '; while (!regexec(&r_hex, encoded, 10, pm, 0)) { myCopy(hex,encoded+pm[1].rm_so+1,3); ihex=strtol(hex,NULL,16); hex[0]=ihex; hex[1]='\0'; replaceStr(encoded,pm[1].rm_so,pm[1].rm_eo-1,hex); } }
int BandArpackSolver::solve(int numModes, bool generalized, bool findSmallest) { if (generalized == false) { opserr << "BandArpackSolver::solve(int numMode, bool generalized) - only solves generalized problem\n"; return -1; } if (theSOE == 0) { opserr << "WARNING BandGenLinLapackSolver::solve(void)- "; opserr << " No LinearSOE object has been set\n"; return -1; } int n = theSOE->size; // check iPiv is large enough if (iPivSize < n) { opserr << "WARNING BandGenLinLapackSolver::solve(void)- "; opserr << " iPiv not large enough - has setSize() been called?\n"; return -1; } // set some variables int kl = theSOE->numSubD; int ku = theSOE->numSuperD; int ldA = 2*kl + ku +1; int nrhs = 1; int ldB = n; int info; double *Aptr = theSOE->A; int *iPIV = iPiv; int nev = numModes;; int ncv = getNCV(n, nev); // set up the space for ARPACK functions. // this is done each time method is called!! .. this needs to be cleaned up int ldv = n; int lworkl = ncv*ncv + 8*ncv; double *v = new double[ldv * ncv]; double *workl = new double[lworkl + 1]; double *workd = new double[3 * n + 1]; double *d = new double[nev]; double *z= new double[n * nev]; double *resid = new double[n]; int *iparam = new int[11]; int *ipntr = new int[11]; logical *select = new logical[ncv]; static char which[3]; if (findSmallest == true) { strcpy(which, "LM"); } else { strcpy(which, "SM"); } char bmat = 'G'; char howmy = 'A'; // some more variables int maxitr, mode; double tol = 0.0; info = 0; maxitr = 1000; mode = 3; iparam[0] = 1; iparam[2] = maxitr; iparam[6] = mode; bool rvec = true; int ido = 0; int ierr = 0; // Do the factorization of Matrix (A-dM) here. #ifdef _WIN32 DGBTRF(&n, &n, &kl, &ku, Aptr, &ldA, iPiv, &ierr); #else dgbtrf_(&n, &n, &kl, &ku, Aptr, &ldA, iPiv, &ierr); #endif if ( ierr != 0 ) { opserr << " BandArpackSolver::Error in dgbtrf_ " << endln; return -1; } while (1) { #ifdef _WIN32 unsigned int sizeWhich =2; unsigned int sizeBmat =1; unsigned int sizeHowmany =1; unsigned int sizeOne = 1; /* DSAUPD(&ido, &bmat, &sizeBmat, &n, which, &sizeWhich, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); */ DSAUPD(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #else dsaupd_(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #endif if (ido == -1) { myMv(n, &workd[ipntr[0]-1], &workd[ipntr[1]-1]); #ifdef _WIN32 /* DGBTRS("N", &sizeOne, &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); */ DGBTRS("N", &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); #else dgbtrs_("N", &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); #endif if (ierr != 0) { opserr << "BandArpackSolver::Error with dgbtrs_ 1" <<endln; exit(0); } continue; } else if (ido == 1) { // double ratio = 1.0; myCopy(n, &workd[ipntr[2]-1], &workd[ipntr[1]-1]); #ifdef _WIN32 /* DGBTRS("N", &sizeOne, &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); */ DGBTRS("N", &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); #else dgbtrs_("N", &n, &kl, &ku, &nrhs, Aptr, &ldA, iPIV, &workd[ipntr[1] - 1], &ldB, &ierr); #endif if (ierr != 0) { opserr << "BandArpackSolver::Error with dgbtrs_ 2" <<endln; exit(0); } continue; } else if (ido == 2) { myMv(n, &workd[ipntr[0]-1], &workd[ipntr[1]-1]); continue; } break; } if (info < 0) { opserr << "BandArpackSolver::Error with _saupd info = " << info << endln; switch(info) { case -1: opserr << "N must be positive.\n"; break; case -2: opserr << "NEV must be positive.\n"; break; case -3: opserr << "NCV must be greater than NEV and less than or equal to N.\n"; break; case -4: opserr << "The maximum number of Arnoldi update iterations allowed"; break; case -5: opserr << "WHICH must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'.\n"; break; case -6: opserr << "BMAT must be one of 'I' or 'G'.\n"; break; case -7: opserr << "Length of private work array WORKL is not sufficient.\n"; break; case -8: opserr << "Error return from trid. eigenvalue calculation"; opserr << "Informatinal error from LAPACK routine dsteqr.\n"; break; case -9: opserr << "Starting vector is zero.\n"; break; case -10: opserr << "IPARAM(7) must be 1,2,3,4,5.\n"; break; case -11: opserr << "IPARAM(7) = 1 and BMAT = 'G' are incompatable.\n"; break; case -12: opserr << "IPARAM(1) must be equal to 0 or 1.\n"; break; case -13: opserr << "NEV and WHICH = 'BE' are incompatable.\n"; break; case -9999: opserr << "Could not build an Arnoldi factorization."; opserr << "IPARAM(5) returns the size of the current Arnoldi\n"; opserr << "factorization. The user is advised to check that"; opserr << "enough workspace and array storage has been allocated.\n"; break; default: opserr << "unrecognised return value\n"; } // clean up the memory delete [] workl; delete [] workd; delete [] resid; delete [] iparam; delete [] v; delete [] select; delete [] ipntr; delete [] d; delete [] z; value = 0; eigenvector = 0; return info; } else { if (info == 1) { opserr << "BandArpackSolver::Maximum number of iteration reached." << endln; } else if (info == 3) { opserr << "BandArpackSolver::No Shifts could be applied during implicit,"; opserr << "Arnoldi update, try increasing NCV." << endln; } double sigma = theSOE->shift; if (iparam[4] > 0) { rvec = true; n = theSOE->size; ldv = n; #ifdef _WIN32 unsigned int sizeWhich =2; unsigned int sizeBmat =1; unsigned int sizeHowmany =1; /* DSEUPD(&rvec, &howmy, &sizeHowmany, select, d, z, &ldv, &sigma, &bmat, &sizeBmat, &n, which, &sizeWhich, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); */ DSEUPD(&rvec, &howmy, select, d, z, &ldv, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #else dseupd_(&rvec, &howmy, select, d, z, &ldv, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #endif if (info != 0) { opserr << "BandArpackSolver::Error with dseupd_" << info; switch(info) { case -1: opserr << " N must be positive.\n"; break; case -2: opserr << " NEV must be positive.\n"; break; case -3: opserr << " NCV must be greater than NEV and less than or equal to N.\n"; break; case -5: opserr << " WHICH must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'.\n"; break; case -6: opserr << " BMAT must be one of 'I' or 'G'.\n"; break; case -7: opserr << " Length of private work WORKL array is not sufficient.\n"; break; case -8: opserr << " Error return from trid. eigenvalue calculation"; opserr << "Information error from LAPACK routine dsteqr.\n"; break; case -9: opserr << " Starting vector is zero.\n"; break; case -10: opserr << " IPARAM(7) must be 1,2,3,4,5.\n"; break; case -11: opserr << " IPARAM(7) = 1 and BMAT = 'G' are incompatibl\n"; break; case -12: opserr << " NEV and WHICH = 'BE' are incompatible.\n"; break; case -14: opserr << " DSAUPD did not find any eigenvalues to sufficient accuracy.\n"; break; case -15: opserr << " HOWMNY must be one of 'A' or 'S' if RVEC = .true.\n"; break; case -16: opserr << " HOWMNY = 'S' not yet implemented\n"; break; default: ; } // clean up the memory delete [] workl; delete [] workd; delete [] resid; delete [] iparam; delete [] v; delete [] select; delete [] ipntr; delete [] d; delete [] z; value = 0; eigenvector = 0; return info; } } } value = d; eigenvector = z; theSOE->factored = true; // clean up the memory delete [] workl; delete [] workd; delete [] resid; delete [] iparam; delete [] v; delete [] select; delete [] ipntr; return 0; }
int ArpackSolver::solve(int numModes, bool generalized) { if (generalized == false) { opserr << "ArpackSolver::solve() - at moment only solves generalized problem\n"; return -1; } theSOE = theArpackSOE->theSOE; if (theSOE == 0) { opserr << "ArpackSolver::setSize() - no LinearSOE set\n"; return -1; } // set up the space for ARPACK functions. // this is done each time method is called!! .. this needs to be cleaned up int n = size; int nev = numModes; int ncv = getNCV(n, nev); int ldv = n; int lworkl = ncv*ncv + 8*ncv; int processID = theArpackSOE->processID; // set up the space for ARPACK functions. // this is done each time method is called!! .. this needs to be cleaned up if (numModes > numModesMax) { if (v != 0) delete [] v; if (workl != 0) delete [] workl; if (workd != 0) delete [] workd; if (eigenvalues != 0) delete [] eigenvalues; if (eigenvectors != 0) delete [] eigenvectors; if (resid != 0) delete [] resid; if (select != 0) delete [] select; v = new double[ldv * ncv]; workl = new double[lworkl + 1]; workd = new double[3 * n + 1]; eigenvalues = new double[nev]; eigenvectors = new double[n * nev]; resid = new double[n]; select = new logical[ncv]; for (int i=0; i<lworkl+1; i++) workl[i] = 0; for (int i=0; i<3*n+1; i++) workd[i] = 0; for (int i=0; i<ldv*ncv; i++) v[i] = 0; numModesMax = numModes; } static char which[3]; strcpy(which, "LM"); char bmat = 'G'; char howmy = 'A'; // some more variables double tol = 0.0; int info = 0; int maxitr = 1000; int mode = 3; iparam[0] = 1; iparam[2] = maxitr; iparam[6] = mode; bool rvec = true; int ido = 0; int ierr = 0; while (1) { #ifdef _WIN32 unsigned int sizeWhich =2; unsigned int sizeBmat =1; unsigned int sizeHowmany =1; unsigned int sizeOne = 1; DSAUPD(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #else dsaupd_(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #endif if (ido == -1) { myMv(n, &workd[ipntr[0]-1], &workd[ipntr[1]-1]); theVector.setData(&workd[ipntr[1] - 1], size); theSOE->setB(theVector); ierr = theSOE->solve(); const Vector &X = theSOE->getX(); theVector = X; continue; } else if (ido == 1) { // double ratio = 1.0; myCopy(n, &workd[ipntr[2]-1], &workd[ipntr[1]-1]); theVector.setData(&workd[ipntr[1] - 1], size); if (processID > 0) theSOE->zeroB(); else theSOE->setB(theVector); theSOE->solve(); const Vector &X = theSOE->getX(); theVector = X; // theVector.setData(&workd[ipntr[1] - 1], size); continue; } else if (ido == 2) { myMv(n, &workd[ipntr[0]-1], &workd[ipntr[1]-1]); continue; } break; } if (info < 0) { opserr << "ArpackSolver::Error with _saupd info = " << info << endln; switch(info) { case -1: opserr << "N must be positive.\n"; break; case -2: opserr << "NEV must be positive.\n"; break; case -3: opserr << "NCV must be greater than NEV and less than or equal to N.\n"; break; case -4: opserr << "The maximum number of Arnoldi update iterations allowed"; break; case -5: opserr << "WHICH must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'.\n"; break; case -6: opserr << "BMAT must be one of 'I' or 'G'.\n"; break; case -7: opserr << "Length of private work array WORKL is not sufficient.\n"; break; case -8: opserr << "Error return from trid. eigenvalue calculation"; opserr << "Informatinal error from LAPACK routine dsteqr.\n"; break; case -9: opserr << "Starting vector is zero.\n"; break; case -10: opserr << "IPARAM(7) must be 1,2,3,4,5.\n"; break; case -11: opserr << "IPARAM(7) = 1 and BMAT = 'G' are incompatable.\n"; break; case -12: opserr << "IPARAM(1) must be equal to 0 or 1.\n"; break; case -13: opserr << "NEV and WHICH = 'BE' are incompatable.\n"; break; case -9999: opserr << "Could not build an Arnoldi factorization."; opserr << "IPARAM(5) the size of the current Arnoldi factorization: is "; opserr << iparam[4]; opserr << "factorization. The user is advised to check that"; opserr << "enough workspace and array storage has been allocated.\n"; break; default: opserr << "unrecognised return value\n"; } eigenvalues = 0; eigenvectors = 0; return info; } else { if (info == 1) { opserr << "ArpackSolver::Maximum number of iteration reached." << endln; } else if (info == 3) { opserr << "ArpackSolver::No Shifts could be applied during implicit,"; opserr << "Arnoldi update, try increasing NCV." << endln; } double sigma = shift; if (iparam[4] > 0) { rvec = true; n = size; ldv = n; #ifdef _WIN32 unsigned int sizeWhich =2; unsigned int sizeBmat =1; unsigned int sizeHowmany =1; DSEUPD(&rvec, &howmy, select, eigenvalues, eigenvectors, &ldv, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #else dseupd_(&rvec, &howmy, select, eigenvalues, eigenvectors, &ldv, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info); #endif if (info != 0) { opserr << "ArpackSolver::Error with dseupd_" << info; switch(info) { case -1: opserr << " N must be positive.\n"; break; case -2: opserr << " NEV must be positive.\n"; break; case -3: opserr << " NCV must be greater than NEV and less than or equal to N.\n"; break; case -5: opserr << " WHICH must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'.\n"; break; case -6: opserr << " BMAT must be one of 'I' or 'G'.\n"; break; case -7: opserr << " Length of private work WORKL array is not sufficient.\n"; break; case -8: opserr << " Error return from trid. eigenvalue calculation"; opserr << "Information error from LAPACK routine dsteqr.\n"; break; case -9: opserr << " Starting vector is zero.\n"; break; case -10: opserr << " IPARAM(7) must be 1,2,3,4,5.\n"; break; case -11: opserr << " IPARAM(7) = 1 and BMAT = 'G' are incompatibl\n"; break; case -12: opserr << " NEV and WHICH = 'BE' are incompatible.\n"; break; case -14: opserr << " DSAUPD did not find any eigenvalues to sufficient accuracy.\n"; break; case -15: opserr << " HOWMNY must be one of 'A' or 'S' if RVEC = .true.\n"; break; case -16: opserr << " HOWMNY = 'S' not yet implemented\n"; break; default: ; } return info; } } } numMode = numModes; // clean up the memory return 0; }
void reverseWords(char *s) { int len = strlen(s); if(len>150) return; int i = 0; char sep = ' '; for (i = 0; i < len - 1; i++) { if ((!in(s[i]))&&s[i]!=sep) { s[i] = sep; } } len = strlen(s); //printf("%s===%d\n", s, len); removeRepeat(s); //原址去掉重复的字符串 len = strlen(s); //printf("%s===%d\n", s, len); //去掉第一个空格 if (s[0] == sep) { //memcpy(s,s+1,(len-1)*sizeof(char)); myCopy(s,s+1,(len-1)*sizeof(char)); s[len - 1] = '\0'; } len = strlen(s); //更新字符串的长度 //printf("%s===%d\n", s, len); //去掉最后的空格 if (len <= 0) return; if (s[len - 1] == sep) { s[len - 1] = '\0'; } len = strlen(s); char mark; int flag = false; if (!in(s[len - 1])) { flag = true; mark = s[len - 1]; s[len - 1] = '\0'; } len = strlen(s); //printf("%s===%d\n",s,len); int maxSize = 100; char *str = (char*)malloc(maxSize * sizeof(char)); int ps = 0; int pe = 0; str[0] = sep; int range = 0;//记录单词的长度 int count = 0; for (i = 0; i < len; ) { range = 0; //while (s[ps] != sep) while (s[ps] != sep&&s[ps] != '\0') { ps++; range++; } //ps 一直是0 if (s[ps] == '\0') { break; } //memcpy(str+1,s,(range)*sizeof(char)); myCopy(str+1,s,(range)*sizeof(char)); //第一个位置被空白占了 pe = count + range + 1; if ((len - pe) <= 0) { break; } //memcpy(s,s+ps+1,(len-pe)*sizeof(char));//因为多了一个空格 myCopy (s,s+ps+1,(len-pe)*sizeof(char));//因为多了一个空格 //memcpy(s+len-pe,str,(range+1)*sizeof(char)); myCopy(s+len-pe,str,(range+1)*sizeof(char)); count += range + 1; ps=0; i += range+1; } len = strlen(s); //去掉第一个空格 if (s[0] == sep) { //memcpy(s, s + 1, (len - 1)*sizeof(char)); myCopy(s, s + 1, (len - 1)*sizeof(char)); s[len - 1] = '\0'; } len = strlen(s); //更新字符串的长度 //printf("%s===%d\n", s, len); if (flag) { s[len] = mark; s[len + 1] = '\0'; } //printf("%s===%d\n", s, len); }