单链表的基本操作
#include<iostream>
using namespace std;
typedef int Type;
class Node
{
public:
int data;
Node* next;
};
class LinkList
{
public:
LinkList();
~LinkList();
void CreatLinkList();
void PrintLinkList();
int GetLinkListLength();
bool IsEmpty();
void InsertHead(Type data);
void InsertRear(Type data);
void InsertAppoint(Type data,int n);
void DeleteHead();
void DeleteRear();
void DeleteAppoint(Type data);
void DeleteAll();
Node* Find(Type data);
private:
Node* head;
};
LinkList::LinkList()
{
head = new Node;
head->data = 0;
head->next = NULL;
}
LinkList::~LinkList()
{
delete head;
}
void LinkList::CreatLinkList()
{
Node* pnew,*ptemp=head;
cout << "请输入数据建立链表,输入数字1003作为建立链表的结束" << endl;
pnew = new Node;
cin >> pnew->data;
pnew->next = NULL;
while (pnew->data != 1003)
{
ptemp->next = pnew;
ptemp = pnew;
pnew = new Node;
cin >> pnew->data;
pnew->next = NULL;
}
}
void LinkList::PrintLinkList()
{
if (IsEmpty())
{
cout << "链表为空" << endl;
return;
}
cout << "链表的打印结果为:" << endl;
Node* p = head->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int LinkList::GetLinkListLength()
{
if (IsEmpty())
{
cout << "链表的长度为0" << endl;
}
Node* p = head;
int count=0;
while (p->next)
{
p = p->next;
count++;
}
return count;
}
bool LinkList::IsEmpty()
{
if (!head||!head->next)
{
return true;
}
else
{
return false;
}
}
void LinkList::InsertHead(Type data)
{
Node* newNode = new Node;
newNode->data = data;
if (!head)
{
head = newNode;
}
newNode->next = head->next;
head->next = newNode;
}
void LinkList::InsertRear(Type data)
{
Node* newNode = new Node;
newNode->data = data;
Node* p = head->next;
if (!head)
{
head = newNode;
}
else
{
while (p->next)
{
p = p->next;
}
p->next = newNode;
newNode->next = NULL;
}
}
void LinkList::InsertAppoint(Type data,int n)
{
Node* newNode = new Node;
newNode->data = data;
if (n > GetLinkListLength())
{
cout << "指定位置超出链表范围" << endl;
}
else
{
int count = 1;
Node* p = head;
while (count < n)
{
p = p->next;
count++;
}
newNode->next = p->next;
p->next = newNode;
}
}
void LinkList::DeleteHead()
{
if (IsEmpty())
{
cout << "链表为空" << endl;
}
else
{
Node* p = head->next;
head->next = p->next;
}
}
void LinkList::DeleteRear()
{
if (IsEmpty())
{
cout << "链表为空" << endl;
}
else
{
Node* p = head;
Node* ptemp = head;
while (p->next)
{
ptemp = p;
p = p->next;
}
ptemp->next = NULL;
}
}
void LinkList::DeleteAppoint(Type data)
{
if (IsEmpty())
{
cout << "链表为空" << endl;
}
else
{
Node* p = head;
Node* ptemp = head;
while (p->data!=data)
{
ptemp = p;
p = p->next;
}
ptemp->next = p->next;
}
}
void LinkList::DeleteAll()
{
if (IsEmpty())
{
cout << "链表为空" << endl;
}
else
{
Node* p = head->next;
Node* ptemp = p;
while (p)
{
ptemp = p;
p = p->next;
head->next = p;
delete ptemp;
}
}
}
Node* LinkList::Find(Type data)
{
Node* p = head;
if (IsEmpty())
{
cout << "链表为空" << endl;
return NULL;
}
int count=0;
while (p->data != data && p->next)
{
p = p->next;
count++;
}
cout << "查找元素在第"<<count<<"个位置" << endl;
cout << "查找元素的值为:" << endl;
return p;
}
void test()
{
LinkList p;
p.CreatLinkList();
if (!p.IsEmpty())
{
p.PrintLinkList();
p.GetLinkListLength();
cout << p.Find(2)->data << endl;
p.PrintLinkList();
int n = 0;
cout << "请输入要头插入的数据:" << endl;
cin >> n;
p.InsertHead(n);
p.PrintLinkList();
int m = 0;
cout << "请输入要尾插入的数据:" << endl;
cin >> m;
p.InsertRear(m);
p.PrintLinkList();
int l = 100000;
p.InsertAppoint(l, 2);
p.PrintLinkList();
}
else
{
cout << "链表为空" << endl;
}
}
int main()
{
test();
return 0;
}