Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef _CRT_SECURE_NO_WARNINGS
- #define _CRT_SECURE_NO_WARNINGS
- #endif
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<ctype.h>
- typedef struct{
- unsigned ID;
- char brand[51];
- unsigned year;
- unsigned power;
- double price;
- unsigned stock;
- }car;
- typedef struct Node{
- car data;
- struct Node* next;
- }node;
- //-----------------EDIT INFO-------------------------
- void edit(node** head);
- //----------------------INIT CAR------------------
- int isUnique(unsigned ID, node* head);
- car initCar(node* head);
- void printCar(car data);
- void printCarsAfterYear(node* head);
- //---------------------------NODES-----------------
- void printNode(node* head);
- void addNode(node** head, car data, int mode);
- void deleteNode(node** head);
- void deleteNodeAtPoss(node** head, int poss);
- //--------------------------SORT-------------------
- int nodesCounter(node* head);
- void swapNode(node** A, node** B);
- void bubbleSort(node** head);
- //---------------------FILES----------------------
- void getStr(char* str, int size);
- char* getFileName();
- void loadFile(node** head);
- void saveFile(node* head);
- int menu(){
- int i;
- printf(" __/MAIN MENU\\_______________________________\n");
- printf("| |\n");
- printf("| 1. LOAD DATA |\n");
- printf("| 2. SAVE DATA |\n");
- printf("| 3. ADD NEW CAR |\n");
- printf("| 4. EDIT INFO BY ID |\n");
- printf("| 5. PRINT ALL CARS SORTED BY YEAR |\n");
- printf("| 6. PRINT CARS PRODUCED AFTER GIVEN YEAR |\n");
- printf("| 0. EXIT |\n");
- printf("|____________________________________________|\n");
- do{
- printf("SELECT OPTION: ");
- fflush(stdin);
- scanf("%d", &i);
- } while (i < 0 || i > 6);
- return i;
- }
- int main(){
- node* head = NULL;
- while (1){
- system("cls");
- switch (menu()){
- case 1: loadFile(&head);
- break;
- case 2: saveFile(head);
- break;
- case 3: addNode(&head, initCar(head), 1);
- break;
- case 4: edit(&head);
- break;
- case 5: printNode(head);
- break;
- case 6: printCarsAfterYear(head);
- break;
- default:
- return 0;
- }
- system("pause");
- }
- }
- //-----------------EDIT INFO-------------------------
- void edit(node** head){
- int poss = 1;
- unsigned ID;
- node* temp = (*head);
- char c;
- if (!temp){
- printf("List is empty!\n");
- return;
- }
- printf("Enter ID: ");
- fflush(stdin);
- scanf("%u", &ID);
- while (temp){
- if (temp->data.ID == ID){
- printf("Old Year: %u\n", temp->data.year);
- while (1){
- printf("Enter New Year: ");
- fflush(stdin);
- scanf("%u", &temp->data.year);
- if (temp->data.year < 1900 || temp->data.year > 2015){
- continue;
- }
- break;
- }
- printf("Old Power(hp): %u\n", temp->data.power);
- printf("Enter New Power(hp): ");
- fflush(stdin);
- scanf("%u", &temp->data.power);
- printf("Old price: %.2lf\n", temp->data.price);
- do{
- printf("Enter New Price: ");
- fflush(stdin);
- scanf("%lf", &temp->data.price);
- } while (temp->data.price <= 0);
- printf("Old Stock: %u\n", temp->data.stock);
- while (1){
- printf("Enter New Stock: ");
- fflush(stdin);
- scanf("%u", &temp->data.stock);
- if (!temp->data.stock){
- printf("New Stock is Empty!\n");
- printf("Car will be deleted if not changed!\n");
- printf("Do you want to change stock value<Y/N>: ");
- fflush(stdin);
- c = toupper(getchar());
- if (c == 'Y'){
- continue;
- }
- else{
- deleteNodeAtPoss(head, poss);
- printf("Car is deleted!\n");
- return;
- }
- }
- break;
- }
- bubbleSort(head);
- printf("Info changed!\n");
- return;
- }
- temp = temp->next;
- ++poss;
- }
- printf("ID Not Found!\n");
- }
- //----------------------INIT CAR------------------
- int isUnique(unsigned ID, node* head){
- while (head){
- if (head->data.ID == ID){
- printf("ID Already Exist!\n");
- return 0;
- }
- head = head->next;
- }
- return 1;
- }
- car initCar(node* head){
- car newCar;
- char c;
- do{
- printf("Enter ID: ");
- fflush(stdin);
- scanf("%u", &newCar.ID);
- if (newCar.ID == 0){
- printf("ID Must be positive value!");
- }
- }while(!isUnique(newCar.ID, head) || !newCar.ID);
- printf("Enter Brand: ");
- getStr(newCar.brand, 50);
- while (1){
- printf("Enter Year: ");
- fflush(stdin);
- scanf("%u", &newCar.year);
- if (newCar.year < 1900 || newCar.year > 2015){
- continue;
- }
- break;
- }
- printf("Enter power(hp): ");
- fflush(stdin);
- scanf("%u", &newCar.power);
- do{
- printf("Enter Price: ");
- fflush(stdin);
- scanf("%lf", &newCar.price);
- } while (newCar.price <= 0);
- while (1){
- printf("Enter stock: ");
- fflush(stdin);
- scanf("%u", &newCar.stock);
- if (!newCar.stock){
- printf("Stock is empty!\n");
- printf("Do you want to enter new stock<Y/N>: ");
- fflush(stdin);
- c = toupper(getchar());
- if (c == 'Y'){
- continue;
- }
- }
- break;
- }
- return newCar;
- }
- void printCar(car data){
- printf("ID: %u\n", data.ID);
- printf("Brand: %s\n", data.brand);
- printf("Year: %u\n", data.year);
- printf("Power: %u hp\n", data.power);
- printf("Price: %.2lf\n", data.price);
- printf("Stock: %u\n", data.stock);
- }
- void printCarsAfterYear(node* head){
- unsigned year;
- int i = 0;
- if (!head){
- printf("List is Empty!\n");
- return;
- }
- do{
- printf("Enter Year: ");
- fflush(stdin);
- scanf("%u", &year);
- } while (year < 1900 || year > 2015);
- while (head){
- if (head->data.year >= year){
- printf("\t\tCar %d\n", ++i);
- printCar(head->data);
- }
- head = head->next;
- }
- if (!i){
- printf("No cars produced after %u found!\n", year);
- }
- }
- //---------------------------NODES-----------------
- void printNode(node* head){
- int i = 0;
- if (!head){
- printf("List is empty!\n");
- return;
- }
- printf("\n----------------------------------------");
- while (head){
- printf("\n\t\tCAR %d\n", ++i);
- printCar(head->data);
- head = head->next;
- }
- printf("----------------------------------------\n");
- }
- void addNode(node** head, car data, int mode){
- node* temp = (node*)malloc(sizeof(node));
- node* temp2 = *head;
- temp->data = data;
- temp->next = NULL;
- if (!(*head)){
- *head = temp;
- if (mode == 1)
- printf("First car added successfully!\n");
- return;
- }
- while (temp2->next){
- temp2 = temp2->next;
- }
- temp2->next = temp;
- if (mode == 1)
- printf("New car added successfully!\n");
- bubbleSort(head);
- }
- void deleteNode(node** head){
- node* temp;
- while (*head){
- temp = *head;
- *head = (*head)->next;
- free(temp);
- }
- }
- void deleteNodeAtPoss(node** head, int poss){
- int i;
- node *temp1 = (*head), *temp2;
- if (poss == 1){
- (*head) = temp1->next;
- free(temp1);
- return;
- }
- for (i = 0; i < poss - 2; i++){
- temp1 = temp1->next;
- //temp1 pointst to (n-1)th possition;
- }
- temp2 = temp1->next;//temp2 points to n-th poss Node;
- temp1->next = temp2->next;
- free(temp2);
- }
- //--------------------------SORT-------------------
- int nodesCounter(node* head){
- int n = 0;
- while (head){
- ++n;
- head = head->next;
- }
- return n;
- }
- void swapNode(node** A, node** B){
- car temp = (*(*A)).data;
- (*A)->data = (*B)->data;
- (*(*B)).data = temp;
- }
- void bubbleSort(node** head){
- node* temp = *head;
- int i, j;
- int n = nodesCounter(*head);
- if (!(*head)){
- printf("List is empty!\n");
- return;
- }
- for (i = 0; i < n - 1; i++, temp = (*head)){
- for (j = 0; j < n - i - 1; j++){
- if (temp->data.year > temp->next->data.year){
- swapNode(&temp, &temp->next);
- }
- temp = temp->next;
- }
- }
- }
- //---------------------FILES----------------------
- void getStr(char* str, int size){
- fflush(stdin);
- fgets(str, size * sizeof(char), stdin);
- str[strlen(str) - 1] = '\0';
- }
- char* getFileName(){
- char *fileName = (char*)malloc(50 * sizeof(char));
- printf("\nEnter file name: ");
- getStr(fileName, 50);
- if (!strchr(fileName, '.')){
- strcat(fileName, ".dat");
- }
- return fileName;
- }
- void loadFile(node** head){
- FILE* fp;
- car data;
- char *fileName;
- fileName = getFileName();
- if (!(fp = fopen(fileName, "rb"))){
- fprintf(stderr, "Error loading file!\a\n");
- free(fileName);
- return;
- }
- if (*head)
- deleteNode(head);
- while (1){
- if (!fread(&data, sizeof(data), 1, fp))
- break;
- addNode(head, data, 2);
- }
- fclose(fp);
- if (!(*head))
- printf("No data loaded from \"%s\"\n", fileName);
- else
- printf("Info loaded successfully from \"%s\"\n", fileName);
- free(fileName);
- }
- void saveFile(node* head){
- FILE* fp;
- char *fileName;
- if (!head){
- printf("List is empty!\n");
- printf("Add some new drugs first!\n");
- return;
- }
- fileName = getFileName();
- if (!(fp = fopen(fileName, "wb"))){
- exit(1);
- }
- while (head){
- if (fwrite(&head->data, sizeof(car), 1, fp) != 1){
- printf("Error occured while writing on file\n");
- exit(1);
- }
- head = head->next;
- }
- fclose(fp);
- printf("Info saved successfully to \"%s\"\n", fileName);
- free(fileName);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement