/* test 1: 1. create list, check it is empty 2. use 1, create list iterate, check empty 3. use 2, check SLGetItem 4. use 3, check SLNextItem 5. destroy list iterator 6. destroy list */ void test1(){ SortedListPtr list = SLCreate(compare, destroy); SortedListIteratorPtr iter; int* value; if (list == NULL) { printf("Cannot created list\n"); exit(0); } iter = SLCreateIterator(list); value = (int*)SLGetItem(iter); if (value != NULL) { printf("Value must be null\n"); exit(0); } value = (int*)SLNextItem(iter); if (value != NULL) { printf("Value must be null\n"); exit(0); } SLDestroy(list); SLDestroyIterator(iter); printf("Test 1 completed\n"); }
/* test 7: 1. create list with compare and destroy functions 2. check SLInsert, add 1, 2, 3, 4, 5, SLRemove 3. create list iterate 4. check SLGetItem, SLNextItem 5. destroy list iterator 6. destroy list */ void test7(){ SortedListPtr list = SLCreate(compare, destroy); SortedListIteratorPtr iter; int i; int* value; for (i = 1; i <= 5; i++) { value = (int*)malloc(sizeof(int)); *value = i; SLInsert(list, (void*)value); } iter = SLCreateIterator(list); i = SLRemove(list, value); printf("SLRemove 5 returned %d\n", i); i = SLRemove(list, value); printf("SLRemove 5 returned %d\n", i); value = (int*)SLGetItem(iter); while (value != NULL) { printf("Value = %d\n", *value); value = (int*)SLNextItem(iter); } SLDestroy(list); SLDestroyIterator(iter); printf("Test 7 completed\n"); }
/* test 6: 1. Do the test 5 with SLNextItem over list */ void test6(){ SortedListPtr list = SLCreate(compare, destroy); SortedListIteratorPtr iter; int i; int* value; for (i = 1; i <= 5; i++) { value = (int*)malloc(sizeof(int)); *value = i; SLInsert(list, (void*)value); } iter = SLCreateIterator(list); value = (int*)SLGetItem(iter); while (value != NULL) { printf("Value = %d\n", *value); value = (int*)SLNextItem(iter); } value = (int*)SLNextItem(iter); if (value != NULL) { printf("Over end of list, must be null\n"); exit(0); } SLDestroy(list); SLDestroyIterator(iter); printf("Test 6 completed\n"); }
void * SLNextItem(SortedListIteratorPtr iter) { // if the item pointed by iter is removed if (iter->itr->next == NULL) { printf("This iterator is invalid.\n"); return NULL; } iter->itr->refByItrCount--; iter->itr = iter->itr->next; iter->itr->refByItrCount++; return SLGetItem(iter); }
/* * SLNextItem first checks if the node it is pointing to is NULL and * returns NULL if the value is NULL. If the function is still going, * it then decrement's the current node's numPointers variable and destroys it * if numPointers is less than or equal to zero. The iterator then points to * the next node. If the node is NULL, the function immediately returns NULL. * If it is not NULL, the iterator increments the node's numPointers variable * and returns the value of that node using SLGetItem. */ void * SLNextItem( SortedListIteratorPtr iter ) { if ( iter->currentNode == NULL ) { return NULL; } iter->currentNode->numPointers--; NodePtr next = iter->currentNode->next; if ( iter->currentNode->numPointers <= 0 ) { NDestroy( iter->currentNode ); } iter->currentNode = next; if ( iter->currentNode == NULL) { return NULL; } iter->currentNode->numPointers++; return SLGetItem( iter ); }
void iterprint_all(SortedListPtr s, SortedListIteratorPtr iter, int type){ void *item = SLGetItem(iter); while(1){ //item = SLGetItem(iter);//modify by lezi if (item == NULL){ break; }else{ if(type == INT){ printf("%d ", *((int*)item)); }else if(type == DOUBLE){ printf("%f ", *((double*)item)); } else if(type==STRING){ printf("%s ", ((char*)item)); }else if(type == STRUCT){ printf("struct={%d} ", ((TestStruct*)item)->field); } } item = SLNextItem(iter);//modify by lezi } printf("\n"); }
/* test 4: 1. create list with compare and destroy functions 2. check SLInsert, add 1, 2, 3, 4, 5 3. create list iterate 4. check SLGetItem 5. destroy list iterator 6. destroy list */ void test4(){ SortedListPtr list = SLCreate(compare, destroy); SortedListIteratorPtr iter; int i; int* value; for (i = 1; i <= 5; i++) { value = (int*)malloc(sizeof(int)); *value = i; SLInsert(list, (void*)value); } iter = SLCreateIterator(list); value = (int*)SLGetItem(iter); printf("Value = %d\n", *value); SLDestroy(list); SLDestroyIterator(iter); printf("Test 4 completed\n"); }
int main(int argc, char*argv[]) { int choice = atoi(argv[1]); printf("Choice: %d\n", choice); if(choice == 1){ //1. Normal SLInserts (@ beginning, middle, end of list) //a. integers SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; if(populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,NULL,NULL,NULL) == 0){ failure(); return 1; } SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all(s,iter,INT); //prints 155 42 7 6 5 -1 }else if(choice == 2){ //b. doubles SortedListPtr s = SLCreate(compareDoubles,destroyBasicTypeAlloc); double darr[6] = {7.43,5.55,155.26,42.1,-1.5,6.7}; if(populate_list(s,DOUBLE,sizeof(darr)/sizeof(double),NULL,darr,NULL,NULL) == 0){ failure(); return 1; } SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all(s,iter,DOUBLE); //prints 155.26 42.1 7.43 6.7 5.55 -1.5 }else if(choice == 3){ //c. strings SortedListPtr s = SLCreate(compareStrings,destroyBasicTypeAlloc); char *carr[6] = {"cat","dog","catamaran","apple","cormorant","zebra"}; if(populate_list(s,STRING,6,0,0,carr,NULL) == 0){ failure(); return 1; } SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all(s,iter,STRING); //prints apple cat catamaran cormorant dog zebra // should print zebra dog cormorant catamaran cat apple }else if(choice == 4){ //d. structs SortedListPtr s = SLCreate(compareTestStructs,destroyBasicTypeAlloc); TestStruct strtarr[6]; strtarr[0].field = 7; strtarr[1].field = 5; strtarr[2].field = 155; strtarr[3].field = 42; strtarr[4].field = -1; strtarr[5].field = 6; if(populate_list(s,STRUCT,6,0,0,0,strtarr) == 0){ failure(); return 1; } SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all(s,iter,STRUCT); //prints 155 42 7 6 5 -1 }else if(choice == 5){ //SLRemove nonexistent element SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); int toremove = 54; if (SLRemove(s,&toremove) != 0) { failure(); }else{ success(); } }else if(choice == 6){ //SLRemove existing element (no duplicates; didn't handle them anyway) SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); int toremove = 5; if (SLRemove(s,&toremove) != 0) { SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all_int(s,iter); //prints 155 42 7 6 -1 }else{ failure(); } }else if(choice == 7){ //Iterate on empty list //Should not fail SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); SortedListIteratorPtr iter = SLCreateIterator(s); iterprint_all_int(s,iter); }else if (choice == 8){ //SLInsert for item beyond iterator SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); void *item = SLNextItem(iter); item = SLNextItem(iter); int *toins = malloc(sizeof(int)); *toins = 4; SLInsert(s,toins); iterprint_all_int(s,iter); //prints 7 6 5 4 -1 }else if(choice == 9){ //Create multiple iterators on same list, interleave iterations. //Delete item between iterators. SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr olditer = SLCreateIterator(s); SortedListIteratorPtr iter = SLCreateIterator(s); void *item; int i; for(i = 0; i < 2; i++){ item = SLGetItem(olditer);//modify by lezi printf("%d ", *((int*)item)); item = SLNextItem(olditer);//modify by lezi } //prints 155 42 printf("\n"); for(i = 0; i < 4; i++){ item = SLGetItem(iter); //modify by lezi printf("%d ", *((int*)item)); item = SLNextItem(iter);//modify by lezi } //prints 155 42 7 6 printf("\n"); int itoremove = 6; if (SLRemove(s,&itoremove) == 0) { failure(); return 1; } item = SLGetItem(iter); //prints 5 //modufy by lezi printf("%d\n", *((int*)item)); item = SLGetItem(olditer); printf("%d\n", *((int*)item)); //prints 7 //modify by lezi iterprint_all_int(s,iter); //prints 5 -1 iterprint_all_int(s,olditer); //prints 7 5 -1 }else if(choice == 10){ //SLRemove end element, iterator positioned on it SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[3] = {7,5,3}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); int x3 = 3; void *item = SLNextItem(iter); item = SLNextItem(iter);//iterator points to 3 if(SLRemove(s,&x3) && SLNextItem(iter) == NULL){ success(); }else{ failure(); } }else if(choice == 11){ //TODO //SLRemove element in middle, iterator positioned on it SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[3] = {7,5,3}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); void *item = SLNextItem(iter); int x1 = 5; if(SLRemove(s,&x1) && *((int*)SLNextItem(iter)) == 3 && ((int*)SLNextItem(iter)) == NULL){ success(); }else{ failure(); } }else if(choice == 12){ //SLRemove element positioned immediately after element iterator is pointing to SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[6] = {7,5,155,42,-1,6}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); void *item = SLNextItem(iter); item = SLNextItem(iter); int x1 = 6; if(SLRemove(s,&x1) && *((int*)SLGetItem(iter)) == 7 //modify by lezi && *((int*)SLNextItem(iter)) == 5 && *((int*)SLNextItem(iter)) == -1 && ((int*)SLNextItem(iter)) == NULL){ success(); }else{ failure(); } }else if(choice == 13){ //Add item between recently returned element and element about to be returned. SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[3] = {7,5,3}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); void *item = SLNextItem(iter); item = SLNextItem(iter);//point to 3 now int *x4 = malloc(sizeof(int)); *x4 = 4; SLInsert(s,x4); iterprint_all_int(s,iter); //prints 3 }else if(choice == 14){ //Add item to head and middle, after iterator has been created //modify by Lezi SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[3] = {7,5,3}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); int *toinsert = malloc(sizeof(int)); *toinsert = 8; SLInsert(s,toinsert); int *toinsert1 = malloc(sizeof(int)); *toinsert1 = 4; // add by lezi SLInsert(s,toinsert1);//add by lezi iterprint_all_int(s,iter); //prints 7 5 4 3 //modify by lezi }else if(choice == 15){ //Add item to tail after all items have been returned by iterator. SortedListPtr s = SLCreate(compareInts,destroyBasicTypeAlloc); int iarr[3] = {7,5,3}; populate_list(s,INT,sizeof(iarr)/sizeof(int),iarr,0,0,NULL); SortedListIteratorPtr iter = SLCreateIterator(s); void *item; while((item = SLNextItem(iter)) != NULL); int *toins = malloc(sizeof(int)); *toins = -1; SLInsert(s,toins); if(SLGetItem(iter) == NULL){ //modify by lezi success(); }else{ failure(); } }else{ printf("Bad input\n"); } return 0; }
int main(void) { //TEST CASE 1 WITH CHARACTERS SortedListPtr si =SLCreate(compareStrings, destroy); SLInsert(si, "z"); SLInsert(si, "a"); SLInsert(si, "a"); SLInsert(si, "b"); SLInsert(si, "x"); printf("\n=-=-=-=-=-=-=- Testing Characters =-=-=-=-=-=-=-=-=-=-=-=-=-=\n"); printf("Completed inserting characters into list\n"); // SLRemove(si, "x"); Node *ptr; SortedListIteratorPtr it = SLCreateIterator(si); //iterator has been created, begin to iterate through the list and print out the values //we use the SLGetItem to return the current item ptr =SLGetItem(it); while(ptr != NULL) { printf("\n%s", ptr->data); ptr = SLNextItem(it); //uses the SLNextItem to move the pointer to the next item to continue iterating } printf("\nCompleted interating through the list\n"); //The iterator gets destroyed SLDestroyIterator(it); printf("Iterator has been destroyed\n"); //the list has not been affected since the iterator got destroyed printf("Destroyed iterator does not affect list by printing out values from list\n"); printf("First item in the list: %s\n", si->head->data); //prints out the item in the list where head points to printf("Second item in the list: %s\n", si->head->next->data); //prints out the item after head printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); //+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+ //TEST CASE 2 WITH INTEGERS int arr[]= {2,3,10,8,4,11,21,8,1,7,16}; int length = sizeof(arr)/sizeof(arr[0]); int i; SortedListPtr si2 =SLCreate(compareInts, destroy); int *intPtr; int x = 100; // int *insrt; // to insert a number 100 insrt = &x; // after iterated through list printf("\n=-=-=-=-=-=-=-=-=-Testing Integers=-=-=-=-=-=-=-=-=-=-=-=\n"); //inserts numbers from arrray into linked list for(i = 0; i < length;i++) { intPtr = &arr[i]; SLInsert(si2,intPtr); } printf("Finished inserting numbers into linked list\n"); Node* ptr2; SortedListIteratorPtr it2 = SLCreateIterator(si2); ptr2 = SLGetItem(it2); //iterator traverses through the list while(ptr2 != NULL) { printf("%d\n", (*(int*)(ptr2->data)) ); ptr2 = SLNextItem(it2); } printf("Finished traversing through linked list\n"); SLInsert(si2, insrt); printf("Number 100 has been inserted into the list\n"); //destroys iterator SLDestroyIterator(it2); printf("Iterator has been destroyed\n"); //list has not been affectedby iterator by printing values in list printf("First value in list: %d\n", (*(int*)(si2->head->data)) ); printf("Second value in list: %d\n", (*(int*)(si2->head->next->data)) ); //remove item from list SLRemove(si2, insrt); printf("item containing 100 has been deleted from list\n"); printf("First item after deletion:%d\n", (*(int*)(si2->head->data)) ); printf("Second item after deletion:%d\n", (*(int*)(si2->head->next->data)) ); printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n"); //TESTING FLOATS-------------------------- float arrDbl[]= {2.2,3.6,10.9,8.3,4.7,11.3,21.7,8.1,1.8,7.2,16.5}; int size = sizeof(arrDbl)/sizeof(arrDbl[0]); int count; SortedListPtr si3 =SLCreate(compareDoubles, destroy); float *dblPtr; float var = 170.5; float *insert; insert = &var; printf("\n=-=-=-=-=-=-=-=-=-Testing Floats=-=-=-=-=-=-=-=-=-=-=-=\n"); //inserts numbers from arrray into linked list for(count = 0; count < size;count++) { dblPtr = &arrDbl[count]; SLInsert(si3,dblPtr); } printf("Finished inserting numbers into linked list\n"); Node* ptr3; SortedListIteratorPtr it3 = SLCreateIterator(si3); ptr3 = SLGetItem(it3); //iterator traverses through the list while(ptr3 != NULL) { printf("%f\n", (*(float*)(ptr3->data)) ); ptr3 = SLNextItem(it3); } printf("Finished traversing through linked list\n"); SLInsert(si3, insert); printf("Number 170.5 has been inserted into the list\n"); //destroys iterator SLDestroyIterator(it3); printf("Iterator has been destroyed\n"); //list has not been affectedby iterator by printing values in list printf("First value in list: %f\n", (*(float*)(si3->head->data)) ); printf("Second value in list: %f\n", (*(float*)(si3->head->next->data)) ); //remove item from list SLRemove(si3, insert); printf("item containing 100 has been deleted from list\n"); printf("First item after deletion:%f\n", (*(float*)(si3->head->data)) ); printf("Second item after deletion:%f\n", (*(float*)(si3->head->next->data)) ); printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); return 0; }
int main() { Employee *a=(Employee*)malloc(sizeof(Employee)); a->name="Albert"; a->salary=48000; Employee *b=(Employee*)malloc(sizeof(Employee)); b->name="Bob"; b->salary=47000; Employee *c=(Employee*)malloc(sizeof(Employee)); c->name="Carter"; c->salary=46000; Employee *d=(Employee*)malloc(sizeof(Employee)); d->name="Dudley"; d->salary=45000; //////////////////////// INITIALISING THE SORTED LIST /////////////////////////// SortedListPtr ptr=SLCreate(&compareEmployees, &destroyEmployee); printf("Creating SortedList...\n"); if(SLInsert(ptr, (void *)b)) printf("Inserted employee with name %s and salary %d \n",b->name,b->salary); if(SLInsert(ptr, (void *)a)) printf("Inserted employee with name %s and salary %d \n",a->name,a->salary); if(SLInsert(ptr, (void *)c)) printf("Inserted employee with name %s and salary %d \n",c->name,c->salary); if(SLInsert(ptr, (void *)d)) printf("Inserted employee with name %s and salary %d \n",d->name,d->salary); printf("Finished inserting.\n\n"); Employee* firstEmp=(Employee*)(ptr->head->data); printf("%s is the first employee in the sorted list. \n\n",firstEmp->name); ////////////////////// CREATING ITERATORS ////////////////////////////////////// printf("Creating iterator 1 and 2\n"); SortedListIteratorPtr walker = SLCreateIterator(ptr); SortedListIteratorPtr walker2 = SLCreateIterator(ptr); printf("Testing SLGetItem for Iterator 1: %s \n", ((Employee*)(SLGetItem(walker)))->name); //the walker1 will traverse through the list to the last element while(walker->current->next!=NULL){ SLNextItem(walker); printf("Testing Iterator 1 NextItem: %s \n\n", ((Employee *)(SLGetItem(walker)))->name); } ///////////////// OPERATIONS ON SORTED LISTS ////////////////////////// printf("Attempting to remove Bob from the list.\n"); if(SLRemove(ptr, (void *)b)) printf("Element removed successfully.\n"); //trying to remove from list when iterator points to it printf("Attempting to remove Dudley from the SortedList (iterator 1 points to it).\n"); SLRemove(ptr, (void *)d); //destroyed the list but an iterator still points to one of the elements. printf("Attempting to destroy the list. (Note that iterators 1 and 2 are still active.\n\n"); SLDestroy(ptr); // testing iterators printf("Iterator 1 is pointing to: %s \n", ((Employee *)(SLGetItem(walker)))->name); printf("Iterator 2 is pointing to: %s\n",((Employee *)(SLGetItem(walker2)))->name ); printf("CHecking next element for each iterator\n"); if(SLNextItem(walker)==NULL) printf("Iterator 1 reaches null\n"); if(SLNextItem(walker2)==NULL) printf("Iterator 2 reaches null\n"); SLDestroyIterator(walker); SLDestroyIterator(walker2); return 0; }
/* Will write to the file specified by @param1 using the data in TokenList. It will first check whether the filename is already in use and prompt the user if so. Then it will use sorted-list iterator objects to navigate through TokenList and its nested sorted-lists to output a JSON formated inverted-index file. @param filename : Output file name. */ void writeFile(char *filename) { /* Checking if filename is a duplicate. */ if(!SLisEmpty(TokenList)){ if(access(filename,0) == 0){ printf("The requested output file name is already in use.\nOverwrite? (y/n)\n"); char c; scanf("%c",&c); if(c != 'y'){ exit(0); } } }else{ printf("The input does not contain any tokens to index.\n"); exit(0); } /* Writing file to filename */ FILE *file; if ((file = fopen(filename, "w+")) != NULL) { fprintf(file, "{\"list\" : [\n"); SortedListIteratorPtr itr1 = SLCreateIterator(TokenList); Token *tmp = SLGetItem(itr1); while (tmp != NULL) { fprintf(file, "\t {\"%s\" : [ \n", tmp->word); SortedListIteratorPtr itr2 = SLCreateIterator(tmp->fileList); fileRecord *tmp2 = SLGetItem(itr2); while (tmp2 != NULL) { fprintf(file, "\t\t {\"%s\" : %d}", tmp2->filename, tmp2->frequency); if (!SLIsLastItem(itr2)) fprintf(file, ","); fprintf(file, "\n"); tmp2 = SLNextItem(itr2); } fprintf(file, "\t ]}"); if (!SLIsLastItem(itr1)) fprintf(file, ","); fprintf(file, "\n"); SLDestroyIterator(itr2); tmp = SLNextItem(itr1); } fprintf(file, "]}\n"); SLDestroyIterator(itr1); fclose(file); printf("Inverted-index file successfully written to %s\n", filename); } else { fprintf(stderr, "%s\n", filename); fprintf(stderr, "errno %d: %s\n",errno, strerror(errno)); } }
int main(int argc, const char * argv[]) { char * strs[7] = {"supar short","this is a short string","this is a longer string so I can test the comparator", "this is an even longer string so I can test the comparator", "this is a super duper mooper long string so I can test this stuff", "this is a short stringmk","this is an even longer string so I can test the comparator"}; int numbers[5] = {5,1,3,7,5}; Struct_Obj strtarr[7]; strtarr[0].data = 200; strtarr[1].data = 1; strtarr[2].data = 3; strtarr[3].data = 9; strtarr[4].data = 45; strtarr[5].data = 600; strtarr[6].data = 324; char c; int i; c = getchar(); if (c == '1') { /* * This test is simply to test order, it will populat a list, * and then remove a few items. The iterator is absent from this test. */ SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 3; i++) SLInsert(list, strs[i]); //SLRemove(list, strs[3]); //SLRemove(list, strs[5]); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { printf("output strlen: %lu\n", strlen(((char*)curr->Object))); } SLDestroy(list); } else if (c == '2') { /* * This will test iterators traversing a list. * A remove will be inserted mid traversal to test the "ghost routine" * described in the readme. */ SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter2= SLCreateIterator(list); // this will work because the list has elements. SLGetItem(iter2); SLNextItem(iter2); SLNextItem(iter2); SLRemove(list, strs[1]); SLRemove(list, strs[4]); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output: %lu\n", strlen(((char*)curr->Object))); } SLDestroyIterator(iter2); SLDestroy(list); } else if(c == '3') { /* * This case will test the ghost node functionality of SortedList. * It will create some iterators and delete the object at the target location * of the current iterator. */ SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter= SLCreateIterator(list); SLRemove(list, strs[4]); //remove head SLRemove(list, strs[3]); //remove head + 1 SLRemove(list, strs[3]); //remove head + 2 SLNextItem(iter); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output: %lu\n", strlen(((char*)curr->Object))); } SLDestroyIterator(iter); SLDestroy(list); } else if(c == '4') { /* * This test case will create and list, assign it two iterator * and remove the node of the current target of the iterator. * The node at the end of the list will be removed. We will then * try to push the iterator passed the end of the list. */ SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter= SLCreateIterator(list); SortedListIteratorPtr iter2 = SLCreateIterator(list); SLRemove(list, strs[4]); //remove head SLRemove(list, strs[3]); //remove head + 1 SLRemove(list, strs[3]); //remove head + 2 SLRemove(list, strs[0]); //remove tail SLNextItem(iter2); SLNextItem(iter2); SLNextItem(iter2); SLNextItem(iter2); SLNextItem(iter2); //well passed end of list SLNextItem(iter); SLNextItem(iter); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output: %lu\n", strlen(((char*)curr->Object))); } SLDestroyIterator(iter); SLDestroyIterator(iter2); SLDestroy(list); } else if(c == '5') { /* * This is the stress test-case we will use sting objects, it will * test all of the previous cases along with actions to attempt to * weed out an edge case. */ SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter= SLCreateIterator(list); SortedListIteratorPtr iter2 = SLCreateIterator(list); SLRemove(list, strs[4]); //remove head SLRemove(list, strs[3]); //remove head + 1 SLRemove(list, strs[3]); //remove head + 2 SLRemove(list, strs[0]); //remove tail SLNextItem(iter); SLNextItem(iter2); SLNextItem(iter2); SLNextItem(iter2); SLNextItem(iter2); //well passed end of list SLNextItem(iter); SLNextItem(iter); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter3 = SLCreateIterator(list); SLNextItem(iter3); SLNextItem(iter3); SLRemove(list, strs[4]); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output: %lu\n", strlen(((char*)curr->Object))); } SLNextItem(iter); SLDestroyIterator(iter); SLDestroyIterator(iter3); SLDestroyIterator(iter2); SLDestroy(list); } else if (c == '6') { SortedListPtr list = SLCreate(compareStrings, destroy); for(i = 0; i < 7; i++) SLInsert(list, strs[i]); SortedListIteratorPtr iter = SLCreateIterator(list); for(i=0;i<7;i++) SLRemove(list, strs[i]); for (i = 0; i < 100; i++) //try to break iterator SLNextItem(iter); SLRemove(list, strs[0]); //try to remove object that isn't in the list Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output strlen: %lu\n", strlen(((char*)curr->Object))); } SLDestroyIterator(iter); SLDestroy(list); } else if (c =='7') { /* * This case tests a new object type. * This is a simple load, no deletes or iterators are used. */ SortedListPtr list = SLCreate(compareInts, destroy); for (i=0; i< 5; i++) { int *ptr; ptr = &numbers[i]; SLInsert(list, ptr); } Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { printf("output int: %d\n", *((int *)curr->Object)); } SLDestroy(list); } else if (c == '8') { /* * Load the LL with int object, then proceed to * created an iterator. Nuke the current target of the iterator * which is also the head. Increment iterator and check valid LL */ SortedListPtr list = SLCreate(compareInts, destroy); int *ptr; for (i=0; i< 5; i++) { ptr = &numbers[i]; SLInsert(list, ptr); } SortedListIteratorPtr iter = SLCreateIterator(list); int x = 7; ptr = &x; //remove head while iterator is targeting // SLRemove(list, ptr); SLNextItem(iter); //advance iterator after making target ghost node Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output int: %d\n", *((int *)curr->Object)); } SLDestroy(list); SLDestroyIterator(iter); } else if(c == '9') { /* * This case is for testing structs for storing in the LL. * Load structs into LL and test for correct order. */ SortedListPtr list = SLCreate(compareStrings, destroy); Struct_Obj *ptr; for (i=0; i< 7; i++) { ptr = &strtarr[i]; SLInsert(list, ptr); } Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output int: %d\n", *((int *)curr->Object)); } SLDestroy(list); } else if(c == '0') { SortedListPtr list = SLCreate(compareStrings, destroy); Struct_Obj *ptr; for (i=0; i< 7; i++) { ptr = &strtarr[i]; SLInsert(list, ptr); } SortedListIteratorPtr iter = SLCreateIterator(list); ptr = &strtarr[5]; SLRemove(list, ptr); //remove head / iterator target for(i=0;i<20;i++) //iterate past end of LL SLNextItem(iter); Node curr = NULL; for(curr = list->next; curr != NULL; curr = curr->next) { if(!curr->Object) continue; printf("output int: %d\n", *((int *)curr->Object)); } SLDestroy(list); SLDestroyIterator(iter); } else { printf("bad input, please run the program again, proper input is 0-9\n"); } return 0; }