1.为什么引用循环链表?
单链表中我们是把结点遍历一遍后就结束了,使表处理更加灵活,通过任意一个结点出发都可以找到链表中的其它结点,因此引用循环链表
2.啥是循环链表?
首尾相连构成一个环的链表
/* 循环单链表 可从一个结点找到任何一个节点 */
typedef struct LNode //定义单链表结点类型
{
ElemType data; //存放数据
struct LNode *next; //指向下一结点
}LNode, *linklist;
//初始化一个循环单链表
bool initlist(linklist &L)
{
L = (LNode *) malloc(sizeof(LNode)); //分配一个头结点
if(L==null) //内存不足,分配失败
return false;
L->next=L; //头结点指向头结点
return true;
}
//判断循环单链表是否为空
b00l empty(linklist L)
{
if(L->next == L)
return true;
else
return false;
}
//判断结点P是否为为节点
bool istail(linklist L,LNode *P)
{
if(p->next==L)
return true;
else
return false;
}
/* 循环双链表 头prior指向null 尾next指向头 */
typedef struct dnode
{
ElemType data;
struct dnode *prior,*next;
}dnode,*Dlinklist;
//初始化空的循环双链表
bool initDlinklist(Dlinklist &L)
{
L = (dnode *) malloc(sizeof(dnode)); //分配一个头结点
if(L==null)
return false;
L->prior=L; //头结点的前驱指向头结点
L->next=L; //头结点的后继指向头结点
}
//判断循环双链表是否为空
b00l empty(linklist L)
{
if(L->next == L)
return true;
else
return false;
}
//判断结点P是否为尾节点
bool istail(linklist L,LNode *P)
{
if(p->next==L)
return true;
else
return false;
}
//插入p节点之后s
bool Insertnext(dnode *p,dnode *s)
{
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
}
//删除p节点的后继节点 q;
bool delete(dnode *p,dnode *q)
{
p->next=q->next;
q->next->prior=p;
free(q);
}