用C++编写单链表

单链表的实现

核心思想:
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;
}

运行结果如下:
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值