void TheMinAndTheMax(IntNode *theList) { int a, min; int j = 0; int InMin = 0; int InMax = 0; int RemovedAtIndex = 0; a = CountList(theList); for (int j = 0; j < a; j++) { IntNode *TheMinNode = NodeAtIndex(theList, InMin); min = NodeAtIndex(theList, InMin)->value; for (int k = InMin; k < a; k++) { if (min >= TheMinNode->value) { min = TheMinNode->value; RemovedAtIndex = k; } TheMinNode = TheMinNode->nextNode; } InsertNode(theList, RemovedNode(theList, RemovedAtIndex), InMin); InMin++; } printf("Edited list\n\n"); doPrintList(theList); }
void doPrintList(IntList *aList) { for (int i = 0; i < CountList(aList); i++) { IntNode *theNode = NodeAtIndex(aList, i); if (NULL != theNode) { printf("node[%d].value = %d\n", i, theNode->value); } } }
void doPrintList(IntList *aList) { for (int i = 0; i < CountList(aList); i++) { IntNode *theNode = NodeAtIndex(aList, i); if (NULL != theNode) { printf("node[%d].Word = %s\n", i, theNode->CharWord); } } }
void main() { cur *Cur = NULL; node *Node = NULL; InitList(&Node, &Cur); InsertNode(&Node, &Cur, 0, rand()); InsertNode(&Node, &Cur, 1, rand()); InsertNode(&Node, &Cur, 2, rand()); DeleteNode(&Node, &Cur, 1); DeleteNode(&Node, &Cur, CountList(&Node, &Cur)); DeleteNode(&Node, &Cur, 0); ShowList(&Node, &Cur); ReleaseList(&Node, &Cur); }
boolean MemberList(pointer object, List l) /* 10/Nov/92 */ { pointer scanobj; ListElem *TempCurrList=l->C; int i,n; if(l->hash) return MemberHash(object, l); TailList(l); n=CountList(l); for(i=0;i<n;i++) { NextList(&scanobj, l); if(EqualObject(object, scanobj, l)) { if(!PrevList(&scanobj, l)) HeadList(l); /* Take a step back for */ return TRUE; /* right CurrList */ } } l->C=TempCurrList; return FALSE; }
main(int argc, char *argv[]) { char buf[80]; Point3 **v; Point3 *BaseV; int *usedpoint; List T=NULL_LIST, Q=NULL_LIST; int n,i=1; FILE *fp=stdout; double sec; SetProgramName("DeWall"); if((argc<2) || (strcmp(argv[i],"/?")==0)|| (strcmp(argv[i],"-?")==0)|| (strcmp(argv[i],"/h")==0)|| (strcmp(argv[i],"-h")==0) ) Error(USAGE_MESSAGE, EXIT); while(*argv[i]=='-') { switch(argv[i][1]) { case 'p' : UpdateFlag=ON; break; case 'c' : CheckFlag=ON; break; case 't' : SafeTetraFlag=ON; break; case 's' : StatFlag=ON; if(argv[i][2]=='1') NumStatFlag=ON; if(argv[i][2]=='2') { NumStatTitleFlag=ON; NumStatFlag=ON; } break; case 'u' : UGScaleFlag=ON; if(argv[i][2]==0 && isdigit(argv[i+1][0])) UGScale=atof(argv[++i]); else UGScale=atof(argv[i]+2); break; default : sprintf(buf,"Unknown options '%s'\n",argv[i]); Error(buf,NO_EXIT); } i++; } BaseV=ReadPoints(argv[i++],&n); if(argc>i) fp=fopen(argv[i],"w"); SI.Point=n; v=(Point3 **)malloc(n*sizeof(Point3 *)); usedpoint=(int *)malloc(n*sizeof(int)); if(!v || !usedpoint) Error("Unable to allocate memory for Points\n",EXIT); for(i=0;i<n;i++) v[i]=&(BaseV[i]); for(i=0;i<n;i++) usedpoint[i] = -1; Q=NewList(FIFO,sizeof(Face)); /* Initialize First Face */ ChangeEqualObjectList(EqualFace,Q); /* List Q. */ if(n>40) HashList(n/4,HashFace,Q); T=NewList(LIFO,sizeof(ShortTetra)); /* Initialize Built Tetra-*/ ChangeEqualObjectList(EqualTetra,T); /* hedra List T. */ if(SafeTetraFlag && n>40) HashList(n/4,HashTetra,T); ResetChronos(USER_CHRONOS); StartChronos(USER_CHRONOS); DeWall(v,BaseV,usedpoint,n,Q,T,XAxis); StopChronos(USER_CHRONOS); sec=ReadChronos(USER_CHRONOS); SI.Tetra=CountList(T); SI.Secs=sec; if(StatFlag && !NumStatFlag) PrintStat(); if(StatFlag && NumStatFlag && NumStatTitleFlag) PrintNumStatTitle(); if(StatFlag && NumStatFlag) PrintNumStat(); if(!StatFlag) printf("Points:%7i Secs:%6.2f Tetras:%7i\n",SI.Point,SI.Secs,SI.Tetra); WriteTetraList(T,fp); return 0; }
void DeWall(Point3 *v[], Point3 *BaseV, int *UsedPoint, int n, List Q, List T, enum Axis a) { List Ln=NULL_LIST, La=NULL_LIST, Lp=NULL_LIST; Tetra *t; ShortTetra *st; Face *f; int i,j; UG g; Plane alpha; alpha.N.x=0; alpha.N.y=0; alpha.N.z=0; alpha.off=0; if(n>20) if(UGScaleFlag) BuildUG(v,UsedPoint,n, (int)(n*UGScale),&g); /* Initialize Uniform Grid */ else BuildUG(v,UsedPoint,n, n,&g); Ln=NewList(FIFO,sizeof(Face)); /* Initialize Active Face */ ChangeEqualObjectList(EqualFace,Ln); /* List Ln. */ if(n>40) HashList(n/4,HashFace,Ln); La=NewList(FIFO,sizeof(Face)); /* Initialize Active Face */ ChangeEqualObjectList(EqualFace,La); /* List La. */ if(n>40) HashList(n/4,HashFace,La); Lp=NewList(FIFO,sizeof(Face)); /* Initialize Active Face */ ChangeEqualObjectList(EqualFace,Lp); /* List Lp. */ if(n>40) HashList(n/4,HashFace,Lp); switch(a) { case XAxis : qsort((void *)v, (size_t)n, sizeof(Point3 *), (int (*)(const void *,const void *))XComp); alpha.N.x = 1; alpha.off = (v[n/2-1]->x+v[n/2]->x)/2; break; case YAxis : qsort((void *)v, (size_t)n, sizeof(Point3 *), (int (*)(const void *,const void *))YComp); alpha.N.y = 1; alpha.off = (v[n/2-1]->y+v[n/2]->y)/2; break; case ZAxis : qsort((void *)v, (size_t)n, sizeof(Point3 *), (int (*)(const void *,const void *))ZComp); alpha.N.z = 1; alpha.off = (v[n/2-1]->z+v[n/2]->z)/2; break; } if(CountList(Q)==0) { t=FirstTetra(v,n); for(i=0;i<4;i++) { switch (Intersect(t->f[i],&alpha)) { case 0 : InsertList(t->f[i], La); break; case 1 : InsertList(t->f[i], Lp); break; case -1 : InsertList(t->f[i], Ln); break; } for(j=0;j<3;j++) if(t->f[i]->v[j]->mark==-1) t->f[i]->v[j]->mark=1; else t->f[i]->v[j]->mark++; } st=Tetra2ShortTetra(t,BaseV); free(t); InsertList(st,T); SI.Face+=4; } else { while(ExtractList(&f,Q)) switch (Intersect(f,&alpha)) { case 0 : InsertList(f, La); break; case 1 : InsertList(f, Lp); break; case -1 : InsertList(f, Ln); break; } } while(ExtractList(&f,La)) { if(n>20) t=FastMakeTetra(f,v,n,&g); else t=MakeTetra(f,v,n); if(t==NULL) SI.CHFace++; else { st=Tetra2ShortTetra(t,BaseV); if(SafeTetraFlag) if(MemberList(st, T)) Error("Cyclic Tetrahedra Creation\n",EXIT); InsertList(st,T); SI.Face+=3; SI.Tetra++; if(UpdateFlag) if(SI.Tetra%50 == 0) printf("Tetrahedra Built %i\r",SI.Tetra++); for(i=1;i<4;i++) switch (Intersect(t->f[i],&alpha)) { case 0 : if(MemberList(t->f[i],La)) { DeleteCurrList(La); SI.Face--; for(j=0;j<3;j++) t->f[i]->v[j]->mark--; free(t->f[i]); } else { InsertList(t->f[i],La); for(j=0;j<3;j++) if(t->f[i]->v[j]->mark==-1) t->f[i]->v[j]->mark=1; else t->f[i]->v[j]->mark++; } break; case 1 : if(MemberList(t->f[i],Lp)) { DeleteCurrList(Lp); SI.Face--; for(j=0;j<3;j++) t->f[i]->v[j]->mark--; free(t->f[i]); } else { InsertList(t->f[i],Lp); for(j=0;j<3;j++) if(t->f[i]->v[j]->mark==-1) t->f[i]->v[j]->mark=1; else t->f[i]->v[j]->mark++; } break; case -1: if(MemberList(t->f[i],Ln)) { DeleteCurrList(Ln); SI.Face--; for(j=0;j<3;j++) t->f[i]->v[j]->mark--; free(t->f[i]); } else { InsertList(t->f[i],Ln); for(j=0;j<3;j++) if(t->f[i]->v[j]->mark==-1) t->f[i]->v[j]->mark=1; else t->f[i]->v[j]->mark++; } break; } free(t->f[0]); free(t); } free(f); } if(SI.WallSize==0) SI.WallSize=SI.Tetra; /* if(n>20) EraseUG(&g); */ switch(a) { case XAxis : if(CountList(Ln)>0) DeWall(v, BaseV,UsedPoint,n/2, Ln,T,YAxis); if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,YAxis); break; case YAxis : if(CountList(Ln)>0) DeWall(v, BaseV,UsedPoint,n/2, Ln,T,ZAxis); if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,ZAxis); break; case ZAxis : if(CountList(Ln)>0) DeWall(v, BaseV,UsedPoint,n/2, Ln,T,XAxis); if(CountList(Lp)>0) DeWall(&(v[n/2]),BaseV,UsedPoint,n-(n/2),Lp,T,XAxis); break; } EraseList(Ln); EraseList(La); EraseList(Lp); }
int IsEmptyList(List l) { if(!l) ErrorTRUE("IsEmptyList, not initialized List.\n"); if (CountList(l)==0) return TRUE; else return FALSE; }
int main(int argc, char **argv) { char *wadfile; char *prefix = ""; FILE *file; wadinfo_t hdr; lumpinfo_t info; fname_t *it; int c; char lumpbase[4]; int direc_size, direc_offset; PrintBanner(); if (argc < 2 || argc > 3) { PrintUsage(); return 0; } wadfile = argv[1]; if (argc > 2) prefix = argv[2]; srand((unsigned int)time(0)); rand(); rand(); // First compile the list of all file names. InitList(); printf("Collecting files...\n"); CollectFiles(""); printf("Creating WAD file %s...\n", wadfile); if ((file = fopen(wadfile, "wb")) == NULL) { printf("Couldn't open %s.\n", wadfile); perror("Error"); goto stop_now; } // The header. hdr.identification[0] = 'P'; hdr.identification[1] = 'W'; hdr.identification[2] = 'A'; hdr.identification[3] = 'D'; hdr.numlumps = CountList() + 1; hdr.infotableofs = 0; // We've no idea yet. fwrite(&hdr, sizeof(hdr), 1, file); // Write all the files. sprintf(lumpbase, "%c%c", 'A' + rand() % 26, 'A' + rand() % 26); for (it = root.next, c = 0; it != &root; it = it->next, c++) { it->offset = ftell(file); if (!CopyToStream(file, it)) { perror(it->path); goto stop_now; } printf("%s\n", it->path); sprintf(it->lump, "__%s%04X", lumpbase, c); } // Write DD_DIREC. direc_offset = ftell(file); for (it = root.next; it != &root; it = it->next) fprintf(file, "%s %s%s\n", it->lump, prefix, it->path); direc_size = ftell(file) - direc_offset; // Time to write the info table. hdr.infotableofs = ftell(file); for (it = root.next, c = 0; it != &root; it = it->next, c++) { memset(&info, 0, sizeof(info)); info.filepos = it->offset; info.size = it->size; memcpy(info.name, it->lump, 8); fwrite(&info, sizeof(info), 1, file); } // Finally DD_DIREC's entry. info.filepos = direc_offset; info.size = direc_size; strncpy(info.name, "DD_DIREC", 8); fwrite(&info, sizeof(info), 1, file); // Rewrite the header. rewind(file); fwrite(&hdr, sizeof(hdr), 1, file); // We're done! fclose(file); stop_now: DestroyList(); return 0; }