单链表的基本操作
#include
//@lining
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)//输入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 << "查找元素在第"<data << endl;
//p.DeleteAll();
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;
}