Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- typedef struct S_RacingCar {
- char name[12];
- char place[12];
- int speed;
- struct S_RacingCar *next;
- struct S_RacingCar *previous;
- } RacingCar;
- void PrintList(RacingCar *start) {
- RacingCar *currentCar = start;
- int count = 0;
- RacingCar *ahead = NULL;
- RacingCar *behind = NULL;
- while(currentCar != NULL) {
- count++;
- ahead = currentCar->next;
- behind = currentCar->previous;
- printf("Car:%d Name:%s Place:%s Speed:%d Ahead:%s Behind:%s\n",count,
- currentCar->name,
- currentCar->place,
- currentCar->speed,
- (ahead == NULL) ? "None" : ahead->name,
- (behind == NULL) ? "None" : behind->name
- );
- currentCar = currentCar->next;
- ahead = NULL;
- behind = NULL;
- }
- printf("Total Cars:%d\n",count);
- }
- RacingCar *MakeNewCar() {
- printf("Enter Name, Place And Speed: ");
- char input[16];
- fgets( input, 15, stdin);
- RacingCar *newCar = malloc(sizeof(RacingCar));
- sscanf(input, "%s %s %d", newCar->name, newCar->place, &newCar->speed);
- printf("Added:%s Place:%s Speed:%d\n\n",newCar->name, newCar->place, newCar->speed);
- newCar->next = NULL;
- newCar->previous = NULL;
- return newCar;
- }
- RacingCar *AddToStart(RacingCar *startPtr) {
- RacingCar *newCar = MakeNewCar();
- if(startPtr != NULL) {
- startPtr->previous = newCar;
- newCar->next = startPtr;
- }
- return newCar;
- }
- RacingCar *AddToEnd(RacingCar *startPtr) {
- RacingCar *returnPtr = startPtr;
- RacingCar *newCar = NULL;
- if(startPtr == NULL) {
- newCar = AddToStart(startPtr);
- returnPtr = newCar;
- } else {
- RacingCar *indexCar = startPtr;
- while (indexCar->next != NULL) {
- indexCar = indexCar->next;
- }
- newCar = MakeNewCar();
- indexCar->next = newCar;
- newCar->next = NULL;
- newCar->previous = indexCar;
- }
- return returnPtr;
- }
- RacingCar *Delete(RacingCar *startPtr) {
- printf("Enter Name To Delete:");
- char input[16];
- fgets(input, 15, stdin);
- RacingCar *carRef = startPtr;
- RacingCar *carToDelete = NULL;
- while(carRef != NULL) {
- if(strncmp(input, carRef->name, strlen(carRef->name)) == 0) {
- carToDelete = carRef;
- break;
- }
- carRef = carRef->next;
- }
- if(startPtr != NULL && carToDelete == startPtr) {
- if(carToDelete->next != NULL) {
- carToDelete->next->previous = NULL;
- startPtr = carToDelete->next;
- } else {
- startPtr = NULL;
- }
- } else {
- if(carToDelete != NULL) {
- if(carToDelete->previous != NULL) {
- carToDelete->previous->next = carToDelete->next;
- }
- if(carToDelete->next != NULL) {
- carToDelete->next->previous = carToDelete->previous;
- }
- }
- }
- if(carToDelete != NULL) {
- carToDelete = NULL;
- free(carToDelete);
- }
- return startPtr;
- }
- RacingCar *Insert(RacingCar *startPtr) {
- printf("Insert New Car After Car:");
- char input[16];
- fgets(input, 15, stdin);
- RacingCar *afterCar = startPtr;
- RacingCar *newCar = NULL;
- if(strncmp(input, afterCar->name, strlen(afterCar->name)) == 0) {
- newCar = MakeNewCar();
- } else {
- while(afterCar->next != NULL) {
- afterCar = afterCar->next;
- if(strncmp(input, afterCar->name, strlen(afterCar->name)) == 0) {
- newCar = MakeNewCar();
- break;
- }
- }
- }
- if(newCar != NULL) {
- newCar->next = afterCar->next;
- if(newCar->next != NULL) {
- newCar->next->previous = newCar;
- }
- afterCar->next = newCar;
- newCar->previous = afterCar;
- } else {
- printf("Car Not Found\n");
- }
- return startPtr;
- }
- void CleanUp(RacingCar *start) {
- RacingCar *freeMe = start;
- RacingCar *holdMe = NULL;
- while(freeMe != NULL) {
- holdMe = freeMe->next;
- printf("Free Name:%s Place:%s Speed:%d\n",
- freeMe->name,
- freeMe->place,
- freeMe->speed);
- free(freeMe);
- freeMe = holdMe;
- }
- }
- void WriteListToFile(RacingCar *start) {
- FILE *pFile;
- pFile = fopen("myList.bin", "wb");
- if(pFile != NULL) {
- RacingCar *currentCar = start;
- RacingCar *holdNext = NULL;
- RacingCar *holdPrevious = NULL;
- while(currentCar != NULL) {
- holdNext = currentCar->next;
- holdPrevious = currentCar->previous;
- currentCar->next = NULL;
- currentCar->previous = NULL;
- fseek(pFile, 0, SEEK_END);
- fwrite(currentCar, sizeof(RacingCar), 1, pFile);
- printf("Writing:%s to file\n",currentCar->name);
- currentCar->next = holdNext;
- currentCar->previous = holdPrevious;
- holdNext = NULL;
- holdPrevious = NULL;
- currentCar = currentCar->next;
- }
- fclose(pFile);
- pFile = NULL;
- } else {
- printf("FILE OPEN ERROR\n");
- }
- }
- RacingCar *ReadNextFromFile(RacingCar *start, FILE *pFile) {
- size_t returnValue;
- if(start == NULL) {
- start = malloc(sizeof(RacingCar));
- returnValue = fread(start, sizeof(RacingCar), 1, pFile);
- start->next = NULL;
- start->previous = NULL;
- } else {
- RacingCar *indexCar = start;
- RacingCar *newCar = malloc(sizeof(RacingCar));
- while(indexCar->next != NULL) {
- indexCar = indexCar->next;
- }
- returnValue = fread(newCar, sizeof(RacingCar), 1, pFile);
- indexCar->next = newCar;
- newCar->next = NULL;
- newCar->previous = indexCar;
- }
- return start;
- }
- RacingCar *ReadNextFromFile_mod(RacingCar *start, FILE *pFile) {
- size_t returnValue;
- if(start == NULL) {
- start = malloc(sizeof(RacingCar));
- returnValue = fread(start, sizeof(RacingCar), 1, pFile);
- start->next = NULL;
- start->previous = NULL;
- } else {
- RacingCar *indexCar = start;
- RacingCar *newCar = malloc(sizeof(RacingCar));
- while(indexCar->next != NULL) {
- indexCar = indexCar->next;
- }
- RacingCar temp;
- returnValue = fread(&temp, sizeof temp, 1, pFile);
- if (returnValue != 1) {
- if (ferror(pFile)) {
- puts("Error reading from file");
- }
- return start;
- }
- if (strncmp(temp.place, "street", sizeof temp.place)) {
- return start;
- }
- indexCar->next = newCar;
- newCar->next = NULL;
- newCar->previous = indexCar;
- }
- return start;
- }
- RacingCar *ReadListIn(RacingCar *start) {
- FILE *pFile;
- pFile = fopen("myList.bin", "rb");
- if(pFile != NULL) {
- CleanUp(start);
- start = NULL;
- fseek(pFile, 0, SEEK_END);
- long fileSize = ftell(pFile);
- rewind(pFile);
- int numEntries = (int)(fileSize / (sizeof(RacingCar)));
- printf("numEntries:%d\n",numEntries);
- int loop = 0;
- for(loop = 0; loop < numEntries; ++loop) {
- fseek(pFile, (sizeof(RacingCar) * loop), SEEK_SET);
- start = ReadNextFromFile(start, pFile);
- }
- } else {
- printf("FILE OPEN ERROR FOR READ\n");
- }
- return start;
- }
- RacingCar *ReadListIn_mod(RacingCar *start) {
- FILE *pFile;
- pFile = fopen("myList.bin", "rb");
- if(pFile != NULL) {
- CleanUp(start);
- start = NULL;
- fseek(pFile, 0, SEEK_END);
- long fileSize = ftell(pFile);
- rewind(pFile);
- int numEntries = (int)(fileSize / (sizeof(RacingCar)));
- printf("numEntries:%d\n",numEntries);
- int loop = 0;
- for(loop = 0; loop < numEntries; ++loop) {
- fseek(pFile, (sizeof(RacingCar) * loop), SEEK_SET);
- start = ReadNextFromFile_mod(start, pFile);
- }
- } else {
- printf("FILE OPEN ERROR FOR READ\n");
- }
- return start;
- }
- int main() {
- char command[16];
- char input[16];
- RacingCar *start = NULL;
- while( fgets( input, 15, stdin) ) {
- sscanf(input,"%s",command);
- if ( strncmp(command, "quit", 4) == 0) {
- printf("\n\nBreaking...\n");
- break;
- } else if ( strncmp(command, "print", 5) == 0) {
- PrintList(start);
- } else if ( strncmp(command, "write", 5) == 0) {
- WriteListToFile(start);
- } else if ( strncmp(command, "read", 4) == 0) {
- start = ReadListIn_mod(start);
- } else if ( strncmp(command, "addstart", 8) == 0) {
- start = AddToStart(start);
- PrintList(start);
- } else if ( strncmp(command, "add", 3) == 0) {
- start = AddToEnd(start);
- PrintList(start);
- } else if ( strncmp(command, "insert", 6) == 0) {
- if(start == NULL) {
- start = AddToStart(start);
- } else {
- start = Insert(start);
- }
- PrintList(start);
- }
- }
- CleanUp(start);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement