循环链表
循环单链表
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;//头结点next指向头结点
return true;
}
//判断循环单链表是否为空
bool 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指向表尾结点;表尾结点的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;//头结点的prior指向头结点
L->next = L;//头结点的next指向头结点
return true;
}
//判断循环双链表是否为空
bool 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;
}
}
总结:
循环当链表
- 空表
- 非空表
循环双链表
- 空表
- 非空表
代码问题
- 如何判空
- 如何判断结点是否为表尾、表头结点
- 如何在表头、表中、表尾插入/删除一个结点