# 12523 - Inventory
>author: Utin
###### tags: `bubble sort`
---
## Brief
See the code below
## Solution 0 (Node Array)
```c=
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char name[21];
int c, m, status;
} Node;
Node arr[101]; // 存Node的陣列
void swap(int a, int b);
int main() {
int n;
int c, m;
Node* new_node;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s %d %d", arr[i].name, &arr[i].c, &arr[i].m);
if(arr[i].c < arr[i].m) arr[i].status = 0;
else arr[i].status = 1;
}
// bubble sort
for(int t = n; t > 0; t--) {
for(int i = 0; i < t-1; i++) {
if(arr[i].status > arr[i+1].status) swap(i, i+1);
else if(arr[i].status == arr[i+1].status) {
if(arr[i].status == 0) {
if(arr[i].c > arr[i+1].c) swap(i, i+1);
else if(arr[i].c == arr[i+1].c) {
if(arr[i].m > arr[i+1].m) swap(i, i+1);
}
}
else if(arr[i].m > arr[i+1].m) swap(i, i+1);
}
}
}
// output
for(int i = 0; i < n; i++) {
printf("%s %d %d\n", arr[i].name, arr[i].c, arr[i].m);
}
}
void swap(int a, int b) {
Node temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// By Utin
```
## Solution 1 (Node* Array)
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char name[21];
int c, m, status;
} Node;
Node* arr[101]; // 記Node的位址
void swap(int a, int b);
int main() {
int n;
Node* new_node;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
new_node = (Node*) malloc(sizeof(Node));
scanf("%s %d %d", new_node->name, &new_node->c, &new_node->m);
if(new_node->c < new_node->m) new_node->status = 0;
else new_node->status = 1;
arr[i] = new_node;
}
// bubble sort
for(int t = n; t > 0; t--) {
for(int i = 0; i < t-1; i++) {
if(arr[i]->status > arr[i+1]->status) swap(i, i+1);
else if(arr[i]->status == arr[i+1]->status) {
if(arr[i]->status == 0) {
if(arr[i]->c > arr[i+1]->c) swap(i, i+1);
else if(arr[i]->c == arr[i+1]->c) {
if(arr[i]->m > arr[i+1]->m) swap(i, i+1);
}
}
else if(arr[i]->m > arr[i+1]->m) swap(i, i+1);
}
}
}
// output
for(int i = 0; i < n; i++) {
printf("%s %d %d\n", arr[i]->name, arr[i]->c, arr[i]->m);
free(arr[i]);
}
}
void swap(int a, int b) {
Node* temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// By Utin
```
## Solution 2 (Linked List)
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char name[21];
int c, m, status;
struct node* next;
} Node;
Node* head = NULL;
Node* end = NULL;
Node* swap(Node* pre_a, Node* a, Node* b);
int main() {
int n;
char name[21];
int c, m;
Node* new_node;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
// 新增一個Node
new_node = (Node*) malloc(sizeof(Node));
scanf("%s %d %d", new_node->name, &new_node->c, &new_node->m);
if(new_node->c < new_node->m) new_node->status = 0;
else new_node->status = 1;
new_node->next = NULL;
// 放進連結串列
if(head == NULL) {
head = new_node;
end = new_node;
}
else {
end->next = new_node;
end = end->next;
}
}
Node* curr;
Node* pre_curr;
// bubble sort
for(int t = n; t > 0; t--) {
pre_curr = NULL;
curr = head;
for(int i = 0; i < t-1; i++) {
if(curr->status > curr->next->status)
curr = swap(pre_curr, curr, curr->next);
else if(curr->status == curr->next->status) {
if(curr->status == 0) {
if(curr->c > curr->next->c)
curr = swap(pre_curr, curr, curr->next);
else if(curr->c == curr->next->c) {
if(curr->m > curr->next->m)
curr = swap(pre_curr, curr, curr->next);
}
}
else if(curr->m > curr->next->m)
curr = swap(pre_curr, curr, curr->next);
}
pre_curr = curr;
curr = curr->next;
}
}
// output
curr = head;
pre_curr = NULL;
while(curr != NULL) {
printf("%s %d %d\n", curr->name, curr->c, curr->m);
pre_curr = curr;
curr = curr->next;
free(pre_curr);
}
}
Node* swap(Node* pre_a, Node* a, Node* b) {
// 有換到首項的情況
if(a == head) {
a->next = b->next;
b->next = a;
head = b;
}
// 其他情況
else {
pre_a->next = b;
a->next = b->next;
b->next = a;
}
// 因為要做bubble sort,所以要回傳前面節點的位址
return b;
}
// By Utin
```
## Reference