Quiz 05 === # [A] PetsTransaction [Quiz 04 [C] PetsTransaction](https://hackmd.io/@nnyjan02426/cp2_quiz04#C-PetsTransaction) # [B] PetStack ## Code ```c= #include <stdio.h> #include <stdlib.h> enum data_type{ BREED, ORIGIN, TYPE, BODY, COAT }; typedef struct{ char data_type[5][256]; unsigned int price; }pet; typedef struct stack{ pet *pet_ptr; struct stack *below; }stack; stack* push(stack *top, pet *pet_ptr); stack* pop(stack *top); int main(){ FILE *rPtr = fopen("test_input_PetStack.txt", "rb"); pet Pets[500]; stack *top = NULL; for(int i=0; i<500; i++){ fread(&Pets[i], sizeof(pet), 1, rPtr); top = push(top, &Pets[i]); } fclose(rPtr); FILE *wPtr = fopen("my_output_PetStack.txt", "w+"); fprintf(wPtr, "====================================================================================\n"); fprintf(wPtr, "Breed Origin Type Body Coat Price\n"); fprintf(wPtr, "------------------------------------------------------------------------------------\n"); for(int i=0; i<500; i++){ fprintf(wPtr, "%-25s%-22s %-6c%-12s%-12s%5u\n", top->pet_ptr->data_type[BREED], top->pet_ptr->data_type[ORIGIN], top->pet_ptr->data_type[TYPE][0], top->pet_ptr->data_type[BODY], top->pet_ptr->data_type[COAT], top->pet_ptr->price); //printf("%-25s%-22s %-6c%-12s%-12s%5u\n", top->pet_ptr->data_type[BREED], top->pet_ptr->data_type[ORIGIN], top->pet_ptr->data_type[TYPE][0], top->pet_ptr->data_type[BODY], top->pet_ptr->data_type[COAT], top->pet_ptr->price); top = pop(top); } fprintf(wPtr, "====================================================================================\n"); } stack* push(stack *top, pet *pet_ptr){ stack *new_stack = malloc(sizeof(stack)); new_stack->pet_ptr = pet_ptr; new_stack->below = top; return new_stack; } stack* pop(stack *top){ stack *new_top = top->below; free(top); return new_top; } ``` # [C] PetList >Note: >此題目要求要寫出給Linked List 的函式delete,此題不會用到,就不另外寫出來了。 >老實說,我也不是很確定traverse是什麼,所以就隨便寫一寫了,反正if it works, it works! ## Code ```c= #include <stdio.h> #include <stdlib.h> enum data_type{ BREED, ORIGIN, TYPE, BODY, COAT }; typedef struct{ char data_type[5][256]; unsigned int price; }pet; typedef struct node{ pet *pet_ptr; struct node* next_node; }Node; Node* add(Node* start, pet *pet_ptr); int compare(pet *pet1, pet *pet2); int main(){ FILE *rPtr = fopen("test_input_PetList.txt", "rb"); pet pets[500]; Node* start = NULL; for(int i=0; i<500; i++){ fread(&pets[i], sizeof(pet), 1, rPtr); start = add(start, &pets[i]); } fclose(rPtr); FILE *wPtr = fopen("my_output_PetList.txt", "wb+"); fprintf(wPtr, "====================================================================================\n"); fprintf(wPtr, "Breed Origin Type Body Coat Price\n"); fprintf(wPtr, "------------------------------------------------------------------------------------\n"); for(int i=0; i<500; i++){ fprintf(wPtr, "%-25s%-22s %-6c%-12s%-12s%5u\n", start->pet_ptr->data_type[BREED], start->pet_ptr->data_type[ORIGIN], start->pet_ptr->data_type[TYPE][0], start->pet_ptr->data_type[BODY], start->pet_ptr->data_type[COAT], start->pet_ptr->price); start = start->next_node; } fprintf(wPtr, "====================================================================================\n"); fclose(wPtr); } int compare(pet *pet1, pet *pet2){ for(enum data_type data_type=ORIGIN; data_type<=COAT; data_type++){ for(int i=0; i<256; i++){ if(pet1->data_type[data_type][i] != pet2->data_type[data_type][i]){ return pet1->data_type[data_type][i] > pet2->data_type[data_type][i]; } } } for(int i=0; i<256; i++){ if(pet1->data_type[BREED][i] != pet2->data_type[BREED][i]){ return pet1->data_type[BREED][i] > pet2->data_type[BREED][i]; } } } Node* add(Node* start, pet *pet_ptr){ Node *new_node = malloc(sizeof(Node)); new_node->pet_ptr = pet_ptr; Node *prev = NULL; Node *curr = start; while((curr != NULL) && (compare(pet_ptr, curr->pet_ptr))){ prev = curr; curr = curr->next_node; } if(prev == NULL){ new_node->next_node = curr; return new_node; } prev->next_node = new_node; new_node->next_node = curr; return start; } ``` ###### tags: `程設二quiz`