#include <bits/stdc++.h>
using namespace std;
struct node {
int real_order; //真實的順序
string order; //病人的號碼
string id; //病人的身分證字號
string name; //病人的名字
node *next;
};
node *head = new node;
int r_order = 0; //真實總人數
//掛號
void add_node (string order, string id, string name) {
node *temp = head;
//掛第一號的情況
if (r_order == 0) {
//開始新增節點
head -> real_order = r_order;
head -> order = order;
head -> id = id;
head -> name = name;
r_order += 1;
}
//掛其他號的情況
else {
//搜尋目標節點
for (int i=0; i<r_order-1; i++) {
if (temp -> next -> order > order) break;
temp = temp -> next;
}
//開始新增節點
node *new_node = new node;
new_node -> next = temp -> next;
temp -> next = new_node;
new_node -> real_order = temp -> real_order+1;
new_node -> order = order;
new_node -> id = id;
new_node -> name = name;
r_order += 1;
//新增的節點後面的節點真實順序+1
temp = new_node -> next;
for (int i=new_node -> real_order+1; i<r_order; i++) {
temp -> real_order += 1;
temp = temp -> next;
}
}
}
//取消掛號
void delete_node (string id) {
node *temp = head;
//判斷ID number是否存在
if (r_order == 1 && head -> id != id) {
cout << "Please enter a correct ID number!\n" << '\n';
return;
}
//取消首項的情況
if (head -> id == id) {
//開始刪除節點
if (r_order == 1) {
free(head); //釋放記憶體
head = new node;
}
else {
head = temp -> next;
free(temp); //釋放記憶體
temp = head;
//刪除的節點後面的節點真實順序-1
for (int i=temp -> real_order; i< r_order; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
r_order -= 1;
}
//取消其他項的情況
else {
//搜尋目標節點
for (int i=0; i<r_order-1; i++) {
if (temp -> next -> id == id) break;
//判斷ID number是否存在
else if (i == r_order-2) {
cout << "Please enter a correct ID number!\n" << '\n';
return;
}
temp = temp -> next;
}
//開始刪除節點
//刪除最後一項
if (temp -> next -> real_order == r_order-1) {
temp -> next = NULL;
}
//刪除其他項
else {
temp -> next = temp -> next -> next;
temp = temp -> next;
//刪除的節點後面的節點真實順序-1
for (int i=temp -> real_order; i< r_order-1; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
r_order -= 1;
}
}
//過號
void drag_node (string id) {
node *temp = head;
node *target;
//判斷ID number是否存在
if (r_order == 1 && head -> id != id) {
cout << "Please enter a correct ID number!\n" << '\n';
return;
}
//第一項過號
if (head -> id == id) {
//開始拖動節點
//長度>=5的串列情況
if (r_order >= 5) {
head = temp -> next;
if (temp -> order[temp -> order.size()-1] != '*') temp -> order += '*'; //標註過號
target = temp -> next -> next -> next;
temp -> next = target -> next;
target -> next = temp;
temp -> real_order = target -> real_order;
target = temp;
temp = head;
//越過的節點真實順序-1
for (int i=0; i<3; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
//長度>=2且<5的情況
else if (r_order >= 2) {
head = temp -> next;
if (temp -> order[temp -> order.size()-1] != '*') temp -> order += '*'; //標註過號
target = temp;
//搜尋目標節點位置
for (int i=0; i<r_order-1; i++) {
target = target -> next;
}
temp -> real_order = target -> real_order;
target -> next = temp;
temp -> next = NULL;
temp = head;
//越過的節點真實順序-1
for (int i=0; i<r_order-1; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
}
//其他項過號
else {
for (int i=0; i<r_order-1; i++) {
if (temp -> next -> id == id) {
//判斷該號是否為最後一號
if (i == r_order-2) {
cout << "This is the last person!\n" << '\n';
return;
}
break;
}
//判斷ID number是否存在
else if (i == r_order-2) {
cout << "Please enter a correct ID number!\n" << '\n';
return;
}
temp = temp -> next;
}
node *pre_temp = temp;
temp = pre_temp -> next;
if (temp -> order[temp -> order.size()-1] != '*') temp -> order += '*'; //標註過號
int r_minus = r_order - temp -> real_order;
//開始拖動節點
//從該節點到最後一個節點>=5項的情況
if (r_minus >= 5) {
target = temp -> next -> next -> next;
pre_temp -> next = temp -> next;
temp -> next = target -> next;
target -> next = temp;
temp -> real_order = target -> real_order;
temp = pre_temp -> next;
//越過的節點真實順序-1
for (int i=0; i<3; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
//其他情況
else {
pre_temp -> next = temp -> next;
target = temp;
for (int i=0; i<r_minus-1; i++) {
target = target -> next;
}
target -> next = temp;
temp -> next = NULL;
temp -> real_order = target -> real_order;
temp = pre_temp -> next;
//越過的節點真實順序-1
for (int i=0; i<r_minus-1; i++) {
temp -> real_order -= 1;
temp = temp -> next;
}
}
}
}
//輸出病人排序清單
void print_list () {
node *temp = head;
cout << "Patients order list:\n";
if (r_order == 0) cout << "None\n"; //判斷是否有連結串列
else {
for (int i=0; i<r_order; i++) {
cout << temp -> order << ' ' << temp -> id << ' ' << temp -> name << '\n';
temp = temp -> next;
}
}
cout << '\n';
}
int main () {
cout << "TS Hospital online appointment system\n" << '\n' << '\n';
cout << "Please choose one task:\n" << '\n' << "A. Make an appointment.\nB. Cancel an appointment.\nC. Miss\nD. End\n" << '\n';
string to_do;
while (getline(cin, to_do)) {
if (to_do.size() == 0) continue; //無輸入不回應
if (to_do == "A" || to_do == "a") {
cout << "Enter (number, ID number, Name)\n" << '\n';
string order, id, name;
cin >> order >> id;
getline(cin, name);
add_node(order, id, name);
print_list();
cout << '\n';
}
else if (to_do == "B" || to_do == "b") {
if (r_order == 0) {
cout << "Please make an appointment first!\n" << '\n' << '\n';
cout << "Please choose one task:\n" << '\n' << "A. Make an appointment.\nB. Cancel an appointment.\nC. Miss\nD. End\n" << '\n';
continue;
}
cout << "Enter (ID number)\n" << '\n';
string id;
cin >> id;
delete_node(id);
print_list();
cout << '\n';
}
else if (to_do == "c" || to_do == "C") {
if (r_order == 0) {
cout << "Please make an appointment first!\n" << '\n' << '\n';
cout << "Please choose one task:\n" << '\n' << "A. Make an appointment.\nB. Cancel an appointment.\nC. Miss\nD. End\n" << '\n';
continue;
}
if(r_order > 1) {
cout << "Enter (ID number)\n" << '\n';
string id;
cin >> id;
drag_node(id);
}
else cout << "There is only one patient!\n" << '\n';
print_list();
cout << '\n';
}
else if (to_do == "d" || to_do == "D") break;
else cout << "Please enter a correct command\n" << '\n'; //指令輸入錯誤
to_do.clear();
cout << "Please choose one task:\n" << '\n' << "A. Make an appointment.\nB. Cancel an appointment.\nC. Miss\nD. End\n" << '\n';
}
return 0;
}