Hey guys just wondering how i can sort the linked list by categoryName
for the drink type list. Iv done the linked list in my code but its not sorted?





Code:
#ifndef GJC_H
#define GJC_H
/* System-wide header files. */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

/* System-wide constants. */
#define ID_LEN 5
#define MIN_NAME_LEN 1
#define MAX_NAME_LEN 25
#define MIN_DESC_LEN 1
#define MAX_DESC_LEN 250
#define NUM_PRICES 3
#define HOT 'H'
#define COLD 'C'
#define ERRORCODE 1
#define BUFFER_SIZE 800
#define NC_ARRAY_SIZE 500
#define TRUE 1
#define FALSE 0
#define CHAR -----------------------------------------------------------------------

typedef struct category* CategoryTypePtr;
typedef struct item* ItemTypePtr;

/* Structure definitions. */
typedef struct price
{
   unsigned dollars;
   unsigned cents;
} PriceType;

typedef struct item
{
   char itemID[ID_LEN + 1];
   char itemName[MAX_NAME_LEN + 1];
   PriceType prices[NUM_PRICES];
   char itemDescription[MAX_DESC_LEN];
   ItemTypePtr nextItem;
} ItemType;

typedef struct category
{
   char categoryID[ID_LEN + 1];
   char categoryName[MAX_NAME_LEN + 1];
   char drinkType;      /* (H)ot or (C)old. */
   char categoryDescription[MAX_DESC_LEN];
   CategoryTypePtr nextCategory;
   ItemTypePtr headItem;
   unsigned numItems;
} drinkType;

typedef struct gjc
{
   CategoryTypePtr headCategory;
   unsigned numCategories;
} GJCType;

int commandLineArguments(int argc, char *argv[]);
#endif





Code:
int loadData(GJCType* menu, char* menuFile, char* submenuFile)
{

   drinkType *currentCat, *prevCat, *newCat;
   ItemType *currentItem, *prevItem, *newItem;
   
   FILE *fp1;
   FILE *fp2;
   
   char *token, *line;
   char array[BUFFER_SIZE + 2];
   double d;
   unsigned doll;
   int i;
   char nc_array[NC_ARRAY_SIZE + 1];
   
   /* Open menu file for reading. */
   fp1 = fopen(menuFile, "r");
   
   /* check if fp1 menu file exists*/
   if(fp1 == NULL)
   {
      printf("file %s does not exist \n", menuFile);
      exit(0);
      
   }
   
   /* initialize the previous node to NULL*/
   prevCat = NULL;
   
   while((line = fgets(array, BUFFER_SIZE + 2, fp1)) != NULL)
   {
      /* allocate memory for CategoryType pointer*/
      newCat = malloc(sizeof(drinkType));
      
      /* check if memory allocation succeeded if fails exit*/
      if(newCat == NULL)
      {
          printf("Memory Allocation error for newCat\n");
	  exit(0);
      }
      
      /* if the prevCat is NULL point the new node to the 
      start of the list*/
      if(prevCat == NULL)
      {
         menu->headCategory = newCat;
      }
      /* if it isnt at the start get the next -1node*/
      else
      {
         prevCat->nextCategory = newCat;
      }
       
      
      /* tokenize the Pipe and copy the field
      pointers into the struct*/
           
      token = strtok(line, "|");
      strcpy(newCat->categoryID, token);
           
      token = strtok(NULL, "|");   
      newCat->drinkType = token[0];
      
      token = strtok(NULL, "|");
      strcpy(newCat->categoryName, token);
        
      token = strtok(NULL, "|");
      strcpy(newCat->categoryDescription, token);
   
      /* initialize everything to a safe state*/
      newCat->nextCategory = NULL;
      newCat->headItem = NULL;
      newCat->numItems = 0;
      prevCat = newCat;
   }
   
   /* the current pointer points to headCategory*/
   currentCat = menu->headCategory;
   
   /* for testing purposes traverse through the list
   and print out linked list*/
   /*
   while(currentCat != NULL)
   {
      printf("\n%s, %c, %s, %s", currentCat->categoryID, 
      currentCat->drinkType,
      currentCat->categoryName, 
      currentCat->categoryDescription);
    */  
      /* get the next row
      currentCat = currentCat->nextCategory;
   }*/
   
   /* close the first pointer to the file*/
   /* check if it can close it otherwise error*/
   if(fclose(fp1)!=0)
   {
       fprintf(stderr, "cannot close file\n");
   }
   
   
   /* Open submenu file for reading. */
   fp2 = fopen(submenuFile, "r");
   
   /* check if sub menu file exists*/
   if(fp2 == NULL)
   {
      printf("file %s does not exist \n", submenuFile);
      exit(0);
      
   }
   /*intialize pointer to the start*/
   prevItem = NULL;
   currentCat = menu->headCategory;
   
   while((line = fgets(array, BUFFER_SIZE + 2, fp2)) != NULL)
   {
      newItem = malloc(sizeof(ItemType));
    
      token = strtok(line, "|");
      strcpy(newItem->itemID, token);
      
      token = strtok(NULL, "|");
      strcpy(nc_array, token);
       
      /* put the current pointer to the head of the list*/
      currentCat = menu->headCategory;
      
      /* while current is pointing to a node*/
      
      while(currentCat != NULL)
      {
         if(strcmp(currentCat->categoryID, nc_array) == 0)
	 {
	    break;
	 }
	 
	 currentCat = currentCat->nextCategory;
      }
	 
	 if(currentCat == NULL)
	 {
	    printf("NULL POINTER Error!!!\n");
	 } 
	 else
	 {
            token = strtok(NULL, "|");
            strcpy(newItem->itemName, token);     
            
	    /* store dollars into struct array*/
	    /* convert all prices to float when storing*/
            for(i = 0; i < NUM_PRICES; i++)
            { 
               token = strtok(NULL, "|");
               d = atof(token); 
               doll = (unsigned) d;  
               newItem->prices[i].dollars = doll;
               newItem->prices[i].cents = (d - doll) * 100;
            }
      
            token = strtok(NULL, "|");
            strcpy(newItem->itemDescription, token);
      
            /* from the start of the list*/
            newItem->nextItem = currentCat->headItem;
            currentCat->headItem = newItem;
	    
	    /* increment the counter*/
	    currentCat->numItems ++;
	 }
      
   }
   currentCat = menu->headCategory;
   /*
   while(currentCat!= NULL)
   {
      currentItem = currentCat->headItem;
      printf("Items for category %s\n", currentCat->categoryID);
   
      while(currentItem != NULL)
      {
         printf("\n%s, %s, %s, %d.%d, %d.%d, %d.%d, %s\n", 
         currentItem->itemID, currentCat->categoryID,
         currentItem->itemName, currentItem->prices[0].dollars,currentItem->prices[0].cents,
         currentItem->prices[1].dollars, currentItem->prices[1].cents,
         currentItem->prices[2].dollars, currentItem->prices[2].cents,
         currentItem->itemDescription);
         currentItem = currentItem->nextItem;
      }
      
      currentCat = currentCat->nextCategory;  
   }*/
   /* try to close the file*/
   /* if it wont close provide an error*/
   if(fclose(fp2)!=0)
   {
       fprintf(stderr, "cannot close file\n");
   }
   
   
   return EXIT_SUCCESS;


}