Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   sort list (http://www.go4expert.com/forums/sort-list-t817/)

musicmancanora4 20May2006 14:16

sort list
 
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;


}


Aztec 20May2006 16:06

Re: sort list
 
Use MergeSort

musicmancanora4 20May2006 16:27

Re: sort list
 
yehh but im unsure as to how i can use it?

Aztec 20May2006 16:29

Re: sort list
 
Have you tried using merge sort on numbers using arrays?

If not then try making one merge sort program. Link which I gave you will help you out.


All times are GMT +5.5. The time now is 06:01.