Computer Science 2574 |
Intro to Data Structures & Soft Eng
|
/*-------------------------------------------------------------- -Module name: dlist.c -Header File: dlist.h -Implemenation File: dlist.c - -Purpose: - This module is responsible for the encapsulated list -creation and management functions for a double linked list. - -The user is repsonsible for providing a datatype file called: - listtype.h -in a directory where it will be found by the search path. -the data structure will need to be in the format: - - struct listdata - { - define internal data items here - }; - struct listtitle - { - define header data items here - }; - -this data file will be used by this module in its definition -of the list. - -Functions: - - - - -Created by: Jon Ford -Version: 1.00 -Modified: 3/6/96 -------------------------------------------------------------*/ #include#include #include "dlist.h" #include "string.h" #define EMPTY 1 #define NOTEMPTY 0 /*----------------------------------------------------------- -Funciton Name: GetList - -Description: -This function maintains a static header for the linked list -and creates memory for that header. It returns a pointer -to that data structure when called with the CURR_LIST option. - -Description of Algorithm: - - -Called by: odb.c - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ ListMgr GetList(int listexist) { static ListMgr newlist; if (listexist==NEW_LIST) { if ((newlist=(ListMgr)malloc(sizeof (struct mainstruct)))==NULL) return NULL; else { newlist->head=NULL;/*initallize the new element*/ newlist->tail=NULL; return newlist; } } else return newlist; } /*----------------------------------------------------------- -Funciton Name: EmptyList - -Description: -This function returns TRUE if the list is empty and FALSE if -the list is not empty. - -Description of Algorithm: - -Called by: odb.c - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ int EmptyList(ListMgr listmgr) { if (listmgr->head==NULL) return EMPTY; else return NOTEMPTY; } /*----------------------------------------------------------- -Funciton Name: CreateElement - -Description: -This function allocates memory for and returns a pointer to -a new list element. - - -Called by: odb.c - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr CreateElement(void) { return ((ElemPtr)malloc(sizeof(struct liststruct))); } /*----------------------------------------------------------- -Funciton Name: InsertElement - -Description: -This function inserts a new element at the tail of the list. - - -Called by: odb.c - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ void InsertElement(ListMgr listmgr, ElemPtr element) { if (EmptyList(listmgr)==EMPTY) /*first element in the list*/ { listmgr->head=element; listmgr->tail=element; } else { element->previous=listmgr->tail; element->next=NULL; element->previous->next=element; listmgr->tail=element; } } /*----------------------------------------------------------- -Funciton Name: RemoveElement - -Description: -This function removes an element from the list. - - - -Called by: odb.c - -Parameters: listmgr - list header data structure - element - pointer to the element to be removed - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ void RemoveElement(ListMgr listmgr, ElemPtr element) { if (EmptyList(listmgr)==1) return; /*no list, no remove*/ if (element->previous==NULL) /*first element*/ { listmgr->head=element->next; listmgr->head->previous=NULL; } else if (element->next==NULL) /*last element*/ { listmgr->tail=element->previous; listmgr->tail->next=NULL; } else /*any other element*/ { element->previous->next=element->next; element->next->previous=element->previous; } free(element); } /*----------------------------------------------------------- -Funciton Name: SizeList - -Description: -This function counts the number of items in the linked list -and returns the number. - -Called by: odb.c - -Parameters: listmgr - list header data structure - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ int SizeList(ListMgr listmgr) { ElemPtr current; int count=0; current=listmgr->head; while (current!=NULL) { count++; current=current->next; } return count; } /*----------------------------------------------------------- -Funciton Name: DestroyList - -Description: -This function loops through the linked list and frees all of -the memory, destroying the list. - -Called by: odb.c - -Parameters: listmgr - list header data structure - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ void DestroyList(ListMgr listmgr) { ElemPtr current, previous; current=listmgr->head; while (current!=NULL) { previous=current; current=current->next; free(previous); } listmgr->head=NULL; listmgr->tail=NULL; } /*----------------------------------------------------------- -Funciton Name: ReturnElement - -Description: -This function returns a pointer to the element at the elemnum -position in the list from the head. (head=1, head->next=2,etc) - -Called by: odb.c - -Parameters: listmgr - list header data structure - elemnum - integer element number - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr ReturnElement(ListMgr listmgr, int elemnum) { ElemPtr current; int count=0; if (EmptyList(listmgr)==1) /*if list is empty we can't return elem*/ return NULL; current=listmgr->head; while (current!=NULL) { if (count==elemnum) return current; current=current->next; count++; } return NULL; /*not enough elements in the list*/ } /*----------------------------------------------------------- -Funciton Name: InsertTail - -Description: -This function inserts the tail back into the linked list based -on ascending alphabetical order of the last name. We store -the new students added in the tail with default values until -they are editted and then odb.c calls inserttail. -Called by: odb.c - -Parameters: listmgr - list header data structure - -Author: Jon Ford -Revision: 3/27/96 -Version: 1.0 --------------------------------------------------------------*/ void InsertTail(ListMgr listmgr) { ElemPtr element, current; element=listmgr->tail; element->previous->next=NULL; /*this is the new end*/ listmgr->tail=element->previous; /*change the tail*/ /*if the element becomes the new head*/ if(strcmp(element->item.lastname,listmgr->head->item.lastname)<=0) { element->next=listmgr->head; element->previous=NULL; element->next->previous=element; listmgr->head=element; return; } current = listmgr->head; while (current!=NULL) { if (strcmp(element->item.lastname,current->item.lastname)<=0) { element->previous=current->previous; current->previous->next=element; element->next=current; current->previous=element; return; } current=current->next; } /*if we've made it this far we're at the tail*/ element->next=NULL; element->previous=listmgr->tail; listmgr->tail->next=element; listmgr->tail=element; return; } /*----------------------------------------------------------- -Funciton Name: ReturnNext - -Description: -This function returns a pointer to the element immediately -following the element passed to the function in the linked -list. - -Called by: odb.c - -Parameters: element - pointer to the current element - -Author: Jon Ford -Revision: 3/28/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr ReturnNext(ElemPtr element) { if (element==NULL) return NULL; else return element->next; } /*----------------------------------------------------------- -Funciton Name: ReturnPrevious - -Description: -This function returns a pointer to the element immediately -preceding the element passed to the function in the linked -list. - -Called by: odb.c - -Parameters: element - pointer to the current element - -Author: Jon Ford -Revision: 3/28/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr ReturnPrevious(ElemPtr element) { if(element==NULL) return NULL; else return element->previous; } /*----------------------------------------------------------- -Funciton Name: ReturnFirst - -Description: -This function returns a pointer to the first element in the -list specified by listmgr passed to the function. - -Called by: odb.c - -Parameters: listmgr - list header data structure - -Author: Jon Ford -Revision: 3/28/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr ReturnFirst(ListMgr listmgr) { if (listmgr==NULL) return NULL; else return listmgr->head; } /*----------------------------------------------------------- -Funciton Name: ReturnElement - -Description: -This function returns a pointer to the last element in the -list pointed to by listmgr. - -Called by: odb.c - -Parameters: listmgr - list header data structure - -Author: Jon Ford -Revision: 3/28/96 -Version: 1.0 --------------------------------------------------------------*/ ElemPtr ReturnLast(ListMgr listmgr) { if (listmgr==NULL) return NULL; else return listmgr->head; }