Пример #1
0
int insertionSort(My402List *pList, My402SortElem *pKey){

	My402ListElem *current = My402ListLast(pList);
	My402ListElem *prevCurrent = current;
	while(current != NULL &&
		current->obj != NULL && 
		 ((My402SortElem *)current->obj)->transTime > pKey->transTime){
	
		prevCurrent = current;
		current = My402ListPrev(pList, current);	
	}
	if(current != NULL && current->obj != NULL){
		if(((My402SortElem *)current->obj)->transTime ==  pKey->transTime){
			fprintf(stderr,"\nTime stamp %lld is repeated for some entries",(long long)pKey->transTime);	
			//clean up an return
			unlinkSortElements(pList);	
			return FALSE;
		
		}
	}
	if(current == NULL){
		My402ListInsertBefore(pList, pKey, prevCurrent);
	}else{
		My402ListInsertAfter(pList, pKey, current);
	}
	return TRUE;
}
Пример #2
0
int sortInsert(My402List *list, ListEntry *Entry)
{
    My402ListElem *temp;
    ListEntry *tempobj;
    temp = My402ListNext(list, &list->anchor);

    while(temp){
        tempobj = (ListEntry *) temp->obj;
        if(Entry->timestamp == tempobj->timestamp) {
            fprintf(stderr, "Transactions have Identical timestamp %ld\n", Entry->timestamp);
            return 0;
        }
        if(Entry->timestamp < tempobj->timestamp) {
            if(!My402ListInsertBefore(list, Entry, temp)){
                return 0;
            }
            return 1;
        }
        temp = My402ListNext(list, temp);
    }
    if(!My402ListAppend(list, Entry)){
        return 0;
    }
    return 1;
}
Пример #3
0
static
void BubbleForward(My402List *pList, My402ListElem **pp_elem1, My402ListElem **pp_elem2)
    /* (*pp_elem1) must be closer to First() than (*pp_elem2) */
{
    My402ListElem *elem1=(*pp_elem1), *elem2=(*pp_elem2);
    void *obj1=elem1->obj, *obj2=elem2->obj;
    My402ListElem *elem1prev=My402ListPrev(pList, elem1);
/*  My402ListElem *elem1next=My402ListNext(pList, elem1); */
/*  My402ListElem *elem2prev=My402ListPrev(pList, elem2); */
    My402ListElem *elem2next=My402ListNext(pList, elem2);

    My402ListUnlink(pList, elem1);
    My402ListUnlink(pList, elem2);
    if (elem1prev == NULL) {
        (void)My402ListPrepend(pList, obj2);
        *pp_elem1 = My402ListFirst(pList);
    } else {
        (void)My402ListInsertAfter(pList, obj2, elem1prev);
        *pp_elem1 = My402ListNext(pList, elem1prev);
    }
    if (elem2next == NULL) {
        (void)My402ListAppend(pList, obj1);
        *pp_elem2 = My402ListLast(pList);
    } else {
        (void)My402ListInsertBefore(pList, obj1, elem2next);
        *pp_elem2 = My402ListPrev(pList, elem2next);
    }
}
Пример #4
0
void insert_list(My402List * list, My402TransData * data)
{
	if(My402ListEmpty(list))
		(void)My402ListAppend(list, (void*)data);
	else
	{
		My402ListElem * elem = My402ListFirst(list);
		while(elem)
		{
			My402TransData * temp = (My402TransData *)(elem -> obj);
			if(temp -> timestamp < data -> timestamp)
			{
				elem = My402ListNext(list, elem);
				if(!elem)
					(void)My402ListAppend(list, (void*)data);
			}
			else if(temp -> timestamp > data -> timestamp)
			{
				(void)My402ListInsertBefore(list, (void*)data, elem);
				break;
			}
			else
				print_error("two identical timestamp");
		}
	}
}
Пример #5
0
void insertionSort(My402List *pList, My402SortElem *pKey){

	My402ListElem *current = My402ListLast(pList);
	My402ListElem *prevCurrent = current;
	while(current != NULL &&
		current->obj != NULL && 
		 ((My402SortElem *)current->obj)->transTime > pKey->transTime){
	
		prevCurrent = current;
		current = My402ListPrev(pList, current);	
	}
	if(current == NULL){
		My402ListInsertBefore(pList, pKey, prevCurrent);
	}else{
		My402ListInsertAfter(pList, pKey, current);
	}
}
void InserstionSort(My402List *list,void *obj_new){
    My402ListElem *elem = My402ListFirst(list), *next_elem = NULL;
    MyDS *key = NULL, *new_key = NULL, *next_key = NULL;
    long cur_value = 0, new_value = 0, next_value=0;
    int flag = 0;
    
    new_key = obj_new;
    
    // when no element in the list
    if (My402ListEmpty(list)) {
        My402ListAppend(list,obj_new);
    }
    
    else{
        for (elem = My402ListFirst(list);
             elem != NULL;
             elem = My402ListNext(list, elem) ) {
            
            next_elem = My402ListNext(list, elem);
            
            if( next_elem != NULL){
                
                
                key = elem->obj;
                next_key = next_elem->obj;
                next_value = atol(next_key->t_date);
                
                
                cur_value = atol(key->t_date);
                new_value = atol(new_key->t_date);
                
                
                if(new_value == cur_value){
                    fprintf(stderr,"Same TimeStamps!!!\n");
                    exit(1);
                }
                
                if(new_value > cur_value && new_value < next_value ){
                    flag = My402ListInsertAfter(list, obj_new, elem);
                    if(!flag){
                        fprintf(stderr,"Error while inserting obj after elem\n");
                        exit(1);
                    }
                    break;
                    
                    
                }
                else if(new_value< cur_value){
                    flag = My402ListInsertBefore(list, obj_new, elem);
                    if(!flag){
                        fprintf(stderr,"Error while sorting\n");
                        exit(1);
                    }
                    break;
                    
                }
            }
            else if(next_elem == NULL){
                
                new_value = atol(new_key->t_date);
                key = elem->obj;
                cur_value = atol(key->t_date);
                
                
                if(new_value == cur_value){
                    fprintf(stderr,"Same TimeStamps!!!\n");
                    exit(1);
                }
                
                if(new_value < cur_value){
                    flag = My402ListInsertBefore(list, obj_new, elem);
                    if(!flag)
                        fprintf(stderr,"Error while inserting obj before elem\n");
                }
                else{
                    flag = My402ListInsertAfter(list, obj_new, elem);
                    if(!flag){
                        fprintf(stderr,"Error while inserting obj after elem when one element is there!!\n");
                    }
                }
                break;
            }
        }
        
    }
    
}
void ParseFile(FILE *file){
  char buffer[1024];
  memset(buffer, 0, sizeof(buffer));
  
  transaction *obj = NULL;
  My402List list;
  memset(&list, 0, sizeof(My402List));
  (void)My402ListInit(&list);

  while(fgets(buffer, sizeof(buffer), file) != NULL){
    obj = (transaction*)malloc(sizeof(transaction));
    if(obj == NULL){
      fprintf(stderr, "%s\n", strerror(errno));
    }
    else{
      char *start_ptr = buffer;
      char *tab_ptr = strchr(start_ptr, '\t');
      
      int noofptr = 0;
      while(tab_ptr != NULL){
	noofptr++;
	tab_ptr++;
	start_ptr = tab_ptr;
	tab_ptr = strchr(start_ptr, '\t');
      }
      
      if(noofptr > 3){
	fprintf(stderr, "Too many tabs, Clearing memory and Quiting Program\n");
	free(obj);
	My402ListUnlinkAll(&list);
	exit(0);
      }

      if(noofptr < 3){
	fprintf(stderr, "Format Malformed, Clearing memory and Quiting Program\n");
	free(obj);
	My402ListUnlinkAll(&list);
	exit(0);
      }

      start_ptr = buffer;
      tab_ptr = strchr(start_ptr, '\t');

      if(Transaction_Type(obj, start_ptr, tab_ptr) == 0){
	fprintf(stderr, "Transaction Type failed, Clearing Memory and Quiting Program\n");
	free(obj);
	My402ListUnlinkAll(&list);
	exit(0);
      }
      tab_ptr++;
      start_ptr = tab_ptr;
      tab_ptr = strchr(start_ptr, '\t');
      
      if(Transaction_TimeStamp(obj, start_ptr, tab_ptr) == 0){
	fprintf(stderr, "Transaction Time failed, Clearing Memory and Quiting Program\n");
	free(obj);
	My402ListUnlinkAll(&list);
	exit(0);
      }

      tab_ptr++;
      start_ptr = tab_ptr;
      tab_ptr = strchr(start_ptr, '\t');
      
      if(Transaction_Amount(obj, start_ptr, tab_ptr) == 0){
	fprintf(stderr, "Transaction Amount failed, Clearing Memory and Quiting Program\n");
	free(obj);
	My402ListUnlinkAll(&list);
	exit(0);
      }

      tab_ptr++;
      start_ptr = tab_ptr;
      tab_ptr = strchr(start_ptr, '\n');

      Transaction_Description(obj, start_ptr, tab_ptr);
      

      //Now the struct is filled with the string fields read from the first line of the file
      if(My402ListLength(&list) == 0)
	(void)My402ListPrepend(&list, obj);
      else{
	My402ListElem *elem = NULL;
	for(elem = My402ListFirst(&list); elem != NULL; elem=My402ListNext(&list, elem)){
	  if((((transaction*)(elem->obj))->trans_time == obj->trans_time)){
	    fprintf(stderr, "Error - Two entry at same time, Quiting program\n");
	    free(obj);
	    My402ListUnlinkAll(&list);
	    exit(0);
	  }
	  if((((transaction*)(elem->obj))->trans_time > obj->trans_time)){
	    (void)My402ListInsertBefore(&list, obj, elem);
	    break;
	  }
	  if(My402ListNext(&list, elem) == NULL){
	    (void)My402ListAppend(&list, obj);
	    break;
	  }
	}
      }
    }
  }
  PrintTransactionList(&list);
  My402ListUnlinkAll(&list);
}