《数据结构》循环链表类的定义参考代码

/****************************/
/*********声明模板类*********/
/****************************/
template<class DateTpe>
struct Node
{
DateType data;
Node<DataType> *next;
};
template<class DataType>
class Circular_LinkList
{
public:
Circular_LinkList();                         //无参构造函数,建立只有头结点的空链表
Circular_LinkList(DataType a[],int n);       //有参构造函数,建立有n个元素的单链表
~Circular_LinkList();                        //析构函数
int Length();                                //求单链表的长度
DataType Get(int i);                         //按位查找。在单链表中查找第i个结点的元素值
int Locate(DataType x);                      //按值查找。在单链表中查找值为x的元素序号
void Insert(int i,DataType x);               //插入操作,在第i个位置插入元素值为x的结点
DataType Delete(int i);                      //删除操作,在单链表中删除第i个结点
void PrintLink();                            //遍历操作,按序号依次输出各元素
private:
Node<DataType> *rear;                        //单链表的尾指针
};
/******************************/
/******定义模板类操作函数******/
/******************************/
template<class DataType>
Circular_LinkList<DataType>::Circular_LinkList();
{
rear=new Node<DataType>;      //生成头结点,头结点也是尾结点
rear->next=rear;              //尾结点的指针域指向自己
}
template<class DataType>
Circular_LinkList<DataType>::Circular_LinkList(DataType a[],int n)
{
Node<DataType> *f,*s;
rear=new Node<DataType>;         //生成头结点
f=rear;                          //头结点指针初始化
for(int i=0;i<n;i++)
{
s=new Node<DataType>; s->data=a[i];      //为每个数组元素建立一个结点
rear->next=s; rear=s;                    //将结点s插入到终端结点之后
}
rear->next=f;      //单链表建立完毕,将终端结点的指针指向头结点
}
template<class DataType>
Circular_LinkList<DataType>::~Circular_LinkLise()   //析构函数,将整个链表删除,这里采用的是正序撤销
{
Node<DataType> *p=rear->next;
while(p!=rear)                 //释放单链表的每一个结点的存储空间
{
Node<DataType> *q=p;       //暂存被释放结点
p=p->next;                 //p指向被释放结点的下一个结点
delete q;
}
delete rear;
}
template<class DataType>
int Circular_LinkList<DataType>::Length()     //求循环链表长度算法
{
p=(rear->next)->next;count=0;     //工作指针p和累加器count初始化
while(p!=rear)
{
p=p->next;
count++;
}
return count;
}
template<class DataType>
DataType LinkList<DataType>::Get(int i)
{
p=(rear->next;count=1;
while(p!=NULL && count<i)
{
p=p->next;       //工作指针p后移
count++;
}
if(p==NULL) throw"位置";
else return p->data;
}
template<class DataType>
int LinkList<DataType>::Locate(DatType x)
{
p=(rear->next)->next;count=1;
while(p!=NULL)
{
if(p->data==x) return count;     //查找成功,结束函数并返回序号
p=p->next;
count++;
}
return 0;
}
template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
p=rear->next;count=0;           //工作指针p指向头结点
while(p!=NULL && count<i-1)     //查找第i-1个结点
{
p=p->next;                  //工作指针p后移
count++;
}
if(p==NULL) throw"位置";        //没有找到第i-1个结点
else{
s=new Node;s->data=x;       //申请一个结点s,其数据域为x
s->next=p->next;p->next=s;      //将结点s插入到结点p之后
}
}
template<class DataType>
DataType LinkList<DataType>::Delete(int i)
{
p=rear->next;count=0;          //工作指针p指向头结点
while(p!=NULL && count<i-1)    //查找第i-1个结点
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL)     //结点p不存在或p的后继结点不存在
throw"位置";
else{
q=p->next;x=q->data;       //暂存被删结点
p->next=q->next;           //摘链
delete q;
return x;
}
}
template<class DataType>
void Circular_LinkList<DataType>::PrintList()
{
p=(rear->next)->next;       //工作指针初始化
while(p!=rear)
{
cout<<p->date;
p=p->next;              //工作指针p后移
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值