单链表的实现
核心思想:
1.创建一个作为结点的类:ListNode
2.创建一个带有对链表操作的各项功能的类:OneList
结点类的功能:
1.创建一个结点,用来存放一个值和一个指针。
功能类的功能:
1.清空链表 void MakeEmpty();
2.查询数据,返回该数据的结点位置 int Find(Type item);
3.结点插入 bool Insert(Type item, int n);
4.删除结点 bool Remove(int n);
5.输出链表的内容 void Print();
6.返回链表长度 int Length();
头结点的创建:
OneList() :head(new ListNode()), len(0){}
相当于一个没有值的首结点。
结点的插入(包含追加功能):
1.判断增加的位置是否合理
if (n <= 0 || n>len + 1){
cout << "请输入合理的下标位置" << endl;
return 0;
}
2.找到插入位置的前一个结点:
ListNode<Type> *pmove = head; //给头结点赋给一个移动的指针
ListNode<Type> *pnode = new ListNode<Type>(item);
for (int i = 1; i<n&&pmove; i++){
pmove = pmove->next; //指针移动
}
3.增加结点:
//pnode是新结点,pmove是插入位置的前一个结点
pnode->next = pmove->next; //让pnode指向pmove的下一个结点
pmove->next = pnode; //让pmove指向pnode
len++; //单链表长度+1
删除的结点
1.判断删除位置是否合理
if (n <= 0){
cout << "请输入合理的下标位置" << endl;
exit(1);
}
2.找到插入位置的前一个结点:
ListNode<Type> *pmove = head, *pdel; //pel指针是用来指向要删除的那个结点
for (int i = 1; i<n&&pmove->next; i++){
pmove = pmove->next; //指针的移动
}
3.删除结点
pdel = pmove->next;
pmove->next = pdel->next;
delete pdel;
cout << "删除成功第" << n << "个链表结点成功" << endl;
len--;
源代码如下:
#include<iostream>
#include<stdio.h>
#include<ctime>
#include<cmath>
using namespace std;
template<typename Type> class ListNode{
public:
ListNode() :data(0), next(NULL){}
ListNode(const Type item, ListNode<Type> *next = NULL) :data(item), next(next){}
~ListNode(){
next = NULL;
}
public:
Type GetData();
friend ostream & operator<< (ostream &, ListNode<Type>&);
Type data;
ListNode *next;
};
template<typename Type> Type ListNode<Type>::GetData(){
return this->data;
}
template<typename Type> ostream& operator<<(ostream& os, ListNode<Type>& out){
os << out.data;
return os;
}
template<typename Type> class OneList{
public:
OneList() :head(new ListNode<Type>()), len(0){}
~OneList(){
MakeEmpty();
delete head;
}
public:
void MakeEmpty();
int Length();
int Find(Type item);
bool Insert(Type item, int n);
ListNode<Type>* Get(int pos);
bool Remove(int n);
void Rollback(); //对链表的内容进行翻转
void Print();
private:
ListNode<Type> *head; //链表的表头,不存储数据data
int len; //链表的长度
};
template<typename Type> void OneList<Type>::MakeEmpty(){ //清空链表,逐个删除结点,最后的头结点通过析构函数进行删除
ListNode<Type> *pdel;
while (head->next != NULL){
pdel = head->next;
head->next = pdel->next;
delete pdel;
}
}
template<typename Type> int OneList<Type>::Length(){ //返回链表的长度
return len;
}
template<typename Type> int OneList<Type>::Find(Type item){ //在链表中查询数据item,找到则返回相应链表结点的位置,否则返回-1
int pos = 0;
ListNode<Type> *pmove = head;
while (pmove&&pmove->data != item){
pmove = pmove->next;
pos++;
}
if (pmove == NULL) pos = -1;
return pos;
}
/*template<typename Type> ListNode<Type>* OneList<Type>::Get(int n){ //查询链表的第n个链表结点,返回链表结点的指针
if (n <= 0 || n>len){
cout << "请输入合法的数据下标" << endl;
return NULL;
}
ListNode<Type> *pmove = head->next;
int pos = 1;
while (pos != n&&pmove){
pmove = pmove->next;
pos++;
}
return pmove;
}*/
template<typename Type> bool OneList<Type>::Remove(int n){ //删除第n个链表结点
if (n <= 0){
cout << "请输入合理的下标位置" << endl;
exit(1);
}
ListNode<Type> *pmove = head, *pdel;
for (int i = 1; i<n&&pmove->next; i++){
pmove = pmove->next;
}
if (pmove->next == NULL){
cout << "查找到的下标超出链表" << endl;
exit(1);
}
pdel = pmove->next;
pmove->next = pdel->next;
delete pdel;
cout << "删除成功第" << n << "个链表结点成功" << endl;
len--;
return 1;
}
template<typename Type> bool OneList<Type>::Insert(Type item, int n){
if (n <= 0 || n>len + 1){
cout << "请输入合理的下标位置" << endl;
return 0;
}
ListNode<Type> *pmove = head;
ListNode<Type> *pnode = new ListNode<Type>(item);
for (int i = 1; i<n&&pmove; i++){
pmove = pmove->next;
}
pnode->next = pmove->next;
pmove->next = pnode;
len++;
return 1;
}
template<typename Type> void OneList<Type>::Print(){ //输出链表的内容
ListNode<Type> *pmove = head->next;
cout << "head";
while (pmove){
cout << "—>" << pmove->data;
pmove = pmove->next;
}
cout<<endl;
}
/*template<typename Type> void OneList<Type>::Rollback(){ //对链表的内容进行翻转
for (int i = 1; i <= len / 2; i++){
ListNode<Type> *node1 = Get(i);
ListNode<Type> *node2 = Get(len - i + 1);
Type num = node1->data;
node1->data = node2->data;
node2->data = num;
}
cout << "翻转成功" << endl;
}*/
int main(){
cout<<"请输入8个数"<<endl;
int a,b,c,d,e,f,g,h;
cin>>a>>b>>c>>d>>e>>f>>g>>h;
OneList<int> list;
list.Insert(a,1);
list.Insert(b,2);
list.Insert(c,3);
list.Insert(d,4);
list.Insert(e,5);
list.Insert(f,6);
list.Insert(g,7);
list.Insert(h,8);
cout<<"链表如下:"<<endl;
list.Print();
int val,pos;
cout<<"请输入需要插入的元素和位置:"<<endl;
cin>>val>>pos;
list.Insert(val,pos);
list.Print();
int pos1;
cout<<"请输入需要删除的位置:"<<endl;
cin>>pos1;
list.Remove(pos1);
list.Print();
int val1;
cout<<"请输入需要查找的元素:"<<endl;
cin>>val1;
int aa=list.Find(val1);
cout<<"位置为:"<<aa<<endl;
list.Print();
return 0;
}
运行结果如下: