鏈結串列 (~.exe by VS C++)
========================= Visual Studio 2022 ====================================
#include<stdlib.h>
#include<time.h>
struct Node {
int element;
struct Node* next;
};
// For singly circular list
struct Node* first = new struct Node;
struct Node* last = first;
// For linked stack
struct Node* top = new struct Node;
// For linked queue
struct Node* head = new struct Node;
first->element = -1;
first->next = first;
top->element = -1;
top->next = NULL;
head->element = -1;
head->next = NULL;
// 以上為 Global Variables
// 以下為在Class裡面的functions
private: void printList() {
struct Node* current = first->next;
while (current != first) {
richTextBox1->Text += current->element.ToString() + "->";
current = current->next;
}
richTextBox1->Text += "\n";
}
private: void insertFirst(int element) {
struct Node *newNode = new struct Node;
newNode->element = element;
newNode->next = first->next;
first->next = newNode;
if (last == first) { // 如果是第一個加入的節點
last = newNode;
}
}
private: void insertLast(int element) {
struct Node* newNode = new struct Node;
newNode->element = element;
newNode->next = first;
last->next = newNode;
last = newNode;
}
private: bool find(int target) {
struct Node* cur = first->next;
while (cur != first) {
if (cur->element == target) {
return true;
}
cur = cur->next;
}
return false;
}
private: void printStack() {
struct Node* cur = top->next;
while (cur != NULL) {
richTextBox2->Text += cur->element + "\n";
cur = cur->next;
}
richTextBox2->Text += "==================\n";
}
private: void push(int element) {
struct Node* newNode = new struct Node;
newNode->element = element;
newNode->next = top->next;
top->next = newNode;
}
private: void pop() {
if (top->next != NULL) {
struct Node* popNode = top->next;
int popElement = popNode->element;
top->next = popNode->next;
delete popNode;
label8->Text = popElement.ToString();
printStack();
}
else {
label8->Text = "";
richTextBox2->Text += "Stack empty.\n";
richTextBox2->Text += "==================\n";
}
}
private: void printQueue() {
struct Node* cur = head->next;
while (cur != NULL) {
richTextBox3->Text += cur->element + "->";
cur = cur->next;
}
richTextBox3->Text += "\n";
richTextBox3->Text += "==================\n";
}
private: void insertQ(int element) {
struct Node* newNode = new struct Node;
struct Node* cur = head;
newNode->element = element;
newNode->next = NULL;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = newNode;
}
private: void deleteQ() {
if (head->next != NULL) {
struct Node* cur = head->next;
head->next = cur->next;
label11->Text = cur->element.ToString();
printQueue();
delete cur;
}
else {
label11->Text = "";
richTextBox3->Text += "Queue empty.\n";
richTextBox3->Text += "==================\n";
}
}
// Insert as first
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int element = int::Parse(textBox1->Text);
insertFirst(element);
printList();
}
// Insert as last
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int element = int::Parse(textBox1->Text);
insertLast(element);
printList();
}
// Clear list
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
struct Node* cur = first->next;
struct Node* del;
while (cur != first) {
del = cur;
cur = cur->next;
delete del;
}
last = first;
first->next = first;
richTextBox1->Text += "===================================\n";
}
// Clear all
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
struct Node* cur = first->next;
struct Node* del;
while (cur != first) {
del = cur;
cur = cur->next;
delete del;
}
last = first;
first->next = first;
richTextBox1->Text = "";
}
// Random Generate
private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int n = int::Parse(textBox2->Text);
int range = int::Parse(textBox3->Text);
int element;
srand(time(NULL));
for (int i = 0; i < n; i++) {
element = rand()%range+1;
insertLast(element);
}
printList();
}
// Find
private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int target = int::Parse(textBox4->Text);
if (find(target)) {
richTextBox1->Text += "Found !\n";
}else {
richTextBox1->Text += "Not found !\n";
}
}
// Delete
private: System::Void button7_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int target = int::Parse(textBox4->Text);
if (find(target)) {
struct Node* cur = first;
struct Node* del;
while (cur->next != first) {
if (cur->next->element == target) {
del = cur->next;
cur->next = del->next;
if (del == last) {
last = cur;
}
delete del;
}
cur = cur->next;
}
printList();
}else {
richTextBox1->Text += "Not found !\n";
}
}
// Insert front
private: System::Void button8_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int target = int::Parse(textBox4->Text);
int element = int::Parse(textBox5->Text);
if (find(target)) {
struct Node* cur = first;
struct Node* newNode = new Node;
newNode->element = element;
while (cur->next != first) {
if (cur->next->element == target) {
newNode->next = cur->next;
cur->next = newNode;
break;
}
cur = cur->next;
}
printList();
}else {
richTextBox1->Text += "Not found !\n";
}
}
// Insert rear
private: System::Void button9_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(0);
int target = int::Parse(textBox4->Text);
int element = int::Parse(textBox5->Text);
if (find(target)) {
struct Node* cur = first->next;
struct Node* newNode = new Node;
newNode->element = element;
while (cur != first) {
if (cur->element == target) {
newNode->next = cur->next;
cur->next = newNode;
break;
}
cur = cur->next;
}
printList();
}else {
richTextBox1->Text += "Not found !\n";
}
}
// Push
private: System::Void button10_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(1);
int element = int::Parse(textBox6->Text);
push(element);
printStack();
}
// Pop
private: System::Void button11_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(1);
pop();
}
// Insert
private: System::Void button13_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(2);
int element = int::Parse(textBox7->Text);
insertQ(element);
printQueue();
}
// Delete
private: System::Void button12_Click(System::Object^ sender, System::EventArgs^ e) {
tabControl2->SelectTab(2);
deleteQ();
}