C++数据结构--单向循环链表(实现头插法,尾插法)

单向循环链表核心代码图解:


*插入到非空链表的表尾



*删除非空链表元素








实现代码:并未包括异常类处理

template<typename T>
class sinCirLink
{
private:
class node
//节点类型 
{
public:

node():val(T()),next(nullptr){}
node(T v):val(v),next(nullptr){}
node(T v,node* pt):val(v),next(pt){}
T val;  //存储数据 
node *next; //保存下一节点的指针 
};
node *front; //保存表头指针 
node *back;  //保存表尾指针

void findPointer(node *&p,int pos) //在链表寻找pos位置的指针的工具函数,pos从0开始 
{
node* tem=front->next; //指向链表的第一个节点 
for(int i=0;i<pos;i++)
{
tem=tem->next; 
}
p=tem;

public:
sinCirLink() //构建只有一个头节点的空链表
{
front=back=new node;
back->next=front;
front->next=back; 


void push_back(T val) //尾插法 
{
if(front==back) //处理空链表的情况 
{
node *tem=new node(val,front); //令新节点的next指向头节点 

front->next=tem;//更新头指针的next
back=tem; //更新尾指针 

}
else   //处理非空链表的情况 
{
node *tem=new node(val,front);
back->next=tem;
back=tem; //更新尾指针 

}
 
}

void push_front(T val)
{
if(front==back) //处理空链表的情况 
{
node *tem=new node(val,front); //令新节点的next指向头节点 
front->next=tem;//更新头指针的next
back=tem; //更新尾指针 

}
else   //处理非空链表的情况 
{
node *tem=new node(val,front->next);//令新节点的next指向指向的节点 
front->next=tem; //更新front的next节点 

}


void  insert(int pos,T val) //在pos位置(下标从0开始)插入val 
{
node* des=new node(val);
node* pre;  //插入目标的前一节点 
if(pos==0)
{
push_front(val);
}
else
{
findPointer(pre,pos-1);
des->next=pre->next;
pre->next=des;

}




    void erase(int pos) //在pos位置(下标从0开始)删除节点
{


if(pos==0)
{
  node* tem=front->next;
  front->next=tem->next;
  delete tem;
}
else
{
node* pre;
node* tem;
findPointer(pre,pos-1) ;
tem=pre->next;
pre->next=tem->next;
delete tem;

}

}

void toString() //打印循环链表 
{
node* tem=front->next;
while(tem!=front) 
{
cout<<tem->val<<ends;
tem=tem->next;
}

   

};




int main()
{
sinCirLink<int> scl;
scl.push_back(3);
scl.push_back(4);
scl.push_front(2);
scl.insert(0,1);
scl.insert(4,5);
scl.toString(); //1 2 3 4 5
cout<<endl;
scl.erase(1);
scl.erase(3);
scl.erase(0);
scl.toString();// 3 4
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值