头文件:
#pragma once
#include <iostream>
using namespace std;
template<class Type>
class List;
// 结点类
template<class Type>
class NodeList
{
friend class List<Type>;
public:
NodeList();
NodeList(Type d, NodeList<Type> *n = NULL);
private:
Type data;
NodeList<Type>* next;
};
// 链表类
template<class Type>
class List
{
public:
List();
~List();
public:
void show_list();
void tail_insert(Type const &x);
void head_insert(Type const &x);
void sort();
void head_delete();
void tail_delete();
void val_insert(Type const &x);
NodeList<Type>* find(Type const &x);
void val_delete(Type const &x);
Type length();
void reverse();
void clear();
void destroy();
void quit_system(Type &x);
protected:
NodeList<Type>* BuyNode(Type x = Type())
{
NodeList<Type>* p = new NodeList<Type>(x);
return p;
}
private:
NodeList<Type>* first;
NodeList<Type>* last;
};
// 结点类的构造函数
template<class Type>
NodeList<Type>::NodeList()
{
data = Type();
next = NULL;
}
template<class Type>
NodeList<Type>::NodeList(Type d, NodeList<Type> *n = NULL)
{
data = d;
next = n;
}
// 链表类的构造函数
template<class Type>
List<Type>::List()
{
first = last = BuyNode();
}
// 链表类的析构函数
template<class Type>
List<Type>::~List()
{
destroy();
}
// 显示
template<class Type>
void List<Type>::show_list()
{
NodeList<Type> *p = first->next;
while (p != NULL)
{
cout << p->data << "->";
p = p->next;
}
cout << "NULL" << endl;
}
// 尾插
template<class Type>
void List<Type>::tail_insert(Type const& x)
{
NodeList<Type> *p = BuyNode(x);
last->next = p;
last = p;
first->data++;
}
// 头插
template<class Type>
void List<Type>::head_insert(Type const &x)
{
NodeList<Type> *p = BuyNode(x);
p->next = first->next;
first->next = p;
last = p;
for (int i = 0; i < first->data; ++i)
{
last = last->next;
}
first->data++;
}
// 排序
template<class Type>
void List<Type>::sort()
{
if (first->data == 0)
{
return;
}
if (first->data == 1)
{
show_list();
}
NodeList<Type> *t = first->next;
NodeList<Type> *p = t->next;
NodeList<Type> *q = NULL;
t->next = NULL;
last = t;
first->data = 1;
while (p != NULL)
{
val_insert(p->data);
q = p;
p = p->next;
delete q;
}
}
// 头删
template<class Type>
void List<Type>::head_delete()
{
if (first->data == 0)
{
cout << "the list is empty,cannot delete!" << endl;
return;
}
NodeList<Type> *p = first->next;
first->next = p->next;
if (first->data == 1)
last = first;
delete p;
first->data--;
}
// 尾删
template<class Type>
void List<Type>::tail_delete()
{
if (first->data == 0)
{
cout << "the list is empty,cannot delete!" << endl;
return;
}
NodeList<Type> *s = first;
for (int i = 0; i < first->data - 1; ++i)
{
s = s->next;
}
s->next = NULL;
last = s;
delete s->next;
first->data--;
}
// 按值插入
template<class Type>
void List<Type>::val_insert(Type const &x)
{
if (first->data == 0)
{
tail_insert(x);
return;
}
NodeList<Type> *p = first;
NodeList<Type> *s = BuyNode(x);
while (p->next->data < x && p->next->next != NULL)
{
p = p->next;
}
if (p->next->data>x)
{
s->next = p->next;
p->next = s;
first->data++;
}
else
{
tail_insert(x);
}
}
// 查找
template<class Type>
NodeList<Type>* List<Type>::find(Type const &x)
{
NodeList<Type> *s = first->next;
while (s != NULL)
{
if (s->data == x)
{
return s;
}
s = s->next;
}
return NULL;
}
// 按值删除
template<class Type>
void List<Type>::val_delete(Type const &x)
{
if (first->data == 0)
{
cout << "the list is empty,cannot delete!" << endl;
return;
}
NodeList<Type> *s = find(x);
if (s == NULL)
{
cout << "the number is not exist,can not delete!" << endl;
return;
}
NodeList<Type> *p = first;
while (p->next != s)
{
p = p->next;
}
if (s->next != NULL)
{
p->next = s->next;
first->data--;
delete s;
}
else
{
tail_delete();
}
}
// 求长度
template<class Type>
Type List<Type>::length()
{
return first->data;
}
// 反转
template<class Type>
void List<Type>::reverse()
{
if (first->data == 0)
{
return;
}
if (first->data == 1)
{
show_list();
}
NodeList<Type> *t = first->next;
NodeList<Type> *p =t->next;
NodeList<Type> *q = NULL;
t->next = NULL;
last = t;
first->data = 1;
while (p != NULL)
{
head_insert(p->data);
q = p;
p = p->next;
delete q;
}
}
// 清空
template<class Type>
void List<Type>::clear()
{
if (first->data == 0)
{
return;
}
while (first->next != NULL)
{
tail_delete();
}
}
// 摧毁
template<class Type>
void List<Type>::destroy()
{
clear();
delete first;
}
// 退出系统
template<class Type>
void List<Type>::quit_system(Type &x)
{
x = 0;
}
主函数:
// 用c++实现单链表
#include "List.h"
int main()
{
List<int> mylist;
int input = 1;
int insert;
while (input)
{
cout << "*********************************************************************" << endl;
cout << "* [1] show_list [2] tail_insert *" << endl;
cout << "* [3] head_insert [4] sort *" << endl;
cout << "* [5] head_delete [6] tail_delete *" << endl;
cout << "* [7] val_insert [8] find *" << endl;
cout << "* [9] val_delete [10] length *" << endl;
cout << "* [11] reverse [12] clear *" << endl;
cout << "* [13] destroy [14] quit_system *" << endl;
cout << "*********************************************************************" << endl;
cout << "please choose:";
cin >> input;
switch (input)
{
case 1:
mylist.show_list();
break;
case 2:
cout << "please enter the number want to insert(-1 end):";
while (cin >> insert, insert != -1)
{
mylist.tail_insert(insert);
}
break;
case 3:
cout << "please enter the number want to insert(-1 end):";
while (cin >> insert, insert != -1)
{
mylist.head_insert(insert);
}
break;
case 4:
mylist.sort();
break;
case 5:
mylist.head_delete();
break;
case 6:
mylist.tail_delete();
break;
case 7:
cout << "please enter the number want to insert:";
cin >> insert;
mylist.val_insert(insert);
break;
case 8:
cout << "please enter the number want to find:";
cin >> insert;
if (mylist.find(insert) == NULL)
{
cout << "the number is not exist!" << endl;
}
else
{
cout << "the number at the " << mylist.find(insert) << endl;
}
break;
case 9:
cout << "please enter the number want to delete:";
cin >> insert;
mylist.val_delete(insert);
break;
case 10:
cout << "the length is" << " " << mylist.length() << endl;
break;
case 11:
mylist.reverse();
break;
case 12:
mylist.clear();
break;
case 13:
mylist.destroy();
break;
case 14:
mylist.quit_system(input);
break;
default:
break;
}
}
return 0;
}
清除:
查找:
头删:
头插:
求长度:
退出系统:
反转:
排序:
尾删:
尾插:
按值删除:
按值插入: