Definition.h
typedef struct _ListNode {
_ListNode* next;
int data;
}ListNode;
List.h
#include <iostream>
#include <stack>
#include "Definition.h"
class List {
public:
List();
List(const List& ls);
~List();
void AddEndNode(int val);
void AddFrontNode(int val);
void ShowList();
void ReverseShowList();
void InsertNode(int val, int loc);
void DeleteNode(int val);
void DeleteFrontNode();
void DeleteEndNode();
void ReverseList();
void RemoveList();
bool Find(int val);
bool IsEmpty();
private:
ListNode* head;
int length;
};
List::List()
{
head = new ListNode;
head->next = nullptr;
length = 0;
}
List::List(const List& ls)
{
head = new ListNode;
ListNode* node = ls.head->next;
ListNode* curNode = head;
while (node != nullptr) {
ListNode* tmp = new ListNode;
tmp->data = node->data;
tmp->next = nullptr;
curNode->next = tmp;
curNode = curNode->next;
node = node->next;
}
length = ls.length;
}
List::~List()
{
if (length) {
RemoveList();
delete head;
head = nullptr;
printf("Released~!\n");
}
else {
delete head;
head = nullptr;
printf("0 Released~!\n");
}
}
void List::AddEndNode(int val)
{
ListNode* p = head;
while (p->next != nullptr) {
p = p->next;
}
ListNode* newNode = new ListNode;
newNode->data = val;
newNode->next = nullptr;
p->next = newNode;
++length;
}
void List::AddFrontNode(int val)
{
ListNode* newNode = new ListNode;
newNode->data = val;
newNode->next = head->next;
head->next = newNode;
++length;
}
void List::ShowList()
{
if (!length) {
printf("List is empty!\n");
return;
}
ListNode* p = head->next;
while (p != nullptr) {
printf("%d-->", p->data);
p = p->next;
}
printf("ListEnd\n");
}
void List::ReverseShowList()
{
std::stack<int> s;
ListNode* p = head->next;
while (p != nullptr) {
s.push(p->data);
p = p->next;
}
while (!s.empty()) {
printf("%d<--", s.top());
s.pop();
}
printf("ListHead\n");
}
void List::InsertNode(int val, int loc)
{
ListNode* p = head->next;
while (p != nullptr) {
if (loc == p->data) break;
p = p->next;
}
ListNode* newNode = new ListNode;
newNode->data = val;
if (p != nullptr) {
newNode->next = p->next;
p->next = newNode;
++length;
}
}
void List::DeleteNode(int val)
{
if (!length) {
printf("List is empty!\n");
return;
}
ListNode* toBeDel = head->next;
ListNode* pre = head;
bool found = false;
while (toBeDel != nullptr) {
if (val == toBeDel->data) {
found = true;
break;
}
toBeDel = toBeDel->next;
pre = pre->next;
}
if (!found) {
printf("Node not been found!\n");
return;
}
else {
pre->next = toBeDel->next;
delete toBeDel;
toBeDel = nullptr;
--length;
}
}
void List::DeleteFrontNode()
{
if (!length) {
printf("List is empty!\n");
return;
}
ListNode* del = head->next;
head->next = del->next;
delete del;
del = nullptr;
}
void List::DeleteEndNode()
{
if (!length) {
printf("List is empty!\n");
return;
}
ListNode* pre = head;
ListNode* del = head->next;
while (del->next != nullptr) {
del = del->next;
pre = pre->next;
}
delete del;
del = nullptr;
pre->next = nullptr;
}
void List::ReverseList()
{
if (!head->next) {
printf("List is empty!\n");
return;
}
ListNode* pre = head->next, * node = head->next->next, * tmp;
pre->next = nullptr;
while (node) {
tmp = node->next;
node->next = pre;
pre = node;
node = tmp;
}
head->next = pre;
}
void List::RemoveList()
{
ListNode* p = head->next;
ListNode* del;
while (p != nullptr) {
del = p;
p = p->next;
delete del;
}
head->next = nullptr;
del = nullptr;
p = nullptr;
length = 0;
}
bool List::Find(int val)
{
ListNode* p = head->next;
while (p != nullptr) {
if (val == p->data) {
printf("Node %d has been found\n", val);
return true;
}
p = p->next;
}
printf("Node %d not been found\n", val);
return false;
}
bool List::IsEmpty()
{
return length == 0;
}
main.cpp(測試代碼)
#include <iostream>
#include "List.h"
int main()
{
List MyList;
MyList.ShowList();
MyList.AddEndNode(1);
MyList.AddEndNode(2);
MyList.AddEndNode(3);
MyList.InsertNode(6, 2);
MyList.AddFrontNode(5);
MyList.ShowList();
MyList.ReverseShowList();
MyList.Find(3);
MyList.DeleteNode(8);
MyList.DeleteNode(2);
MyList.ShowList();
MyList.DeleteFrontNode();
MyList.DeleteEndNode();
MyList.ShowList();
List YourList(MyList);
YourList.ShowList();
return 0;
}