循环链表类的定义——C++

//循环单链表类的定义
template
struct Node
{
T data;
Node *next;
};

template
class CLinkList
{
private:
Node *Head;
public:
CLinkList() ;//构造函数, 创建空单循环链表
~CLinkList();//析构函数,删除表空间
void CreateList(int n);//创建具有n个元素的单循环链表
void Insert(int i,T e);//在表中第i个位置插入元素
T Delete(int i);//删除表中第i个元素
T GetElem(int i);//获取第i个元素的值
int Locate(T e);//在链表中查找值为e的元素
T prior(T e);//返回元素e的前驱
int Empty();//测表空
int Length();//测表长
//void CLear();//清空表
void ListDisplay();//输出表元素
};
//循环单链表类的实现
template
CLinkList::CLinkList()//构建函数,建一空单循环链表
{

Head=new Node;
Head->next=Head;
}

template
CLinkList::~CLinkList()//析构函数,释放链表所占空间
{
Node *p,*q;
q=Head;
while(q->next!=Head) q=q->next; //定位q到尾结点
while(Head!=Head->next)
{//从头结点开始,依次释放结点
p=Head;
Head=Head->next;
q->next=Head;
delete p;
}
Head=NULL;//头结点指向空
}

template
void CLinkList::CreateList(int n)
{//尾插法(正序)创建具有n个元素的单循环链表
Node *p,*s;//设置工作指针。p指向尾结点
p=Head;
cout<<"请依次输入"<for(int i=1;i<=n;i++)
{
s=new Node;//新建元素结点
cin>>s->data;//输入新建数据元素值
s->next=p->next;//新结点链入表尾
p->next=s;
p=s;
}
}

template
void CLinkList::Insert (int i,T e)
{//在指定位置插入元素

int j=0;
Node *p;
p=Head;//工作指针初始化
while(p->next!=Head&& j{
p=p->next;//
j++;
}
if(p->next==Head||j>i-1) throw"位置异常";//插入位置不合理,i<0或i>表长
else
{
Node *s;
s=new Node;//
s->data=e;//
s->next=p->next;//结点S链接到p结点之后
p->next=s;//
}
}

template
T CLinkList::Delete (int i)
{//删除指定位置元素
T x;
Node *p,*q;//设置工作指针
p=Head;//查找从头结点开始
int j=0;//计数器初始化
while(p->next!=Head && j{
p=p->next;//
j++;
}
if(p->next==Head||j>i-1) throw"位置异常";//删除位置不合理
else //删除位置合理
{
q=p->next;// 暂存删除结点位置
p->next=q->next;//从链表中摘除删除结点
x=q->data;//取删除数据元素的值
delete q;// 释放删除点
return x;//返回删除元素的值
}
}

template
int CLinkList::Locate (T e)
{//按值定位
int j=1;
Node *p;
p=Head->next;
while(p!=Head && p->data!=e)
{
p=p->next;
j++;
}
if(p==Head) return 0;
else return j;
}


template
T CL

inkList::GetElem(int i)
{//获取第i个元素的值
Node *p;//设置工作指针
p=Head->next;//从首结点开始
int j=1;//计数器初始化
while(p!=Head&&j{
p=p->next;j++;
}
if(p==Head||j>i)//定位位置不合理:空表或i小于0或i大于表长
throw "位置不合理";
else //位置合理
return p->data;
}

template
int CLinkList::Empty()
{//测表空
if(Head->next==Head)
return 1;
else
return 0;
}

template
T CLinkList::prior(T e)
{//返回元素前驱
Node *p,*q;
p=Head;q=p->next;
while(q!=Head&&q->data!=e)
{
p=q;q=q->next;
}
if(p==Head) //首元素,其前驱为尾元素????
throw"首元素,无前驱";
else if(q==Head)
throw"元素不存在";
else
return p->data;

}

template
int CLinkList::Length()
{
int len=0;//
Node *p;
p=Head;//指向头结点
while(p->next!=Head)
{
len++;p=p->next;
}
return len;
}//Length

template
void CLinkList::ListDisplay()
{//显示链表
Node *p;
p=Head->next;
int i=1;
while(p!=Head)
{
cout<cout<data<p=p->next;
i++;
}
}



相关主题
相关文档
最新文档