Advertisement
Guest User

Untitled

a guest
Jun 1st, 2015
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.87 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4.  
  5. typedef struct S_RacingCar {
  6.  
  7.     char name[12];
  8.     char place[12];
  9.     int speed;
  10.     struct S_RacingCar *next;
  11.     struct S_RacingCar *previous;
  12.      
  13. } RacingCar;
  14.  
  15. void PrintList(RacingCar *start) {
  16.     RacingCar *currentCar = start;
  17.     int count = 0;
  18.      
  19.     RacingCar *ahead = NULL;
  20.     RacingCar *behind = NULL;
  21.      
  22.     while(currentCar != NULL) {
  23.         count++;
  24.          
  25.         ahead = currentCar->next;
  26.         behind = currentCar->previous;
  27.          
  28.         printf("Car:%d Name:%s Place:%s Speed:%d Ahead:%s Behind:%s\n",count,
  29.             currentCar->name,
  30.             currentCar->place,
  31.             currentCar->speed,
  32.             (ahead == NULL) ? "None" : ahead->name,
  33.             (behind == NULL) ? "None" : behind->name
  34.             );
  35.         currentCar = currentCar->next;
  36.         ahead = NULL;
  37.         behind = NULL;
  38.     }    
  39.     printf("Total Cars:%d\n",count);
  40. }
  41.  
  42. RacingCar *MakeNewCar() {
  43.  
  44.     printf("Enter Name, Place And Speed: ");
  45.     char input[16];
  46.     fgets( input, 15, stdin);
  47.      
  48.     RacingCar *newCar = malloc(sizeof(RacingCar));
  49.     sscanf(input, "%s %s %d", newCar->name, newCar->place, &newCar->speed);
  50.     printf("Added:%s Place:%s Speed:%d\n\n",newCar->name, newCar->place, newCar->speed);
  51.      
  52.     newCar->next = NULL;
  53.     newCar->previous = NULL;
  54.      
  55.     return newCar;
  56. }
  57.  
  58. RacingCar *AddToStart(RacingCar *startPtr) {
  59.     RacingCar *newCar = MakeNewCar();
  60.     if(startPtr != NULL) {
  61.         startPtr->previous = newCar;
  62.         newCar->next = startPtr;
  63.     }
  64.      
  65.     return newCar;
  66. }
  67.  
  68. RacingCar *AddToEnd(RacingCar *startPtr) {
  69.     RacingCar *returnPtr = startPtr;
  70.     RacingCar *newCar = NULL;
  71.      
  72.     if(startPtr == NULL) {
  73.         newCar = AddToStart(startPtr);
  74.         returnPtr = newCar;
  75.     } else {
  76.         RacingCar *indexCar = startPtr;
  77.         while (indexCar->next != NULL) {
  78.             indexCar = indexCar->next;
  79.         }
  80.         newCar = MakeNewCar();
  81.         indexCar->next = newCar;
  82.         newCar->next = NULL;
  83.         newCar->previous = indexCar;
  84.     }
  85.     return returnPtr;
  86. }
  87.  
  88. RacingCar *Delete(RacingCar *startPtr) {
  89.  
  90.     printf("Enter Name To Delete:");
  91.     char input[16];
  92.     fgets(input, 15, stdin);
  93.      
  94.     RacingCar *carRef = startPtr;
  95.     RacingCar *carToDelete = NULL;
  96.      
  97.     while(carRef != NULL) {
  98.      
  99.         if(strncmp(input, carRef->name, strlen(carRef->name)) == 0) {
  100.             carToDelete = carRef;
  101.             break;
  102.         }
  103.          
  104.         carRef = carRef->next;
  105.     }
  106.      
  107.     if(startPtr != NULL && carToDelete == startPtr) {
  108.         if(carToDelete->next != NULL) {
  109.             carToDelete->next->previous = NULL;
  110.             startPtr = carToDelete->next;
  111.         } else {
  112.             startPtr = NULL;
  113.         }
  114.     } else {
  115.         if(carToDelete != NULL) {
  116.             if(carToDelete->previous != NULL) {
  117.                 carToDelete->previous->next = carToDelete->next;
  118.             }
  119.              
  120.             if(carToDelete->next != NULL) {
  121.                 carToDelete->next->previous = carToDelete->previous;
  122.             }
  123.         }
  124.     }
  125.      
  126.     if(carToDelete != NULL) {
  127.         carToDelete = NULL;
  128.         free(carToDelete);
  129.     }
  130.      
  131.     return startPtr;
  132.      
  133. }
  134.  
  135. RacingCar *Insert(RacingCar *startPtr) {
  136.     printf("Insert New Car After Car:");
  137.     char input[16];
  138.     fgets(input, 15, stdin);
  139.      
  140.     RacingCar *afterCar = startPtr;
  141.     RacingCar *newCar = NULL;
  142.      
  143.     if(strncmp(input, afterCar->name, strlen(afterCar->name)) == 0) {
  144.         newCar = MakeNewCar();
  145.     } else {
  146.         while(afterCar->next != NULL) {
  147.             afterCar = afterCar->next;
  148.             if(strncmp(input, afterCar->name, strlen(afterCar->name)) == 0) {
  149.                 newCar = MakeNewCar();
  150.                 break;
  151.             }
  152.         }
  153.     }
  154.      
  155.     if(newCar != NULL) {
  156.         newCar->next = afterCar->next;
  157.         if(newCar->next != NULL) {
  158.             newCar->next->previous = newCar;
  159.         }
  160.         afterCar->next = newCar;
  161.         newCar->previous = afterCar;
  162.     } else {
  163.         printf("Car Not Found\n");
  164.     }
  165.      
  166.     return startPtr;
  167. }
  168.  
  169. void CleanUp(RacingCar *start) {
  170.      
  171.     RacingCar *freeMe = start;
  172.     RacingCar *holdMe = NULL;    
  173.     while(freeMe != NULL) {
  174.         holdMe = freeMe->next;
  175.         printf("Free Name:%s Place:%s Speed:%d\n",
  176.             freeMe->name,
  177.             freeMe->place,
  178.             freeMe->speed);
  179.         free(freeMe);
  180.         freeMe = holdMe;
  181.     }    
  182. }
  183.  
  184. void WriteListToFile(RacingCar *start) {
  185.     FILE *pFile;
  186.     pFile = fopen("myList.bin", "wb");
  187.      
  188.     if(pFile != NULL) {
  189.         RacingCar *currentCar = start;
  190.          
  191.         RacingCar *holdNext = NULL;
  192.         RacingCar *holdPrevious = NULL;
  193.          
  194.         while(currentCar != NULL) {
  195.             holdNext = currentCar->next;
  196.             holdPrevious = currentCar->previous;
  197.              
  198.             currentCar->next = NULL;
  199.             currentCar->previous = NULL;
  200.              
  201.             fseek(pFile, 0, SEEK_END);
  202.             fwrite(currentCar, sizeof(RacingCar), 1, pFile);
  203.              
  204.             printf("Writing:%s to file\n",currentCar->name);
  205.              
  206.             currentCar->next = holdNext;
  207.             currentCar->previous = holdPrevious;
  208.              
  209.             holdNext = NULL;
  210.             holdPrevious = NULL;
  211.              
  212.             currentCar = currentCar->next;
  213.         }
  214.         fclose(pFile);
  215.         pFile = NULL;
  216.     } else {
  217.         printf("FILE OPEN ERROR\n");
  218.     }
  219.      
  220. }
  221.  
  222. RacingCar *ReadNextFromFile(RacingCar *start, FILE *pFile) {
  223.     size_t returnValue;
  224.     if(start == NULL) {
  225.         start = malloc(sizeof(RacingCar));
  226.         returnValue = fread(start, sizeof(RacingCar), 1, pFile);
  227.         start->next = NULL;
  228.         start->previous = NULL;
  229.     } else {
  230.         RacingCar *indexCar = start;
  231.         RacingCar *newCar = malloc(sizeof(RacingCar));
  232.         while(indexCar->next != NULL) {
  233.             indexCar = indexCar->next;
  234.         }
  235.         returnValue = fread(newCar, sizeof(RacingCar), 1, pFile);
  236.         indexCar->next = newCar;
  237.         newCar->next = NULL;
  238.         newCar->previous = indexCar;
  239.     }
  240.     return start;
  241. }
  242.  
  243. RacingCar *ReadNextFromFile_mod(RacingCar *start, FILE *pFile) {
  244.     size_t returnValue;
  245.     if(start == NULL) {
  246.         start = malloc(sizeof(RacingCar));
  247.         returnValue = fread(start, sizeof(RacingCar), 1, pFile);
  248.         start->next = NULL;
  249.         start->previous = NULL;
  250.     } else {
  251.         RacingCar *indexCar = start;
  252.         RacingCar *newCar = malloc(sizeof(RacingCar));
  253.         while(indexCar->next != NULL) {
  254.             indexCar = indexCar->next;
  255.         }
  256.         RacingCar temp;
  257.         returnValue = fread(&temp, sizeof temp, 1, pFile);
  258.         if (returnValue != 1) {
  259.             if (ferror(pFile)) {
  260.                 puts("Error reading from file");
  261.             }
  262.             return start;
  263.         }
  264.  
  265.         if (strncmp(temp.place, "street", sizeof temp.place)) {
  266.             return start;
  267.         }
  268.         indexCar->next = newCar;
  269.         newCar->next = NULL;
  270.         newCar->previous = indexCar;
  271.     }
  272.     return start;
  273. }
  274.  
  275. RacingCar *ReadListIn(RacingCar *start) {
  276.      
  277.     FILE *pFile;
  278.     pFile = fopen("myList.bin", "rb");
  279.     if(pFile != NULL) {
  280.      
  281.         CleanUp(start);
  282.         start = NULL;
  283.          
  284.         fseek(pFile, 0, SEEK_END);
  285.         long fileSize = ftell(pFile);
  286.         rewind(pFile);
  287.          
  288.         int numEntries = (int)(fileSize / (sizeof(RacingCar)));
  289.         printf("numEntries:%d\n",numEntries);
  290.          
  291.         int loop = 0;
  292.         for(loop = 0; loop < numEntries; ++loop) {
  293.             fseek(pFile, (sizeof(RacingCar) * loop), SEEK_SET);
  294.             start = ReadNextFromFile(start, pFile);
  295.         }
  296.     }  else {
  297.         printf("FILE OPEN ERROR FOR READ\n");
  298.     }
  299.      
  300.     return start;
  301.  
  302. }
  303.  
  304. RacingCar *ReadListIn_mod(RacingCar *start) {
  305.      
  306.     FILE *pFile;
  307.     pFile = fopen("myList.bin", "rb");
  308.     if(pFile != NULL) {
  309.      
  310.         CleanUp(start);
  311.         start = NULL;
  312.          
  313.         fseek(pFile, 0, SEEK_END);
  314.         long fileSize = ftell(pFile);
  315.         rewind(pFile);
  316.          
  317.         int numEntries = (int)(fileSize / (sizeof(RacingCar)));
  318.         printf("numEntries:%d\n",numEntries);
  319.          
  320.         int loop = 0;
  321.         for(loop = 0; loop < numEntries; ++loop) {
  322.             fseek(pFile, (sizeof(RacingCar) * loop), SEEK_SET);
  323.             start = ReadNextFromFile_mod(start, pFile);
  324.         }
  325.     }  else {
  326.         printf("FILE OPEN ERROR FOR READ\n");
  327.     }
  328.      
  329.     return start;
  330.  
  331. }
  332.  
  333. int main() {    
  334.      
  335.     char command[16];
  336.     char input[16];    
  337.      
  338.     RacingCar *start = NULL;
  339.      
  340.     while( fgets( input, 15, stdin) ) {
  341.          
  342.         sscanf(input,"%s",command);    
  343.          
  344.         if ( strncmp(command, "quit", 4) == 0) {
  345.             printf("\n\nBreaking...\n");
  346.             break;        
  347.         } else if ( strncmp(command, "print", 5) == 0) {
  348.             PrintList(start);
  349.         } else if ( strncmp(command, "write", 5) == 0) {
  350.             WriteListToFile(start);
  351.         } else if ( strncmp(command, "read", 4) == 0) {
  352.             start = ReadListIn_mod(start);
  353.         } else if ( strncmp(command, "addstart", 8) == 0) {
  354.             start = AddToStart(start);
  355.             PrintList(start);
  356.         } else if ( strncmp(command, "add", 3) == 0) {
  357.             start = AddToEnd(start);
  358.             PrintList(start);
  359.         } else if ( strncmp(command, "insert", 6) == 0) {
  360.             if(start == NULL) {
  361.                 start = AddToStart(start);
  362.             } else {
  363.                 start = Insert(start);
  364.             }
  365.             PrintList(start);
  366.         }
  367.     }
  368.      
  369.     CleanUp(start);
  370.      
  371.     return 0;
  372.  
  373. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement