queue/queuedemo.h :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: queuedemo.h * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: header file for queuedemo.c *********************************************************************/ #define BUFSIZE 512 #define SMBUFSIZE 255 FILE* setup(char*); void fatal(char*, char*); [END: queue/queuedemo.h]======================================================== ================================================================================ ================================================================================ queue/queuedemo.c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: queuedemo.c * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: Demo of dynamic queue data structure. * * NOTES: Uses a simple struct containing a char* and int. * * Reads from filename supplied as command line arg. * * USAGE: At the command line, type: queuedemo data * *********************************************************************/ #include #include #include #include "queuedemo.h" #include "queue.h" int main(int argc, char* argv[]) { char buf[BUFSIZE], string[SMBUFSIZE], value[SMBUFSIZE]; node* front_node; FILE* fp = NULL; if(argc != 2) fatal("incorrect number of arguments", ""); fp = setup(argv[1]); printf("\n"); while(fgets(buf, BUFSIZE, fp) != NULL){ if(sscanf(buf, "%s%s", string, value) != 2) fatal("file is corrupt", ""); if(enqueue(string, value) != OK) fatal("memory failure", ""); } printf("\n"); while((front_node = dequeue()) != NULL){ printf("dequeuing: %s %d\n", front_node->str, front_node->num); delete_node(front_node); show_queue(); } fclose(fp); printf("\n"); return 0; } /********************************************************************/ FILE* setup(char* fname) { FILE* fp; fp = fopen(fname, "r"); if(!fp){ perror(fname); exit(1); } init_queue(); return fp; } /********************************************************************/ void fatal(char* s1, char* s2) { fprintf(stderr, "Error: %s %s\n", s1, s2); exit(1); } /********************************************************************/ [END: queue/queuedemo.c]======================================================== ================================================================================ ================================================================================ queue/queue.h :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: queue.h * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: header file for queue.c *********************************************************************/ #define NOT_OK 0 #define OK 1 struct node{ char* str; int num; struct node* next; }; typedef struct node node; void init_queue(); int enqueue(char*, char*); node* dequeue(); node* get_node(char*); void delete_node(node*); void show_queue(); [END: queue/queue.h]============================================================ ================================================================================ ================================================================================ queue/queue.c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /********************************************************************* * FILE: queue.c * AUTHOR: Mike McCarthy * HARVARD ID: 00161118 * DATE: June 2003 * PURPOSE: Implentation file for queue functions *********************************************************************/ #include #include #include #include "queuedemo.h" #include "queue.h" static node* front; /********************************************************************/ void init_queue() { front = NULL; } /********************************************************************/ int enqueue(char* s1, char* s2) { node* new_node, *temp, *tail; new_node = get_node(s1); if(new_node == NULL) return NOT_OK; strcpy(new_node->str, s1); new_node->num = atoi(s2); printf("enqueuing: %s %d\n", new_node->str, new_node->num); if(front == NULL){ front = new_node; new_node->next = NULL; } else{ temp = front; while(temp != NULL){ tail = temp; temp = temp->next; } tail->next = new_node; new_node->next = NULL; } show_queue(); return OK; } /********************************************************************/ node* get_node(char* str) { node* new_node = malloc(sizeof(node)); if(!new_node) return NULL; new_node->str = malloc(strlen(str) + 1); if(!new_node->str) return NULL; return new_node; } /********************************************************************/ node* dequeue() { node* dequeued_front; if(front == NULL) return NULL; dequeued_front = front; front = front->next; return dequeued_front; } /********************************************************************/ void delete_node(node* node_to_delete) { free(node_to_delete->str); free(node_to_delete); } /********************************************************************/ void show_queue() { node* temp; temp = front; printf("\tQUEUE CONTAINS: "); while(temp != NULL){ printf("%s ", temp->str); temp = temp->next; } printf("\n"); } /********************************************************************/ [END: queue/queue.c]============================================================ ================================================================================ ================================================================================